gpt4 book ai didi

delphi - TMemo 中的单词 block

转载 作者:行者123 更新时间:2023-12-03 15:22:31 26 4
gpt4 key购买 nike

我正在尝试用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com