Ja, im Prinzip ist es möglich.
Wie war das noch ...
Ich hab da mal 'n stück alten Code rausgesucht. Aber ob der korrekt funktioniert kann nicht garantieren.
Das ist die
Dll-Funktion:
Delphi-Quellcode:
procedure fCreateForm(PApp: TApplication; PForm: TForm);
stdcall;
// P Steht für Parameter nicht für Pointer, obwohls quasi einer ist
var
dllApp: TApplication;
begin
dllApp := Application;
Application := PApp;
// das Application-Objekt auf die Host-Anwendung einstellen
frmDll := TFrmDll.Create(PForm);
// MDI-Child erzeugen
frmDll.ParentForm := PForm;
frmDll.ParentApplication := PApp;
frmdll.FormStyle := fsMDIChild;
frmDll.Show;
Application := dllApp;
// das Application-Objekt zurücksetzen, damit die DLL vernünftig beendet werden kann
end;
Der Aufruf aus der Host-Anwendung könnte so aussehen:
fCreateForm(Application,Form1);
Zitat von
RWarnecke:
Worauf sollte ich achten ?
...das du beim Erstellen der
Dll-Form das Application-Object der
DLL mit dem Application-Object der Hostanwendung überschreibst und nach dem Erstellen wieder auf das
DLL-Applaction-Object zurücksetzt. Ebenso beim Freigeben (... glaube ich, ich hab den Code leider nicht mehr. Ich nutze keine
MDI's mehr in meinen Programmen.)
Zitat von
RWarnecke:
Gibt es irgendwelche Besonderheiten gegenüber normalen Form's ?
Da kannst nicht auf das
MDI-Parent zugreifen. Zumindest nicht schreibend bzw nicht ohne MemoryManager.
Zitat von
RWarnecke:
Was wären von Vorteil, die
DLL dynamisch zu laden oder statisch ?
Das ist glaube ich relativ egal, wenn du's richtig anstellst.
Beim dynamischen Laden, solltest du nicht in der DllMain (zwischen BEGIN und END in der
Dll) das Fenster sofort versuchen zu erstellen, da ja evtl. dein Host-Application bzw. Form1 noch nicht existiert. Besser über eine exportierte Funktion, wie oben. Anders kriegst du ja die Parameter eh nicht rüber.
Ich hoffe, ich konnte helfen.