Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objekt zerstören bei Einsatz von Packages (https://www.delphipraxis.net/41715-objekt-zerstoeren-bei-einsatz-von-packages.html)

Igotcha 7. Mär 2005 15:30


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:
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

...
Die Module (es soll immer nur eins aktiv sein WICHTIG!) werden von der MainApp so aufgerufen:

Delphi-Quellcode:
...
  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;
...
Die "Execute"-Methode eines Moduls sieht so aus, wobei myDLLIN im Impmentation-Abschnitt eines Moduls mit myDLLIN: TDLLIN; deklariert ist:

Delphi-Quellcode:
function Execute(aDLLIN: TDLLIN): TDLLOut;
begin
  myDLLIN:=aDLLIN;

  TFrmDummy.Create(Application);
  myDLLOut:=TDLLOut.Create;
  myDLLOut.DBID:=1234;
  myDLLOUT.ModName:='TESTMODUL';
  Result:=myDLLOut;
end;
In meiner MainApp kann ich jetzt auf myDLLOUT zugreifen, funktioniert soweit.

Wenn ein Modul über einen manuell auf die Modulform gesetzten "Schliessen"-Button geschlossen wird (habe bsnone gesetzt) passiert im Modul folgendes:
Delphi-Quellcode:
procedure TfrmDUMMY.SpeedButton1Click(Sender: TObject);
begin
    Close;
end;
und
Delphi-Quellcode:
procedure TfrmDUMMY.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    myDLLOUT.Free;
    myDLLOUT:=nil;
    Action:=caFree;
end;
In der MainApp gibt jetzt allerdings ein

Delphi-Quellcode:
if Assigned(myDLLOUT)
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:

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:
 // Unload Package if Form exists
      if frmMain.MDIChildCount>0 then
      begin
      frmMain.ActiveMDIChild.Close;
      frmMain.ActiveMDIChild.Free;
      UnloadPackage(PackageModule);
      PackageModule:=0;
      strPackageName:='';
      end;
Gruß Igotcha

maximov 7. Mär 2005 17:57

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?

Igotcha 8. Mär 2005 00:04

Re: Objekt zerstören bei Einsatz von Packages
 
Zitat:

Zitat von maximov
Moin,

du hast die frage vergessen und das genaue problem nicht gesagt ;) ...oder wolltest du hier diese technik vorstellen?

Hehe, lies mal den Absatz mit dem

Delphi-Quellcode:
if Assigned(myDLLOUT)
Gruß Igotcha

Luckie 8. Mär 2005 01:01

Re: Objekt zerstören bei Einsatz von Packages
 
Hast du schon mal FreeAndNil probiert?

maximov 8. Mär 2005 09:25

Re: Objekt zerstören bei Einsatz von Packages
 
Zitat:

Zitat von Igotcha
Zitat:

Zitat von maximov
Moin,

du hast die frage vergessen und das genaue problem nicht gesagt ;) ...oder wolltest du hier diese technik vorstellen?

Hehe, lies mal den Absatz mit dem

Delphi-Quellcode:
if Assigned(myDLLOUT)
Gruß Igotcha

Ich nehme alles zurück...und behaupte das gegenteil!

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?

Igotcha 8. Mär 2005 12:35

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

maximov 8. Mär 2005 13:02

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.

Tau 8. Mär 2005 13:05

Re: Objekt zerstören bei Einsatz von Packages
 
Hallo Igotcha

Das Proplem ligt hir beim schliessen vom Form

Zitat:

procedure TfrmDUMMY.SpeedButton1Click(Sender: TObject);
begin
Close;
end;

versuche es einmal so

Zitat:

procedure TfrmDUMMY.SpeedButton1Click(Sender: TObject);
begin
ModalResult := mrOk;
end;
Gruss
Tau

maximov 8. Mär 2005 13:09

Re: Objekt zerstören bei Einsatz von Packages
 
@Tau: Das istz kein modales formular, sondern eine selbstimplementierte plugIn-Execute function :wink:

Igotcha 8. Mär 2005 13:22

Re: Objekt zerstören bei Einsatz von Packages
 
Zitat:

Zitat von maximov
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.

Du sprichst hier etwas an, was ich schon selbst langsam vermutet habe, dass es sich nämlich um 2 verschiedene myDLLOUT-Objekte handelt - habe ich das so richtig verstanden?

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 21:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz