我正在尝试使用TMemo创建一个基本的十六进制查看器,我知道这可能不是最理想的选择,但只有我个人使用所以并不重要。
首先,假设Memo中填写了十六进制信息,如下所示:
如何获取所有文本块的数量,忽略空白?因此,在此图像中的结果将为28。
这是我尝试的方法,但我知道这完全是错误的,因为我正在访问Memo行,但我不知道如何访问每个字符。
我似乎无法解决这个简单的问题:(
以下是我用来在 Memo 中显示十六进制值的代码:
(2)
首先,假设Memo中填写了十六进制信息,如下所示:
如何获取所有文本块的数量,忽略空白?因此,在此图像中的结果将为28。
这是我尝试的方法,但我知道这完全是错误的,因为我正在访问Memo行,但我不知道如何访问每个字符。
我似乎无法解决这个简单的问题:(
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;
以下是我用来在 Memo 中显示十六进制值的代码:
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;
uses
子句中添加Character
。 - Andreas Rejbrand