0

独自のコンストラクターをコーディングした Form があります。

constructor Create(AOwner: TComponent; AParent: TWinControl; ASender: TMyClass;
   ATab: String); reintroduce; overload;

このようなフォームを作成するには、次を使用します。

try
  MyForm := TMyClassForm.Create(nil, Self.Parent, Self as TMyClass, 'FirstTab');
  MyForm.ShowModal;
finally
  MyForm.Free;
end;

別の場所で、手順を開始する前に、このフォームが開かれているかどうかを確認する必要があるため、次の方法でその存在を確認します。

if (Assigned(MyForm)) and (MyForm.Active) and (MyForm.Showing) then
  // Don't do the procedure
else
  // Do the procedure

ここで、フォームを開いて閉じ、この条件ステートメントを確認すると、true になるたびにフォームが開かれず、表示されなくなります。これは、作成後にフォームを解放したためです。

何が問題になる可能性がありますか?

4

2 に答える 2

5

グローバル メソッドを呼び出しFreeましたMyFormが、参照を変更していません。したがって、MyForm現在も破壊されたフォームを指します。したがってAssigned(MyForm)、 として評価されTrue、他の 2 つのテストは古いオブジェクト参照で動作します。古いオブジェクト参照を操作すると、何かが起こる可能性があります。あなたが試した状況では、両方の操作が返されるようですTrue。しかし、別の機会にアクセス違反が発生する可能性があります。

MyForm変数をnilafter callに設定する必要がありますFree。私たちの時代の偉大な宗教デルファイ戦争を再開する危険を冒してFreeAndNil(MyForm)MyForm.Free.

ここでの私の答えは参考になるかもしれません:ものを使用または解放する前に「if Assigned()」を使用しないのはなぜですか?

于 2013-08-05T14:13:16.803 に答える
1
  1. 初期化: MyForm := nil;

  2. ユーザー FreeAndNil(MyForm)

  3. if (Assigned(MyForm)) then 手続きを行わ
    ない
    else
    手続きを行う

于 2013-08-06T18:17:38.920 に答える