Thema: Delphi DLL und Objektübergabe

Einzelnen Beitrag anzeigen

Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#1

DLL und Objektübergabe

  Alt 6. Feb 2005, 11:13
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
  Mit Zitat antworten Zitat