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

delphi – TMemo中的字块

发布时间:2020-12-15 09:22:56 所属栏目:大数据 来源:网络整理
导读:我试图用TMemo制作一个基本的Hex查看器,我知道这可能并不理想,但只有我亲自使用它才能真正重要. (1) 首先,假设一个备忘录填充了Hex信息,如下所示: 如何计算显示的所有文本块,忽略空格?因此,使用图像,在这种情况下的结果将是28. 这是我尝试过的,我知道这是
我试图用TMemo制作一个基本的Hex查看器,我知道这可能并不理想,但只有我亲自使用它才能真正重要.

(1)

首先,假设一个备忘录填充了Hex信息,如下所示:

如何计算显示的所有文本块,忽略空格?因此,使用图像,在这种情况下的结果将是28.

这是我尝试过的,我知道这是完全错误的,因为我正在访问备注行,但我不知道如何访问每个字符.

我似乎无法解决这个简单的问题:(

function CountWordBlocks(Memo: TMemo): Integer;
var
  i: Integer;
  vCount: Integer;
begin
  for i := 0 to Memo.Lines.Count - 1 do
  begin
    if Length(Memo.Lines.Strings[i]) = 2 then
    begin
      Inc(vCount);
    end;
  end;

  Result := vCount;
end;

这是我用来在备忘录中显示十六进制值的代码:

procedure ReadFileAsHex(const AFileName: string; ADestination: TStrings);
var
  fs: TFileStream;
  buff: Byte;
  linecount: Byte;
  line: string;
begin
  linecount := 0;
  line := '';
  fs := TFileStream.Create(AFileName,fmOpenRead);

  try
    ADestination.BeginUpdate;
    try
      while fs.Position < fs.Size do
      begin
        fs.Read(buff,1);
        line := line + IntToHex(buff,2) + ' ';
        Inc(linecount);
        if linecount = 16 then
        begin
          ADestination.Add(line);
          line := '';
          linecount := 0;
        end;
      end;
      if Length(line) <> 0 then
        ADestination.Add(line);
    finally
      ADestination.EndUpdate;
    end;
  finally
    fs.Free;
  end;
end;

(2)

如果我点击备忘录并且光标下有一个文本块,我怎么知道所选块的哪个号码超出了所有其他块?

因此,使用相同的第一个图像,插入符号位于68旁边的顶行,因此结果将是3,因为它是28中的第三个文本块.

这应该是如此简单,但我无法清楚地思考,我没有正确的编程思想,所以真的很难与基本逻辑和解决问题!

(3)

最后,我想通过传递一个块编号值在运行时选择一个块.我尝试了这个没有太大的成功:

procedure FindBlock(Memo: TMemo; BlockNumber: Integer);
var
  i: Integer;
  txt: string;
  ThisWhite,PrevWhite: boolean;
  vRead: Integer;
begin
  txt := Memo.Text;
  vRead:= 0;
  PrevWhite := True;
  for i := 1 to Length(txt) do
  begin
    ThisWhite := Character.IsWhiteSpace(txt[i]);
    if PrevWhite and not ThisWhite then
    begin
      Inc(vRead);
      PrevWhite := False;
    end;
    PrevWhite := ThisWhite;

    if vRead = BlockNumber then
    begin
      Memo.SelStart := vRead;
      Memo.SetFocus;
      Exit;
    end;
  end;
end;

解决方法

(1)

这有效:

function TForm1.CountBlocks: integer;
var
  i: Integer;
  txt: string;
  ThisWhite,PrevWhite: boolean;
begin
  txt := Memo1.Text;
  result:= 0;
  PrevWhite := true;
  for i := 1 to Length(txt) do
  begin
    ThisWhite := Character.IsWhiteSpace(txt[i]);
    if PrevWhite and not ThisWhite then
    begin
      inc(result);
      PrevWhite := false;
    end;
    PrevWhite := ThisWhite;
  end;
end;

但是,如果有关备忘录内容的更详细信息可用,则可以对其进行优化.例如,如果您知道每行包含四个块,那么块的数量就是4 * Memo1.Lines.Count.我上面的代码甚至会接受不同宽度的块.

(2)

只需更换

for i := 1 to Length(txt) do

通过

for i := 1 to Memo1.SelStart + 1 do

(编辑:李大同)

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

    推荐文章
      热点阅读