Einzelnen Beitrag anzeigen

schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#7

AW: Verständnisfrage Formulardatei

  Alt 17. Mär 2014, 21:06
Hmmm, nun ja, das hier sagt zunächst mal die Hilfe von Delphi 7 zu CreateNew:
Zitat:
CreateNew sollte anstelle des Konstruktors Create verwendet werden, wenn Sie ein Formular erzeugen wollen, ohne dass es in der zugehörigen .DFM-Datei initialisiert wird. Verwenden Sie CreateNew immer dann, wenn der Nachkomme von TCustomForm kein TForm-Objekt oder kein Nachkomme von TForm ist.

CreateNew umgeht das Einlesen der zuvor zugewiesenen .DFM-Datei. Enthält das Formular visuelle Komponenten, müssen Sie deshalb eine externe .DFM-Datei einlesen, um die visuellen Komponenten an ihre Klassen zu binden. Verfügt das neue Formularobjekt über eine externe .DFM-Datei, rufen Sie nach CreateNew die Methode InitInheritedComponent auf. Wenn Sie die .dfm-Datei für die neue Formularinstanz erstellen müssen, schließen Sie den Aufruf von CreateNew in WriteComponentResFile- und ReadComponentResFile-Aufrufe ein. Die folgende Code-Sequenz

1. schreibt eine externe .DFM-Datei, erstellt ein neues Formular, das nicht an eine .DFM-Ressourcendatei gebunden ist, und liest eine externe .DFM-Datei ein und bindet sie an das neue Formular:

WriteComponentResFile('Temp.dfm', Form1);
...
Form2 := TForm.CreateNew(Application);
ReadComponentResFile('Temp.dfm', Form2);

Warnung Die Verwendung von CreateNew anstelle von Create kann zu unvorhersehbaren Ergebnissen führen, da die meisten Formulare unter der Voraussetzung geschrieben werden, dass ihre Steuerelemente in der .DFM-Datei erzeugt werden.
Wenn ich statt Application.CreateForm(TForm1, Form1); -> Form1 := TForm1.Create(Application); schreibe, wird das Formular bei mir nicht korrekt angezeigt, wenn die .dfm Datei fehlt.

Zitat von dataspider alias Frank:
Ich habe ein Mini - Projekt mit Form ohne DFM - Datei angehangen.
Aber vielleicht habe ich etwas falsch verstanden.
Ok, Danke, ich werde mir das mal anschauen und auch debuggen.
Ohne .dfm ist aber auf jeden Fall richtig, genau das will ich ja testen und ggf. verstehen warum das evtl. nicht klappt.
Die Exception kommt korrekt innerhalb der IDE aber nicht außerhalb, wenn ich das Formular mit Create() initialisiere aber nicht in Turbo Delphi. Wenn mit CreateNew() initialisiert, kommt auch in der IDE keine Exception, obwohl das Formular auch dann nicht korrekt aufgebaut wird.

Ich fürchte, dann wird das was ich erreichen will wohl nur per WinAPI gehen. Der Formularaufruf komplett ohne .dfm Datei.

VCL Debug ergibt, das MainForm nicht initialisiert wird, trotz CreateNew.

Delphi-Quellcode:
begin
  Application.Initialize;
  //Application.CreateForm(TForm1, Form1);
  Form1 := TForm1.CreateNew(Application);
  Form1.ShowModal;
  Application.Run;
end.

Wenn ich hier Form1.ShowModal aufrufe, bekomme ich das Formular korrekt angezeigt, nicht aber mit Form.Show. Letztere Anweisung lässt das Formular nur kurz aufblitzen, dann verschwindet das Formular wieder und das Programm beendet sich. Nur ShowModal funktioniert hier.

Aber warum. Debug ergibt hier in TApplication.Run, das FMainForm = NIL ist. Warum funktioniert dann ShowModal überhaupt? (confused). Show lässt immerhin das Formular aufblitzen. Aber wenn FMainform = NIL ist, dürfte doch gar keins angezeigt werden, schon gar nicht permanent, wie das mit ShowModal jedoch der Fall ist.

Zum Verständnis der Methoden Show und ShowModal brauche ich länger. Dort muss ja der Schlüssel für das oben genannte Verhalten liegen.

Wenn ich Debugge und das mit ShowModal angezeigte Formular während das Debuggens schließe, verabschiedet sich übrigens die IDE.

Habe das sowohl mit Turbo Delphi als auch mit Delphi 7 getestet.
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat