我试图用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;
Run Code Online (Sandbox Code Playgroud)
这是我用来在备忘录中显示十六进制值的代码:
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;
Run Code Online (Sandbox Code Playgroud)
(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;
Run Code Online (Sandbox Code Playgroud)
(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;
Run Code Online (Sandbox Code Playgroud)
但是,如果有关备忘录内容的更详细信息可用,则可以对其进行优化.例如,如果您知道每行包含四个块,那么块的数量就是简单的4*Memo1.Lines.Count
.我上面的代码甚至会接受不同宽度的块.
(2)
只需更换
for i := 1 to Length(txt) do
Run Code Online (Sandbox Code Playgroud)
通过
for i := 1 to Memo1.SelStart + 1 do
Run Code Online (Sandbox Code Playgroud)