![]() |
DLL und Objektübergabe
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:
Die DLLs bestehen immer aus der Projekt und einer Form-Unit. Die Aufruffunktion einer DLL lautet:
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;
Delphi-Quellcode:
Im Hauptprogramm rufe ich diese in dynamischer Variante wie folgt auf:
function ShowWindow(aForm: TForm; aPanel: TPanel; aDLLIN: TDLLIN): TDLLOUT;
Delphi-Quellcode:
und zeige sie dann an:
myDLLOUT:=ShowWindow(frmMain, Panel1, myDLLIN);
Delphi-Quellcode:
Bis hierher funktioniert alles wunderbar.
myDLLOUT.DBForm.Show;
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:
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.
procedure TfrmForm.DBGrid1DblClick(Sender: TObject);
begin PC1.ActivePageIndex:=2; myDLLOUT.DBID:=DBGrid1.Fields[0].asinteger; end;
Delphi-Quellcode:
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?
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; Gruß Igotcha |
Re: DLL und Objektübergabe
Zitat:
Dann wirst du mit einem dynamisch geladenen Package viel glücklicher werden. ![]() Wenn du dein "Framework" unabhängig von Delphi halten möchtest, dann musst du dich mit COM/DCOM/ActiveX anfreunden. Ein "normale" DLL ist eine Sackgasse, da du nicht wirklich objektorientiert arbeiten kannst. |
Re: DLL und Objektübergabe
Oh mann, vergesst mal ganz schnell meine Frage ;-)
Ich war durch meine ersten tieferen Schritte in die OOP- und DLL-Programmierung so positiv angetan, dass ich mich wundere, warum der besagte Property-Wert, den ich zum Debuggen in die Statusbar geschrieben habe, nicht dort auch automatisch aktualisiert wird, wenn die Property geändert wird ;-) Selbstverständlich funktioniert es wie gewünscht, ich hätte mir nur mal den tatsächlich aktuellen Wert auch anzeigen lassen müsssen hehe Sorry für die Verwirrung... Gruß Igotcha |
Re: DLL und Objektübergabe
Zitat:
Das Hauptprogramm und die DLL haben jeweils 4 Bytes für die Variable reserviert. Du hast es also mit 2 Variablen zu tun!! |
Re: DLL und Objektübergabe
Können in einer DLL überhaupt Objekte aus dem Hauptprogramm bearbeitet werden?
Ich denke man muss in dem Fall ne Speicheradresse übergeben, auf die dann die DLL das Objekt schreibt um es dann im Hauptprogramm von da wieder einzulesen... Oder seh ich das falsch? :gruebel: |
Re: DLL und Objektübergabe
Siehe mein geändertes Posting ;-)
Es funktioniert soooo gut, dass ich es nicht bemerkt hatte :gruebel: |
Re: DLL und Objektübergabe
Das Problem ist die Speicherverwaltung. Das trifft nicht nur Strings sondern auch Objekte.
Objektorientierung in einer Schnittstelle nur ueber Interfaces. Einfache Funktionen sind viel besser. Versuch mal eine C++ Plugin-Schnittstelle von Delphi aus zuzugreifen. ActiveX/COM wuerde ich erst mal meiden, da sie Windows-spezifisch sind. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz