0

私は Delphi XE3 を使用しており、outlook タイプと同じマッサージ アプリケーションを作成しようとしていますが、Tscroll ボックスに 2000 レコード程度のデータをロードしようとすると、非常に遅くなります。

スクロール時に速度が遅くなったりちらついたりすることなく、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;
4

1 に答える 1

2

コンテンツにウィンドウ コントロール ( TPanel) を使用しています。作成するインスタンスが多いほど、より多くの OS リソースが割り当てられて管理され、時間の経過とともに速度が低下します。そのオーバーヘッドをすべて回避するには、代わりに などのグラフィカル コントロールを使用するか、TLabelまたは から派生した独自のコンポーネントを作成しますTGraphicControl

TListViewまたは、大量のデータを表示するように設計された別のウィンドウ コントロールに切り替えることもできTListBoxます。その後、もう必要ありTScrollBoxません。

ところで、TIdThreadComponent.OnRunイベント ハンドラーは、メイン スレッドではなく、ワーカー スレッドのコンテキストで実行されます。あなたが示したコードはスレッドセーフではありません。コードは、 、、またはその他のスレッド間同期メカニズムTPanelを介して、メイン スレッドのコンテキストで実行する必要があります。その場合、あなたが示したコードはスレッドとして役に立たなくなり、代わりに単純なタイマーまたはカスタム ウィンドウ メッセージに置き換えることができます。TThread.Synchronize()TIdSyncTIdThreadComponent

于 2013-05-17T16:22:42.523 に答える