ケンホワイトの答えに追加するだけです。
あなたはCreateFormのためのソースを見れば:
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(Self);
except
TComponent(Reference) := nil;
raise;
end;
if (FMainForm = nil) and (Instance is TForm) then
begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance);
end;
end;
あなたは(その名前にもかかわらず)関数は、他のコンポーネントを作成するために使用することができることを参照してください。しかし、TFormであり、正常に作成された最初のコンポーネントだけがメインフォームになります。
そして、グローバル変数に関する警告。
はいグローバルはしばしば間違っていますが、アプリケーションオブジェクトとメインフォームオブジェクトでは例外を作成できます。あなたがメインフォームのグローバルを省略することはできますが、DPRファイルを自分で編集する必要がありますが:
変更:
begin
Application.Initialize;
Application.CreateForm(TMyMainForm, MyMainFormGlobal);
Application.Run
end.
へ:
procedure CreateMain;
var
mainform : TMyMainForm;
begin
Application.CreateForm(TMyMainForm, mainform);
end;
begin
Application.Initialize;
CreateMain;
Application.Run
end.
そして、あなたはすべてのグローバルフォームを失いました。
私はそれがどこかで注文することと関係があるという思い出がありました。トリックは、それが最初のCreateForm(TForm、...)だということです。私が見ているアプリケーションでは、データモジュールの作成中にフォームの作成が埋め込まれていたので、それは最初のものではないことは明白でした。注意してくれてありがとう:) – WileCau
ええ、データモジュールはメインフォーム(明らかに)になることはできません。私が言及した「最初の呼び出し」ルールから除外されています。その訂正を反映するために投稿を編集します。 –
@Ken:メインフォームのコンストラクタでデータモジュールを自動作成すると、そこに作成するよりも、データモジュールを自動作成する方が良いのはなぜですか? – mghie