Ja im Prinzip hab ich das so gedacht. Die Initialisierung kann aber erst erfolgen, wenn die Applikarion schon läuft (Hauptfenster erzeugt ist).
Da dein Formular von TForm abgeleitet ist, muss die
Unit Forms zumindest da schon eingebunden sein.
http://docwiki.embarcadero.com/Libra...ication.Handle
Also nur, damit ich das klarstelle: wenn ich den Erben einer TForm-Klasse (hier das Objekt
TFormDynamicSearchDialog) erzeuge, brauche ich keine
Unit Vcl.Forms einbinden; das geht auch ohne. In derjenigen
Unit, wo ich die Klasse
TFormDynamicSearchDialog allerdings implementiere, da brauche ich das natürlich, sonst kennt Delphi ja den Typ TForm nicht.
Ich hab jetzt aber dort, wo ich den Erben von TForm instanziiere, das Obkekt
Application verwenden sollen und da brauchte ich bisher die
Unit Vcl.Forms noch nicht. Daher hab ich sie jetzt erst eingebunden. Aber wie ich ja sagte: ich erhalte eine
invalid handle value Exception. Und das während der Konstruktion des Objekts
TFormDynamicSearchDialog. Ich glaub es war bei der Erzeugung des PageControl-Components, bin mir aber nicht mehr sicher. Was mache ich denn jetzt damit? Die Hauptapplikation ist ja die EXE-Anwendung und die läuft natürlich schon. Oder hast du damit gemeint, dass ich das
Handle-Value
nach der Erzeugung des Objekts
TFormDynamicSearchDialog erst setzen soll?
Modale Formulare vorher zu erzeugen und nur bei Bedarf anzuzeigen ist in der Regel nicht sinnvoll.
Diese werden häufig nach diesem Schema benutzt:
Delphi-Quellcode:
procedure ShowMyDialogForm(var AMyData: TMyData): Boolean;
var
F: TMyDialogForm; // globale Variable ist für Dialoge nicht erforderlich
begin
F := TMyDialogForm.Create(nil); // Owner = nil, wir übernehmen selbst die Freigabe des Dialogs
try
{Daten übergeben zur Anzeige/Bearbeitung z.B.}
F.Data := Copy(AMyData);
Result := (F.ShowModal = mrOk);
{geänderte Daten übernehmen}
if Result then
AMyData := Copy(F.Data);
finally
F.Free;
end;
end;
Exakt! Und dieses Schema bilde ich heute schon in der EXE-Anwendung nach. Dort steht es exakt so, wie du es im Beispiel gezeigt hast. Jetzt wurde aber das Objekt in eine
DLL verlagert und da ich ja nicht wollte, dass meine Kollegen zu viel Code anpassen müssen, hab ich die einzelnen Methoden in der
DLL abgebildet. D.h. um in deinem Beispiel zu bleiben gibt es einen Konstruktor, einen Destruktor, ein ShowModal und eine Property; letztere gibt es natürlich nur im Interface zur
DLL, die
DLL selbst exportiert dann natürlich eine Setter- und Getter-Methode. Daher steht das "Create" getrennt von dem "ShowModal", was die
DLL angeht. Aber das ist ja nichts, was man jetzt nicht machen darf. Eine neue Komponente würde ich so natürlich nicht programmieren, da gäbe es dann eine Art "CreateAndShow"-Methode oder so.