Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在滚动框中加载大量数据背后的想法是什么?_Delphi_Indy_Delphi Xe3_Tscrollbox - Fatal编程技术网

Delphi 在滚动框中加载大量数据背后的想法是什么?

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

我正在使用Delphi XE3,并试图创建一个与outlook类型相同的按摩应用程序,但当我尝试加载包含2000条记录数据的Tscroll框时,速度太慢了

outlook scrolbox如何能够在滚动时保存如此多的数据而不会变慢或闪烁

这是我在下面的代码,用于在滚动框中填充稍后将包含信息的面板

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
代码作为线程将变得无用,可以用简单的计时器或自定义窗口消息代替