2011-09-14 11 views
5

私はDelphi 7を使用してアプリケーションを構築しています。メインフォームにボタンを1つ追加しました。そのボタンで「別のフォームを表示したい」をクリックします。ユーザーが最初にそのボタンをクリックした場合にのみ、2番目のフォームを作成しようとしています。ユーザーがそのボタンを2回クリックすると、既に作成されたフォームが表示されます。 Formオブジェクトには、すでに作成されているかどうかを直接確認できるプロパティがありますか?オブジェクトがデルファイで作成されているかどうかをチェック

答えて

10
if Assigned(Form1) then 
begin 
    //form is created 
end; 

しかし、あなたのフォームをローカルに グローバル 宣言されている場合、あなたはそれがnilに初期化されていることを確認する必要があります。

4

フォームへの参照を保持するには、メンバーフィールドが必要です。次に、その参照が割り当てられているかどうかを確認します。このように:

function TMainForm.GetOtherForm: TMyForm; 
begin 
    if not Assigned(FOtherForm) then 
    FOtherForm := TMyForm.Create(Self); 
    Result := FOtherForm; 
end; 
+2

(。私はちょうど私と同じ回答を削除)しかし、それはTOtherForm置くように、TOtherFormを破壊するとnilに戻って、変数をリセットしてください追加する必要があります:= nilを 別のオプションは、次のPROCを使用することですTOtherFormのOnDestroyについて –

+0

@ハサン他のフォームが削除された場合。私の印象は、いったん作成されると永遠に生き続ける形になることを意味していました。 –

+0

正確には、しかし、単に安心して、フォームが将来(明示的に、または何らかの理由で)処分されるシナリオを予測することができます - したがって、新しいバグは導入されません。 –

2

割り当て済み(Obj)は、 "Obj.free"を使用しても、それを解放した後でも依然Trueを返すことができます。 あなたのobjを保証する最善の方法は自由です。割り当て済み(obj)は "FreeAndNil(Obj)"を使用しています

0

時々フォームは無料ですが、 このような場合、Assignedのチェックはあまり良くありません。 フォームを解放し、OnCloseフォームでMyForm:= nilを設定する方法もあります。

function TMyForm.IsFormCreated: bool; 
var i: Integer; 
begin 
    Result := False; 
    for i := 0 to Screen.FormCount - 1 do 
    begin 
    if Screen.Forms[i] is TMyForm then 
    begin 
     Result := True; 
     Break; 
    end; 
    end; 
end; 
関連する問題