在Scroll Box中加载大量数据背后的想法是什么?

时间:2013-05-17 11:18:32

标签: delphi indy delphi-xe3 tscrollbox

我正在使用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;

1 个答案:

答案 0 :(得分:2)

您正在为内容使用窗口控件(TPanel)。您创建的实例越多,分配和管理的OS资源就越多,并且随着时间的推移会越慢。为了避免所有这些开销,请使用图形控件,例如TLabel,或者甚至创建从TGraphicControl派生的自己的组件。

或者,您可以切换到另一个用于显示大量数据的窗口控件,例如在虚拟模式下运行的TListViewTListBox。那你就不再需要TScrollBox了。

BTW,TIdThreadComponent.OnRun事件处理程序在工作线程的上下文中运行,而不是主线程。您显示的代码不是线程安全的。 TPanel代码需要通过TThread.Synchronize()TIdSync或任何其他线程间同步机制在主线程的上下文中执行。在这种情况下,您显示的TIdThreadComponent代码作为一个线程变得毫无用处,可以用简单的计时器或自定义窗口消息代替。