我在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 举报,一经查实,本站将立刻删除。