AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Objekt zerstören bei Einsatz von Packages
Thema durchsuchen
Ansicht
Themen-Optionen

Objekt zerstören bei Einsatz von Packages

Ein Thema von Igotcha · begonnen am 7. Mär 2005 · letzter Beitrag vom 8. Mär 2005
Antwort Antwort
Seite 1 von 2  1 2      
Igotcha

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

Objekt zerstören bei Einsatz von Packages

  Alt 7. Mär 2005, 16:30
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

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
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Objekt zerstören bei Einsatz von Packages

  Alt 7. Mär 2005, 18:57
Moin,

du hast die frage vergessen und das genaue problem nicht gesagt ...oder wolltest du hier diese technik vorstellen?
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Igotcha

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

Re: Objekt zerstören bei Einsatz von Packages

  Alt 8. Mär 2005, 01:04
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

if Assigned(myDLLOUT) Gruß Igotcha
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Objekt zerstören bei Einsatz von Packages

  Alt 8. Mär 2005, 02:01
Hast du schon mal FreeAndNil probiert?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Objekt zerstören bei Einsatz von Packages

  Alt 8. Mär 2005, 10:25
Zitat von Igotcha:
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

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?
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Igotcha

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

Re: Objekt zerstören bei Einsatz von Packages

  Alt 8. Mär 2005, 13:35
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
Miniaturansicht angehängter Grafiken
zeichnung1_969.gif  
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Objekt zerstören bei Einsatz von Packages

  Alt 8. Mär 2005, 14:02
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.
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Tau

Registriert seit: 17. Mär 2003
Ort: Bludenz
221 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Objekt zerstören bei Einsatz von Packages

  Alt 8. Mär 2005, 14:05
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
http://www.quad-offroad.com
wer kämpft kann verlieren aber wer nicht kämpft hat verloren
( Delphi 7 )
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#9

Re: Objekt zerstören bei Einsatz von Packages

  Alt 8. Mär 2005, 14:09
@Tau: Das istz kein modales formular, sondern eine selbstimplementierte plugIn-Execute function
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Igotcha

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

Re: Objekt zerstören bei Einsatz von Packages

  Alt 8. Mär 2005, 14:22
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

Werde das mal nacher mit DLLExchange als separatem Modul testen.

Danke und Gruß
Igotcha
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 Uhr.
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