Application war auch zu Beginn nicht verfügbar, da die
Unit Vcl.Forms nicht eingebunden war. Ich möchte jetzt sicher gehen, dass ich das korrekt verstanden hab: das soll schon in der
DLL gesetzt werden, richtig? Nicht erst "während" des Konstruktors des eigentlichen TForm-Objekts? Da wäre es meiner Meinung nach nämlich zu spät, aber ich will da lieber nochmal nachfragen. Das sieht jetzt ungefähr so aus:
Delphi-Quellcode:
// In der DLL
procedure CreateSearch(
{... ;} AHnd: THandle);
cdecl;
begin
Application.Handle := AHnd;
// hier ist das ja korrekt oder?
FDynamicSearchDlg := TFormDynamicSearchDialog.Create(
{...});
// hier als Parameter wäre zu spät, richtig?
// usw.
end;
// Im DLL-Interface (-> außerhalb der DLL, in der EXE drinnen sozusagen)
CreateSearch(
{...;}, Application.Handle);
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
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;
Wenn tatsächlich im Contructor ein Fehler auftreten kann, sollte man das zusätzllich mit try..except absichern.
F wird dann nicht zugewiesen und der Resourcenschutzblock try..finally komplett nicht durchlaufen.
Man solllte Objekte immer auf der Ebene freigeben, wo diese auch erzeigt wurden, insbesondere aber nur an einer Stelle.