加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 打开备忘录中的任何文件?

发布时间:2020-12-15 04:00:45 所属栏目:大数据 来源:网络整理
导读:在记事本中,您可以打开任何文件,它将显示内部的原始数据. 我想在TMemo中这样做,但一直在努力寻找如何做到这一点. 我设法找到了这个code here. 我将其修改为一个函数,并为了我的目的略微改变它: function OpenBinaryFile(var Data; Count: Cardinal): string
在记事本中,您可以打开任何文件,它将显示内部的原始数据.

我想在TMemo中这样做,但一直在努力寻找如何做到这一点.

我设法找到了这个code here.

我将其修改为一个函数,并为了我的目的略微改变它:

function OpenBinaryFile(var Data; Count: Cardinal): string;
var
  Line: string[80];
  i: Cardinal;
  P: PAnsiChar;
  nStr: string[4];
  SL: TStringList;
const
  posStart = 1;
  binStart = 7;
  ascStart = 57;
begin
  P := @Data;
  Line := '';

  SL := TStringList.Create;
  try
    for i := 0 to Count - 1 do
    begin
      if (i mod 16) = 0 then
      begin
        if Length(Line) > 0 then
          SL.Add(Trim(Line));

        FillChar(Line,SizeOf(Line),' ');
        Line[0] := Chr(72);
      end;

    if P[i] >= ' ' then
      Line[i mod 16 + ascStart] := P[i]
    else
      Line[i mod 16 + ascStart] := '.';
    end;

    SL.Add(Trim(Line));

    Result := SL.Text;
 finally
    SL.Free;
  end;
end;

它有效,但它每行只显示固定数量的字符,如下所示:

我需要更改什么才能以记事本的方式填写所有备忘录?

解决方法

好吧,这是if(i mod 16)= 0测试,它将行截断为16个字符.

我相信Notepad和这段代码一样:

var
  i: Integer;
  s: AnsiString;
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName,fmOpenRead);
  try
    SetLength(s,Stream.Size);
    if Stream.Size>0 then
      Stream.ReadBuffer(s[1],Stream.Size);
  finally
    Stream.Free;
  end;
  for i := 1 to Length(s) do
    if s[i]=#0 then
      s[i] := ' ';
  Memo1.Text := s;
end;

如果要用’.’替换不可打印的字符然后您可以通过修改上面的代码轻松地这样做:

if s[i]<#32 then
  s[i] := '.';

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读