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.
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
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. –
@Ken: Warum sollte das automatische Erstellen von Datenmodulen, um auf sie im Konstruktor des Hauptformulars zuzugreifen, besser sein, als sie dort zu erstellen? – mghie