2009-03-06 5 views
3

In welcher physischen Datei ist der Hauptformularname für eine Delphi-Anwendung gespeichert?Wo ist der Name "Main Form" in Delphi gespeichert?

z.B. MyApplication hat ein Formular MyForm, das als "Hauptformular" über Projektoptionen festgelegt wird. Wo wird die Information "Main Form = MyForm" tatsächlich gespeichert?

In dem Delphi-IDE der Anwendung „Hauptformular“ wird über das Menü festgelegt: Project | Options | Forms.

Die offensichtliche Datei wäre die .bdsproj oder die .dpr aber es scheint nicht, etwas in einer von diesen zu sein, dass die „main“ ein, welche Form anzeigt.

Antwort

15

Es ist im Projekt (.dpr) Datei. Der erste Aufruf von Application.CreateForm() mit einem Formular als Parameter identifiziert das Hauptformular der Anwendung.

Beachten Sie, dass ein TDataModule nicht die oben genannten Anforderungen nicht erfüllt; Das ist nützlich, da Sie ein Datamodul vor dem Hauptformular automatisch erstellen und dann auf dieses Datamodul im Konstruktor des Hauptformulars zugreifen können.

+0

Ich hatte Erinnerungen daran, dass es etwas damit zu tun hatte, irgendwo zu bestellen. Der Trick ist, dass es das erste CreateForm (TForm, ...) ist. Die App, die ich mir ansehe, hat die Formularerstellung unter Datenmodul-Kreationen vergraben, so dass es nicht offensichtlich war, dass es die erste war. Danke für die Erinnerung :) – WileCau

+0

Ja, Datamodule sind nicht für Hauptformen (offensichtlich), und sie sind von der "ersten Anruf" -Regel ausgeschlossen, die ich erwähnte. Ich werde meinen Beitrag bearbeiten, um diese Korrektur widerzuspiegeln. –

+0

@Ken: Warum sollte das automatische Erstellen von Datenmodulen, um auf sie im Konstruktor des Hauptformulars zuzugreifen, besser sein, als sie dort zu erstellen? – mghie

0

Nur um Ken Whites Antwort hinzuzufügen.

Wenn Sie an der Quelle für Create aussehen:

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; 

Sie sehen, dass die Funktion (trotz seines Namens) verwendet werden können, andere Komponenten zu erstellen. Aber nur die erste Komponente, die ein TForm ist und die erfolgreich erstellt wird, kann die Hauptform sein.

Und dann eine Tirade auf globale Variablen.

Ja Globals sind oft falsch, aber für ein Anwendungsobjekt und eine Hauptform Objekt können Sie eine Ausnahme machen. Obwohl Sie die globale für die Hauptform weglassen können, aber Sie müssen die dpr Datei selbst bearbeiten:

Wechsel:

begin 
    Application.Initialize; 
    Application.CreateForm(TMyMainForm, MyMainFormGlobal); 
    Application.Run 
end. 

An:

procedure CreateMain; 
var 
    mainform : TMyMainForm; 
begin 
    Application.CreateForm(TMyMainForm, mainform); 
end; 

begin 
    Application.Initialize; 
    CreateMain; 
    Application.Run 
end. 

Und Sie verloren alle globalen Formen.

+0

@Gamecat: Tippfehler in Ihrem letzten Codeblock. Sie haben "mainform" deklariert, aber das alte "MyMainFormGlobal" im Aufruf CreateForm() verwendet. Vielleicht möchten Sie das beheben.

+0

Sind Sie sicher, dass der letzte Code funktioniert? Die IDE mag es nicht, wenn Code, der aussieht wie er in den Haupt-Anfangsblock gehört, irgendwo in der DPR-Datei erscheint. Es ist ein Treffer, ob die IDE es Ihnen ermöglicht, das Projekt zu kompilieren, wenn Sie die falschen Änderungen vornehmen. –

+0

Ja, es funktioniert. (Ich habe es mit 2006 versucht). Ich weiß, dass die IDE es nicht mag, aber es mag auch kein anderes legales Konstrukt. Solange es kompiliert und läuft, ist das kein Problem für mich. –

Verwandte Themen