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


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