微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 使用大量线路时,TMemo非常慢

我在TMemo中有100000行.我想做的事情如下:

for i:= 0 to Memo.Lines.Count-1 do
  Memo.Lines[i]:= SomeTrim(Memo.Lines[i]);

但速度是每秒0.5线!!

添加BeginUpdate / EndUpdate后,我没有看到任何速度提升.

Memo.Lines.BeginUpdate;
 for i:= 0 to Memo.Lines.Count-1 do
  Memo.Lines[i]:= SomeTrim(Memo.Lines[i]);
 Memo.Lines.EndUpdate;

我的问题是为什么BeginUpdate / EndUpdate无济于事?

解决方法

TStrings.BeginUpdate / EndUpdate将仅禁止OnChanging和OnChanged事件.它对内容本身更改的内部处理没有影响.

TMemo.Lines由TMemoStrings实现,它将文本内容存储在Window控件本身中.因此,BeginUpdate / EndUpdate在这里毫无用处.

通过使用本地TStringList实例,并使用Text属性将数据从TMemo复制到TStringList并返回,可能会获得更好的结果. Text属性是一次访问TMemo的整个内容的最有效方式.

lst := TStringList.Create;
  try
    lst.Text := Memo1.Lines.Text;
    for I := 0 to lst.Count - 1 do begin
      lst[I] := SomeTrim(lst[I]);
    end;
    Memo1.Lines.Text := lst.Text;
  finally
    lst.Free;
  end;

注意:有些注释提到在从Memo复制内容时使用Assign而不是Text属性:由于TMemoLines的Text属性的内部优化,在这种情况下,Assign明显变慢.此属性的Getter和Setter使用单个WM_GETTEXT / WM_SETTEXT消息直接访问Windows控件,而Assign每行使用一个EM_GETLINE消息进行读取,每行使用EM_LINEINDEX,EM_SETSEL,EM_LINELENGTH和EM_REPLACESEL序列进行写入.一个简单的计时测试表明,上面的代码需要大约600毫秒,而用分配调用替换文本分配需要超过11秒!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐