Hallo,
ich verwende eine
DLL, die im Prinzip ein Plugin dastellt. In dieser
DLL befindet sich eine Form sowie eine Interface-Implementation. Wenn ich nun über mein Hauptprojekt die Form anzeigen lasse und ihr als Parent bspw. ein TabSheet oder ein Panel zuweise, wird sie nicht angezeigt. Beim TabSheet muss ich einfach auf eine andere Seite navigieren und dann wieder zurück und meine Form ist da - nur wieso? Der Test mit
EDA hat ergeben, dass die Form nicht nur nicht angezeigt wird, sondern sich überhaupt nicht lokalisieren lässt - erzeugt wurde sie allerdings. Nach dieser verwirrenden Beschreibung hier der Code:
Das ist mein
Interface:
Delphi-Quellcode:
PSuSecBGInt = ^ISuSecBGInt;
ISuSecBGInt = interface ['{62A88606-F5DC-4F25-A5B9-6C5E851A9CE9}']
Procedure SetParent(Const AParent: TWinControl);
Procedure TryClose;
Function GetForm: TForm;
end;
So steht es in der
DLL:
Delphi-Quellcode:
TSuSecBGInt = Class(TInterfacedObject, ISuSecBGInt)
private
AForm: TMainForm;
public
Procedure SetParent(Const AParent: TWinControl);
Procedure TryClose;
Function GetForm: TForm;
end;
var ISuSec: ISuSecBGInt;
Procedure TSuSecBGInt.SetParent(Const AParent: TWinControl);
Begin
AForm := TMainForm.Create(NIL);
AForm.Parent := AParent; { ohne Parent wird die Form angezeigt! }
// AForm.SetBounds(0, 0, 585, 286); { egal ob ich diese Zeile habe oder nicht - es geht nicht! }
AForm.Show;
End;
Procedure TSuSecBGInt.TryClose;
Begin
If AForm <> NIL Then Begin
AForm.Close;
AForm.Free;
End;
End;
Function TSuSecBGInt.GetForm: TForm;
Begin
Result := AForm;
End;
Function GetPMI: PSuSecBGInt; Export;
Begin
Result := @ISuSec;
End;
Exports GetPMI Name 'PMI';
begin
ISuSec := TSuSecBGInt.Create;
end.
Der Aufruf ist ganz simpel. Im
Hauptprogramm wurde die
DLL-Funktion "GetPMI" eingebunden:
Function GetPMI1: PSuSecBGInt; External 'mod1.dll' Name 'PMI';
Anschließend:
Delphi-Quellcode:
var {Global}
Plugins: Array[1..1] Of ISuSecBGInt;
Procedure Load1stPlugin;
Begin
Plugins[1] := GetPMI1^;
Plugins[1].SetParent(AParent);
End;
Procedure FormClose(...);
var
I: Integer;
begin
For I := Low(Plugins) To High(Plugins) Do
Plugins[I].TryClose;
End;