1

TScrollBox内の多数のフレーム(通常は25)で構成されるインターフェイスに問題があります。

2つの問題があり、一方が他方の結果であることを願っています...

バックグラウンド:

アプリケーションが起動すると、25個のフレームを作成します。各フレームには約 20個のコントロール。これらのコントロールには、デフォルトの情報が入力されます。次に、ユーザーはコントロールをクリックして、検索を情報のサブセットに制限し、その時点でフレームを解放して再作成できます(検索で25レコード未満が返される場合があるため)

問題:

最初の検索後にアプリケーションを終了すると、約1時間かかります。Delphiに戻るまで5秒。2回目の検索(およびフレームの破棄/再作成)の後、約1時間かかります。20秒)

フレームを1回だけ作成するようにアプリケーションを書き直すことはできましたが、何が起こっているのかを理解したいと思います。

これが私の作成ルーチンです:

procedure TMF.CreateFrame(i: Integer; var FrameBottom: Integer);
var
   NewFrame: TSF;
begin
   NewFrame := TSF.Create(Self);
   NewFrame.Name := 'SF' + IntToStr(i);
   if i = 0 then
      NewSF.Top := 8
   else
      NewSF.Top := FrameBottom + 8;
   FrameBottom := NewFrame.Top + NewFrame.Height;
   NewFrame.Parent := ScrollBox1;
   FrameList.Add(NewFrame);
end;

そして、これが私の削除ルーチンです:

procedure TMF.ClearFrames;
var
   i: Integer;
   SF: TSF;
begin
   for i := 0 to MF.FrameList.Count -1  do
   begin
      SF := FrameList[i];
      SF.Free;
   end;
   FrameList.Clear;
end;

私は何が欠けていますか?

4

2 に答える 2

1

アプリが何かをするのに非常に時間がかかる理由を知りたい場合は、プロファイリングしてみてください。プログラムに対してSamplingProfilerを実行してみてください。ヘルプファイルでは、プロファイリングをアプリの特定のセクションのみに制限する方法について説明しています。このセクションを使用して、パーツのクリアまたは作成に関するサンプリング結果のみを取得できます。これにより、実際にほとんどの時間を費やしている場所がわかり、当て推量の多くを取り除くことができます。

于 2011-01-10T17:49:52.667 に答える
1

作成するフレームのメモリ割り当てを自由に制御するため、作成コンストラクターで所有者パラメーターとしてSelfを指定する必要はありません。代わりにnilを渡して、所有者がフレームを解放しようとするのを防ぎます。

また、ClearFramesルーチンの外観は気に入らないでください。代わりにこれを試してください:

while FrameList.count > 0 do
begin
    TSF(Framelist[0]).free;
    Framelist.delete(0);
end;
Framelist.clear;
于 2011-01-10T18:34:34.440 に答える