2009-03-06 9 views
3

Delphiアプリケーションのメインフォーム名を格納する物理ファイルはどれですか?Delphiに保存されている「メインフォーム」の名前はどこですか?

MyApplicationの形式はMyFormで、プロジェクトオプションを使用して「メインフォーム」として設定されています。 "Main Form = MyForm"という情報は実際にどこに保存されていますか?

Delphi IDEのアプリケーション「メインフォーム」は、Project | Options | Formsで指定します。

明白なファイルは.bdsprojまたは.dprですが、いずれのフォームにも「メイン」のフォームを示すものはありません。

答えて

15

プロジェクト(.DPR)ファイルにあります。フォームとしてのApplication.CreateForm()の最初の呼び出しは、アプリケーションのメインフォームを識別します。

TDataModuleが上記の要件を満たしていないことに注意してください。これは実際には便利です。メインフォームの前にデータモジュールを自動作成し、そのデータモジュールにメインフォームのコンストラクタでアクセスすることができます。

+0

私はそれがどこかで注文することと関係があるという思い出がありました。トリックは、それが最初のCreateForm(TForm、...)だということです。私が見ているアプリケーションでは、データモジュールの作成中にフォームの作成が埋め込まれていたので、それは最初のものではないことは明白でした。注意してくれてありがとう:) – WileCau

+0

ええ、データモジュールはメインフォーム(明らかに)になることはできません。私が言及した「最初の呼び出し」ルールから除外されています。その訂正を反映するために投稿を編集します。 –

+0

@Ken:メインフォームのコンストラクタでデータモジュールを自動作成すると、そこに作成するよりも、データモジュールを自動作成する方が良いのはなぜですか? – mghie

0

ケンホワイトの答えに追加するだけです。

あなたは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. 

そして、あなたはすべてのグローバルフォームを失いました。

+0

@Gamecat:あなたの最後のコードブロックでタイプミス。 "mainform"を宣言しましたが、CreateForm()呼び出しで古い "MyMainFormGlobal"を使用しました。それを修正したいかもしれません。

+0

最後のコードが正常に機能していますか?メインのbegin-endブロックにあるようなLOOKSのコードがDPRファイルの他の場所に表示されている場合、IDEはそれを気に入らない。間違った変更を行った場合、IDEがプロジェクトをコンパイルできるかどうかは、ヒット・アンド・ミスです。 –

+0

はい、動作します。 (私は2006年を使って試しました)。私はIDEがそれを気に入らないことは知っていますが、他の法的な構造も好きではありません。コンパイルして実行している限り、問題はありません。 –

関連する問題