![]() |
Objekt zerstören bei Einsatz von Packages
Hallo zusammen,
komischer Titel, mir ist leider nichts besseres eingefallen. Meine Anwendung arbeitet mit dynamischen Packages, in denen sich "Module" (Forms) befinden. Das Ganze wird realisiert mit einer Main-MDI-Anwendung, die Module werden als MDI-Childs dargestellt. Zur Kommunikation zwischen Main-Programm und Modul verwende ich 2 Objekte: myDLLIN und myDLLOUT (nicht am Namen stören, ist ein Relikt aus vorherigen Experimenten). Diese sind in einer von MailApp und den Modulen gemeinsam genutzten Unit untergebracht:
Delphi-Quellcode:
Die Module (es soll immer nur eins aktiv sein WICHTIG!) werden von der MainApp so aufgerufen:
unit DLLExchange;
interface uses Forms, ZConnection; 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 FDBID: integer; FModName: String; procedure SetDBID(aDBID: integer); procedure SetModName(aModName: String); public property DBID: integer read FDBID write SetDBID; property ModName: String read FModName write SetModname; end; var myDLLOUT: TDLLOUT; implementation ...
Delphi-Quellcode:
Die "Execute"-Methode eines Moduls sieht so aus, wobei myDLLIN im Impmentation-Abschnitt eines Moduls mit myDLLIN: TDLLIN; deklariert ist:
...
if PackageModule = 0 then PackageLoad(mySelData.FModName+'.BPL'); //if the ExecuteChild procedure //was found in the package, call it if Assigned(Execute) then begin myDLLOUT:=Execute(myDLLIN); strPackageName:=myDLLOUT.ModName; end; end; ...
Delphi-Quellcode:
In meiner MainApp kann ich jetzt auf myDLLOUT zugreifen, funktioniert soweit.
function Execute(aDLLIN: TDLLIN): TDLLOut;
begin myDLLIN:=aDLLIN; TFrmDummy.Create(Application); myDLLOut:=TDLLOut.Create; myDLLOut.DBID:=1234; myDLLOUT.ModName:='TESTMODUL'; Result:=myDLLOut; end; Wenn ein Modul über einen manuell auf die Modulform gesetzten "Schliessen"-Button geschlossen wird (habe bsnone gesetzt) passiert im Modul folgendes:
Delphi-Quellcode:
und
procedure TfrmDUMMY.SpeedButton1Click(Sender: TObject);
begin Close; end;
Delphi-Quellcode:
In der MainApp gibt jetzt allerdings ein
procedure TfrmDUMMY.FormClose(Sender: TObject; var Action: TCloseAction);
begin myDLLOUT.Free; myDLLOUT:=nil; Action:=caFree; end;
Delphi-Quellcode:
ein "True" zurück. Eigentlich wollte ich so abfragen, ob ein Modul = MDIChild manuell geschlossen wurde, was leider nicht funktioniert. Hierdurch möchte ich das Modul entladen, wenn das Modulfenster vom User explizit geschlossen wird. Der andere Fall des "Modulentladens" folgt jetzt:
if Assigned(myDLLOUT)
Will der Anwender aus dem Menü ein anderes Modul aufrufen, mache ich folgendes, was offensichtlich funktioniert - sprich das bisherige myDLLOUT-Objekt wird zerstört -, denn der Aufruf eines neuen Moduls erstellt ja wieder ein neues myDLLOUT-Objekt, mit dem ich problemlos arbeiten kann.
Delphi-Quellcode:
Gruß Igotcha
// Unload Package if Form exists
if frmMain.MDIChildCount>0 then begin frmMain.ActiveMDIChild.Close; frmMain.ActiveMDIChild.Free; UnloadPackage(PackageModule); PackageModule:=0; strPackageName:=''; end; |
Re: Objekt zerstören bei Einsatz von Packages
Moin,
du hast die frage vergessen und das genaue problem nicht gesagt ;) ...oder wolltest du hier diese technik vorstellen? |
Re: Objekt zerstören bei Einsatz von Packages
Zitat:
Delphi-Quellcode:
Gruß Igotcha
if Assigned(myDLLOUT)
|
Re: Objekt zerstören bei Einsatz von Packages
Hast du schon mal FreeAndNil probiert?
|
Re: Objekt zerstören bei Einsatz von Packages
Zitat:
Also im ernst: Ich versteh das prinzip irgendwie nicht. Ich hab auch mal ein plugIn system mit BPLs realisiert, wobei in einem modul beliebig viele klassen existieren konnten. Dort hatte ich natürlich auch das problem, dass die klasse ungültig wurden sobald man ein modul entladen wollte. Da sich aber alle klassen im finalization abschnitt wieder de-registriert haben und alle objekte in bäumen organisiert waren, konnte ich alle objekte freigeben, deren kalsse nicht weiter verfügbar war. Vielleicht wird das ja bei dir auch ein problem. Ansonsten hat Luckie recht. Was ist mit FreeAndNil? |
Re: Objekt zerstören bei Einsatz von Packages
Liste der Anhänge anzeigen (Anzahl: 1)
Ich füge mal eine Grafik an, die das Problem evtl. ein bisschen besser visualisiert.
Nochmal zum Ziel: Ich möchte, wenn der User das MDI-Child über den Extra-Schliessen-Button schließt, dass dann auch das Objekt "myDLLOUT" zerstört wird, so dass die Abfrage in der MainApp "If Assigned(myDLLOUT)" ein FALSE zurückliefert. Hintergrund: Da alle Module die gleiche "Execute"-Methode haben, muss ich sicherstellen, dass ich auch immer mit dem korrekten bzw. aktuellen Rückgabeobjekt "myDLLOUT" arbeite. Wie schon geschrieben, scheint ein "Free", "Nil" und "FreeAndNil" nichts zu bringen. Gruß Igotcha |
Re: Objekt zerstören bei Einsatz von Packages
OK, versthe jetzt dein problem, auch wenn der sinn des ganzen noch ein bisschen im dunkeln bleibt....aber das ist eine andere geschichte.
Also, du sagst DLLExchange wird von beiden seiten genutzt. Hast du das in ein seperates modul ausgelagert, sodass es auch geteilt (sharing) werden kann? oder hast du die unit lediglich in beiden modulen verwendet. In letzteren fall, hättest du ein problem. Die beiden module hätten somit zwei getrennte instanzen von DLLExchange. |
Re: Objekt zerstören bei Einsatz von Packages
Hallo Igotcha
Das Proplem ligt hir beim schliessen vom Form Zitat:
versuche es einmal so Zitat:
Tau |
Re: Objekt zerstören bei Einsatz von Packages
@Tau: Das istz kein modales formular, sondern eine selbstimplementierte plugIn-Execute function :wink:
|
Re: Objekt zerstören bei Einsatz von Packages
Zitat:
Selbstverständlich habe ich DLLExchange in beiden als Unit eingebunden :gruebel: Werde das mal nacher mit DLLExchange als separatem Modul testen. Danke und Gruß Igotcha |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 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