Hallo zusammen,
ich bastle gerade an einem Anwendungs-"Framework" mit einem Hauptprogramm und in DLLs ausgelagerten Forms mit datensensitiven Komponenten. Über die bisher erzielten Ergebnisse bin ich selbst positiv überrascht
habe allerdings eine Lösungsanfrage zu folgendem Problem:
Das aufrufende Hauptprogramm übergibt der
DLL beim Aufruf ein TDLLIN-Objekt mit Informationen über die Anwendung, die
DLL liefert an das Hauptprogramm ein TDLLOUT-Objekt mit Informationen über die
DLL - das funktioniert soweit aus sehr gut.
Die beiden Klassen sind in einer vom Hauptprogramm und den DLLs gemeinsam genutzen
Unit deklariert:
Delphi-Quellcode:
type
TDLLIN = class
private
FApplication: String;
FZConnection: TZConnection;
FUserID: integer;
procedure SetApp(aApplication: string);
procedure SetZCon(aZConnection: TZConnection);
procedure SetUser(aUserID: integer);
public
property Application: string read FApplication write SetApp;
property Connection: TZConnection read FZConnection write SetZCon;
property UserID: integer read FUserID write SetUser;
end;
type
TDLLOUT = class
private
FDBForm: TForm;
FDBID: integer;
procedure SetDBID(aDBID: integer);
procedure SetDBForm(aForm: TForm);
public
property DBForm: TForm read FDBForm write SetDBForm;
property DBID: integer read FDBID write SetDBID;
end;
var
myDLLOUT: TDLLOUT;
Die DLLs bestehen immer aus der Projekt und einer Form-
Unit. Die Aufruffunktion einer
DLL lautet:
function ShowWindow(aForm: TForm; aPanel: TPanel; aDLLIN: TDLLIN): TDLLOUT;
Im Hauptprogramm rufe ich diese in dynamischer Variante wie folgt auf:
myDLLOUT:=ShowWindow(frmMain, Panel1, myDLLIN);
und zeige sie dann an:
myDLLOUT.DBForm.Show;
Bis hierher funktioniert alles wunderbar.
Jetzt möchte ich allerdings zusätzlich haben, dass z.B. bei einem Doppelklick auf ein DBGrid in der
DLL-Form dem Hauptprogramm der Datensatz bekannt gemacht wird:
Delphi-Quellcode:
procedure TfrmForm.DBGrid1DblClick(Sender: TObject);
begin
PC1.ActivePageIndex:=2;
myDLLOUT.DBID:=DBGrid1.Fields[0].asinteger;
end;
Nur greift das offensichtlich nicht auf das übergebene Object im Hauptprogramm durch, denn das Objekt DLLOUT wird ja in der
DLL erstellt und in diesem initialisierten Zustand einmalig an das Hauptprogramm übergeben.
Delphi-Quellcode:
function ShowWindow(aForm: TForm; aPanel: TPanel; aDLLIN: TDLLIN): TDLLOUT;
begin
if not Assigned(Form) then
Form:=TfrmForm.Createparented(aPanel.handle);
Form.ZTable1.Connection:=aDLLIN.Connection;
Form.ZTable1.TableName:='testdaten';
form.ZTable1.Active:=true;
form.BorderStyle:=bsnone;
Form.SB1.SimpleText:=aDLLIN.Application;
// DLLOUT-Object erstellen
myDLLOUT:=TDLLOUT.Create;
myDLLOUT.DBForm:=Form;
myDLLOUT.DBID:=-1;
// =========================================================
Result:=myDLLOUT;
end;
Wie kann ich es nun erreichen, dass sich Ereignisse in der
DLL, die Properties des TDLLOUT-Objekts betreffen, sich auf das von der
DLL an das Hauptprogramm übergebene DLLOUT-Objekt auswirken?
Gruß Igotcha