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