我正在使用Delphi XE3,尝试创建一个与outlook类型相同的按摩应用程序,但是当我尝试加载带有大约2000条记录数据的Tscroll框时,它变得非常慢!
在滚动时,Outlook滚动框如何保存那么多数据而不会变慢或闪烁?
这是我的代码,用滚动框填充以后将包含信息的面板。
procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
var i: integer;
Pnl : TPanel;
begin
for i := 1 to 2000 do
begin
Pnl := TPanel.Create(Self);
Pnl.Align := alTop;
Pnl.parent := scrollbox1;
Pnl.Caption := inttostr(i);
end;
IdThreadComponent1.Active := false;
end;
答案 0 :(得分:2)
您正在为内容使用窗口控件(TPanel
)。您创建的实例越多,分配和管理的OS资源就越多,并且随着时间的推移会越慢。为了避免所有这些开销,请使用图形控件,例如TLabel
,或者甚至创建从TGraphicControl
派生的自己的组件。
或者,您可以切换到另一个用于显示大量数据的窗口控件,例如在虚拟模式下运行的TListView
或TListBox
。那你就不再需要TScrollBox
了。
BTW,TIdThreadComponent.OnRun
事件处理程序在工作线程的上下文中运行,而不是主线程。您显示的代码不是线程安全的。 TPanel
代码需要通过TThread.Synchronize()
,TIdSync
或任何其他线程间同步机制在主线程的上下文中执行。在这种情况下,您显示的TIdThreadComponent
代码作为一个线程变得毫无用处,可以用简单的计时器或自定义窗口消息代替。