1

Delphi 2010 では... フォームがあります。フォームの左側に Treeview があります。マルチレベルの階層を示しています。タイプ A、B、C、D、E の 5 種類のデータがあるとします。フォームの右側には、TFrame を作成するパネルがあります。Treeview でタイプ「A」のデータ要素をクリックすると、フォームの右側に TFrame が作成され、tFrame「A」が表示されます。基本的に、TreeView のさまざまな階層の詳細を表示しています。5 種類のデータはそれぞれ、異なる種類の TFrame を使用します。TFrame を動的に作成することはできますが、TFrame を削除/解放する場所と方法を理解するのが困難ですか?

前の TFrame の TYPE を示す変数を作成する必要がありますか? TFrame を削除する適切な方法は何ですか? TFrame.Free と一緒ですか?フレーム A の作成、フレーム A のフリー、フレーム B の作成、フレーム B のフリー、フレーム A の作成 (再び) などが必要になる場合があることを覚えておいてください。

私は...の線に沿って何かを試しました...

if Assigned (TFrameA), then TFrameA.free; 

これは機能しているように見えますが、奇妙な動作を引き起こします (ボタンが消えてしまいます)。また、5 種類の TFrame をすべてグローバル変数として定義する必要があることも意味します。

ありとあらゆる考えに感謝します。

ありがとう、

GS

4

2 に答える 2

6

TFrame現在表示されているフレームが何であるかがわかるように、変数を保持します。別のフレームを表示するときは、まず現在のフレームを解放/キャッシュできます。

フレームをキャッシュする場合は、TFrameページ タイプごとに 1 つずつ、5 つの個別の変数を保持します。ページを表示する必要がある場合は、まだ作成していない場合にのみ作成してください。

private
  CurrentFrame: TFrame;
  Frames: array[0..4] of TFrame;

procedure TMyForm.TreeView1Change(Sender: TObject);
begin
  if CurrentFrame <> nil then
  begin
    CurrentFrame.Parent := nil;
    CurrentFrame := nil;
  end;

  if Frames[OneOfTheIndexes] = nil then
    Frames[OneOfTheIndexes] := TAppropriateFrameType.Create(Self);

  Frames[OneOfTheIndexes].Parent := Panel1;
  CurrentFrame := Frames[OneOfTheIndexes];
end;

代わりにフレームを再作成する場合は、配列とFree()現在のフレームを削除してから、新しいフレームを表示します。

private
  CurrentFrame: TFrame;

procedure TMyForm.TreeView1Change(Sender: TObject);
begin
  if CurrentFrame <> nil then
    FreeAndNil(CurrentFrame);

  CurrentFrame := TAppropriateFrameType.Create(Self);
  CurrentFrame.Parent := Panel1;
end;
于 2013-08-20T00:55:43.090 に答える
2

UI とデータの設定によっては、フォーム内のアクティブなフレームへの参照を保持し、新しいフレームを作成する前にそれを解放するだけで済みます。

デストラクタは動的であるため、フレームを解放する前にフレームの種類を追跡する必要はありませんが、他の考慮事項により、 is または as キーワードを使用してクラス タイプを確認する必要がある場合があります。

于 2013-08-20T00:52:55.840 に答える