2011-12-13 4 views

答えて

6
procedure Test(AMyFormClass: TFormClass); 
var 
form: TForm; 
begin 
    form := AMyFormClass.Create(Application); // you can use nil if you Free it in here 
    try 
    form.ShowModal; 
    finally 
    form.Release; // generally better than Free for a Form 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Test(TForm2); 
end; 
+0

'form.Free'そこには問題ありません。これは、フォームのコンストラクタが 'TForm'コンストラクタのオーバーライドである場合にのみ動作することを指摘する価値があります。 –

+0

@David、子孫のコンストラクタを隠している場合、コンストラクタの名前がCreateで、パラメータが一致している場合、これが機能しないと言っていますか? –

+2

@Marcusそれは正しいです。仮想コンストラクターを使用してクラス参照を介してインスタンス化する必要があります。それ以外の場合は、クラス参照に何が含まれているかにかかわらず、たびに 'TMyForm'が終了します。 –

3

何を求めていることなど、TApplication.CreateForm()が何をするか、基本的である:

Application.CreateForm(TForm1, form1); 
form1.ShowModal; 
FreeAndNil(form1); 

あなたはこのようなTAppliction.CreateForm()を呼び出さずにいることを模倣することができます。

procedure A(AClassType: TFormClass); 
var 
    form: TForm; 
begin 
    form := AClassType.Create(Application); 
    try 
    form.ShowModal; 
    finally 
    FreeAndNil(form); 
    end; 
end; 

... 

begin 
    A(TForm1); 
end; 
+0

はい...コードは他と似ています(そしてCreateFormメソッドに似ています)... jeje ...私は決してそれを実現しません! – Speaker

+0

ちょうど別の質問...フォームを解放するための最良の方法は何ですか? Form.release?私が今までFreeAndNilを使用 または FreeAndNil(フォーム) ...しかし... – Speaker

+2

'TForm.Release()は'フォームがそのイベントの1の内側から自分自身を解放する必要がある場合にのみ使用されることを意図してハンドラー。 TFormが何にも使用されていないことを確認するために、メインメッセージループに制御が戻るまで、空きは遅延されます。 TFormがもう使用されていないことが分かっている場合(この状況の場合)、すぐに 'Free()'を呼び出すことができます。 'FreeAndNil()'は、このようなローカル変数の簡単な使用のために、過剰です。もはや使用されないポインタをゼロにする必要はありません。 –

関連する問題