Delphi 在滚动框中加载大量数据背后的想法是什么?
我正在使用Delphi XE3,并试图创建一个与outlook类型相同的按摩应用程序,但当我尝试加载包含2000条记录数据的Tscroll框时,速度太慢了 outlook scrolbox如何能够在滚动时保存如此多的数据而不会变慢或闪烁 这是我在下面的代码,用于在滚动框中填充稍后将包含信息的面板Delphi 在滚动框中加载大量数据背后的想法是什么?,delphi,indy,delphi-xe3,tscrollbox,Delphi,Indy,Delphi Xe3,Tscrollbox,我正在使用Delphi XE3,并试图创建一个与outlook类型相同的按摩应用程序,但当我尝试加载包含2000条记录数据的Tscroll框时,速度太慢了 outlook scrolbox如何能够在滚动时保存如此多的数据而不会变慢或闪烁 这是我在下面的代码,用于在滚动框中填充稍后将包含信息的面板 procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent); var i: integer; Pnl : TPanel; be
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;
您正在为内容使用窗口控件(
TPanel
)。创建的实例越多,分配和管理的操作系统资源就越多,时间越慢。要避免所有这些开销,请改用图形控件,例如TLabel
,或者甚至创建您自己从TGraphicControl
派生的组件
或者,您可以切换到另一个窗口控件,该控件设计用于显示大量数据,例如在虚拟模式下运行的TListView
或TListBox
。这样您就不再需要TScrollBox
顺便说一句,TIdThreadComponent.OnRun
事件处理程序在工作线程的上下文中运行,而不是在主线程中运行。您显示的代码不是线程安全的。需要通过TThread.Synchronize()
、TIdSync
或任何其他线程间同步机制在主线程的上下文中执行TPanel
代码。在这种情况下,您显示的TIdThreadComponent
代码作为线程将变得无用,可以用简单的计时器或自定义窗口消息代替