delphi - TMemo 中的单词 block

标签 delphi delphi-xe

我正在尝试用 TMemo 制作一个基本的十六进制查看器,我知道这可能并不理想,但只有我个人使用它,所以这并不重要。

(1)

首先,假设备忘录中充满了十六进制信息,如下所示:

enter image description here

如何获得显示的所有文本 block 的计数,忽略空白?因此,使用图像,本例中的结果将为 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)

如果我单击“备忘录”并且光标下方有一个文本 block ,我如何知道所选 block 是所有其他 block 中的哪个数字?

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

这应该很容易,但我无法清晰地思考,我还没有正确的编程思维,所以在基本逻辑和解决问题上真的很困难!

(3)

最后,我想通过传递 block 编号值在运行时选择一个 block 。我尝试过但没有成功:

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;

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

(2)

简单地替换

for i := 1 to Length(txt) do

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

关于delphi - TMemo 中的单词 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9626517/

相关文章:

delphi - 加载 SSL 模块失败。一个或多个映射方法不可用

multithreading - 单独线程中的数据库连接 - 最好的方法是什么?

delphi - 了解 Delphi 和 C++ Builder 中的 TBitmap.Scanline

delphi - 如何控制我的 Win32 服务,即更改其自定义参数、调度等?

delphi - 我需要在 Delphi 中使用子字符串分隔符从 TStringStream 解析字符串?

delphi - delphi中有一个UIntToStr可以让你显示UINT64值,但是StrToUInt在哪里允许用户输入64位无符号值呢?

delphi - 对象和引用有什么区别?

delphi - 在 Delphi XE 或 Delphi XE2 中使用单元 HtmlHelpViewer 时,使用 regsvr32.exe 的 DLL 注册卡住

delphi - 自定义绘制 TAction 下拉菜单

delphi - 了解共享内存