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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |