2016-07-21 11 views
0

TApplication.CreateForm(ここにコードを貼り付けることができないかどうかは確かではありませんが、somemoneが確認した場合はこれを行います)、派生したフォームのクラスと変数を指す変数を使用してTForm子孫のインスタンスを作成する方法ですフォーム。両方ともCreateFormのパラメータです。クラスパラメータからのより良い作成方法は?

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference); 

私は何クラスそれの指標としてのみ、いくつかのパラメータを持つ派生コントロールを作成する方法を持っているしたい場合CreateFormで行われているものを行うためのより良い、あるいは簡単な方法(多分少ないコード付き)がありますと変数が使用されます。

編集:自分のプロジェクトで使用するコントロールを作成する方法があります。このメソッドは、コントロールに関連するいくつかの追加コードを実行するので、メソッドの理由があります。私はその追加作業を複製したくないので、このメソッドは何度も呼び出されます。私はCreateFormと同じ方法でコードを実装することができますが、それほど簡単ではないコードで同じことをする方法があるのだろうかと思っていました。

+0

@DavidHeffernan少ないコードまたは代替コード。 –

+0

少ないコードはどうですか? –

+0

おそらく私はあなたが意味することを理解していないかもしれませんが、おそらく、CreateForm内で使用されているものよりもコードが少なくて済み、コードが単純であるかどうかを尋ねています。 –

答えて

4

私は、いくつかのパラメータを持つ派生コントロールを作成して、それがどのクラスであるかの指標と、それが使用する変数を持つメソッドを作成したいと考えています。

あなたはそのための方法は必要ありません。

MyForm := TMyForm.Create(Owner); 

Application.CreateForm内のすべてのコードによって延期されないでください:あなたはこのようにそれを書くことができます。そのコードは多くのタスクを実行します。その原則はApplication.MainFormという変数を割り当てます。 IDEはApplication.CreateFormを使用することをお勧めしますが、実際には一度呼び出すだけで済みます。これはメインフォームを作成することです。

あなたはメソッドにこれを行うに死んでセットされている場合、それは次のようになります。この関数を呼び出す場合

function CreateForm(FormClass: TFormClass; Owner: TComponent): TForm; 
begin 
    Result := FormClass.Create(Owner); 
end; 

あなたは戻り値をキャストする必要があります:

MyForm := TMyForm(CreateForm(TMyForm, Owner)); 

MyForm := CreateForm(TMyForm, Owner) as TMyForm; 

代替方法として、

type 
    TFormCreator = class 
    public 
    class function CreateForm<T: TForm>(Owner: TComponent): T; static; 
    end; 

はこのようにそれを実装します。

class function TFormCreator.CreateForm<T>(Owner: TComponent): T; 
begin 
    Result := T(TFormClass(T).Create(Owner)); 
end; 

はこのようにそれを呼び出します。

MyForm := TFormCreator.CreateForm<TMyForm>(Owner); 

かなりばかげたことはないですか?あなたがしたいのはフォームをインスタンス化するだけです!だから、私はあなたがIDEのApplication.CreateFormの使用によって混乱しているという強い疑念を持っており、実際に存在するよりも多くのインスタンスを生成すると考えています。私の本能は、あなたが実際にこのを探していることを教えてください:あなたはより良いコードとして検討する

MyForm := TMyForm.Create(Owner); 
+0

CreateFormはコースの各自動作成フォームに対しても呼び出されます –

+0

私はそれを次のように扱いました:* IDEはApplication.CreateFormの使用を推奨しますが、現実には一度呼び出すだけでメインフォームを作成する必要があります。 * IDEがそれをしているという事実は、あなたがそれを行う必要があるということを意味しません。上で説明したように、メインフォームを作成するときは、 'Application.CreateForm'を一度呼び出す必要があります。 –

+0

優秀!あなたの編集は、それができる方法を正確に説明しています。ありがとう、ミル。少ないコードで簡単です。 –

-1

AS。自分のコードを投稿することはできますが、著作権が他の人を保持するコードに関しては、それはちょっと複雑になります。私はそれが米国の「公正使用」の教義に該当すると考えています。たとえば、VCLソースのスニペットを投稿して、何かを批評したりデモンストレーションしたりできますが、それを別のプロジェクトにコピーアンドペーストするのではなく、「公正使用」の意図に必要なVCLコードだけを投稿することができます。

VCLフォームはコンポーネントなので、メモリ管理の責任者が必要です。したがって、通常のTComponent作成パターンでフォームを作成できます。

MyFormVariable := TMyFormClass.Create(Application); 

これもCreateFormで型なしvar Referenceを拒否する型の安全性のために追加されます。

この方法がApplication.CreateFormを使用するよりも良いか悪いかは、あなたの好みに左右されます。個人的に私は均一な方法を好むので、フォームやデータモジュールを明示的に作成する必要があるときは、通常、「アプリケーション」の方法ではなく「コンポーネント」の方法を使用します。

昨日戻ってくれる人は、TApplication.CreateFormは、VCLがApplication.Runコールで開始される前に、フォームを作成する "コンポーネント方法"ができなかった追加の設定を追加したと思います。あるいは、TApplicationのタイプがありました - AFAIR異なるプロジェクトで5つありますが、TComponentから派生していませんか?しかし、とにかく私は今日、限界があると思っています。

+1

'Application.CreateForm'を使用する唯一の理由は、メインフォームを作成することです。これがメインフォームを作成する唯一の方法です。 VCLアプリケーションは 'Application.CreateForm'を一回呼び出す必要があります。 –

+0

@DavidHeffernan:IDEはそれを知らない。このように、すべての自動作成フォームが作成されます。 ;-) –

+0

@RudyVelthuis IDEはこれを知っています。最初のものがメインフォームです。残りはそうではありません。 –

関連する問題