Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MDI-Form & MDI-Child & DLL's (https://www.delphipraxis.net/104912-mdi-form-mdi-child-dlls.html)

RWarnecke 12. Dez 2007 18:38


MDI-Form & MDI-Child & DLL's
 
Hallo zusammen,

da ich gerade am planen bin für ein größeres Programm, wollte ich mal fragen ob es möglich ist die MDI-Child Fenster auszulagern in eine DLL ? Ich weiß, dass ich normale Forms in eine DLL auslagern kann, habe das auch schon des öfteren gemacht. Nur bei MDI-Fenster bin ich mir nicht ganz sicher.

Meine Fragen dazu :
  • Worauf sollte ich achten ?
  • Gibt es irgendwelche Besonderheiten gegenüber normalen Form's ?
  • Was wären von Vorteil, die DLL dynamisch zu laden oder statisch ?

gmc616 19. Dez 2007 15:41

Re: MDI-Form & MDI-Child & DLL's
 
Ja, im Prinzip ist es möglich.
Wie war das noch ... :gruebel:

Ich hab da mal 'n stück alten Code rausgesucht. Aber ob der korrekt funktioniert kann nicht garantieren.

Das ist die Dll-Funktion:
Delphi-Quellcode:
procedure fCreateForm(PApp: TApplication; PForm: TForm); stdcall; // P Steht für Parameter nicht für Pointer, obwohls quasi einer ist
var
  dllApp: TApplication;
begin
  dllApp := Application;
  Application := PApp; // das Application-Objekt auf die Host-Anwendung einstellen
  frmDll := TFrmDll.Create(PForm); // MDI-Child erzeugen
  frmDll.ParentForm := PForm;
  frmDll.ParentApplication := PApp;
  frmdll.FormStyle := fsMDIChild;
  frmDll.Show;
  Application := dllApp; // das Application-Objekt zurücksetzen, damit die DLL vernünftig beendet werden kann
end;
Der Aufruf aus der Host-Anwendung könnte so aussehen:
Delphi-Quellcode:
fCreateForm(Application,Form1);
Zitat:

Zitat von RWarnecke
Worauf sollte ich achten ?

...das du beim Erstellen der Dll-Form das Application-Object der DLL mit dem Application-Object der Hostanwendung überschreibst und nach dem Erstellen wieder auf das DLL-Applaction-Object zurücksetzt. Ebenso beim Freigeben (... glaube ich, ich hab den Code leider nicht mehr. Ich nutze keine MDI's mehr in meinen Programmen.)

Zitat:

Zitat von RWarnecke
Gibt es irgendwelche Besonderheiten gegenüber normalen Form's ?

Da kannst nicht auf das MDI-Parent zugreifen. Zumindest nicht schreibend bzw nicht ohne MemoryManager.

Zitat:

Zitat von RWarnecke
Was wären von Vorteil, die DLL dynamisch zu laden oder statisch ?

Das ist glaube ich relativ egal, wenn du's richtig anstellst.
Beim dynamischen Laden, solltest du nicht in der DllMain (zwischen BEGIN und END in der Dll) das Fenster sofort versuchen zu erstellen, da ja evtl. dein Host-Application bzw. Form1 noch nicht existiert. Besser über eine exportierte Funktion, wie oben. Anders kriegst du ja die Parameter eh nicht rüber.

Ich hoffe, ich konnte helfen.

Nuclear-Ping 19. Dez 2007 15:48

Re: MDI-Form & MDI-Child & DLL's
 
Du kannst Forms in BPLs auslagern.

Schau mal hier: http://delphi.about.com/b/2007/04/06...i-packages.htm

hanspeter 19. Dez 2007 20:27

Re: MDI-Form & MDI-Child & DLL's
 
Zitat:

Zitat von RWarnecke
Hallo zusammen,

da ich gerade am planen bin für ein größeres Programm, wollte ich mal fragen ob es möglich ist die MDI-Child Fenster auszulagern in eine DLL ? Ich weiß, dass ich normale Forms in eine DLL auslagern kann, habe das auch schon des öfteren gemacht. Nur bei MDI-Fenster bin ich mir nicht ganz sicher.

Falls es was kosten darf, würde ich Dir die Hydra-Plugins von Remobjects empfehlen.
Die erzeugen DLL und können problemlos als MDI eingebunden werden.
Das besondere von Delphi kann ein Hydra Plugin aufgerufen werden, welches das Net-Framework nutzt und in Netframework kann eine dll aufgerufen werden, welche in
Delphi geschrieben ist.

Das verkorkste bpl Prinzip würde ich nicht mehr bei neuen Projekten nutzen. Das ist mit allen Abhängigkeiten einfach nur noch kaputt.

Gruß
Peter

RWarnecke 26. Dez 2007 13:31

Re: MDI-Form & MDI-Child & DLL's
 
Danke erstmal für eure Antworten.
Zitat:

Zitat von hanspeter
Falls es was kosten darf, würde ich Dir die Hydra-Plugins von Remobjects empfehlen.
Die erzeugen DLL und können problemlos als MDI eingebunden werden.
Das besondere von Delphi kann ein Hydra Plugin aufgerufen werden, welches das Net-Framework nutzt und in Netframework kann eine dll aufgerufen werden, welche in Delphi geschrieben ist.

Da ich nur mit Turbo Delphi Explorer arbeitet, ist glaube ich das Hydra Plugin nicht ganz das richtige.

Zitat:

Zitat von gmc616
Das ist die Dll-Funktion:
Delphi-Quellcode:
procedure fCreateForm(PApp: TApplication; PForm: TForm); stdcall; // P Steht für Parameter nicht für Pointer, obwohls quasi einer ist
var
  dllApp: TApplication;
begin
  dllApp := Application;
  Application := PApp; // das Application-Objekt auf die Host-Anwendung einstellen
  frmDll := TFrmDll.Create(PForm); // MDI-Child erzeugen
  frmDll.ParentForm := PForm;
  frmDll.ParentApplication := PApp;
  frmdll.FormStyle := fsMDIChild;
  frmDll.Show;
  Application := dllApp; // das Application-Objekt zurücksetzen, damit die DLL vernünftig beendet werden kann
end;
Der Aufruf aus der Host-Anwendung könnte so aussehen:
Delphi-Quellcode:
fCreateForm(Application,Form1);

Ich habe diesen Code mal in verschiedenen Varianten ausprobiert, nur leider gibt es dann immer den Fehler, dass er keine MDI-Child Fenster erzeugen kann, weil keine MDI-Form zur Verfügung steht. Meine Procedure in der DLL sah bisher wie folgt aus :
Delphi-Quellcode:
procedure OptionBox(appHandle: THandle); stdcall;
begin
  if appHandle = 0 then
    apphandle := GetActiveWindow;
  Application.Handle := appHandle;
  try
    with TMainOptionBox.Create(Application) do
    try
      ShowModal
    finally
      Free;
    end
  except
    on E: Exception do
      Application.HandleException(E);
  end;
  Application.Handle := 0;
end;
Was muss ich jetzt ändern, damit ich ein MDI-Fenster in eine DLL packen kann und es dann in der MDI-Form angezeigt wird.

RWarnecke 29. Dez 2007 12:09

Re: MDI-Form & MDI-Child & DLL's
 
*dezentes push* Hat keiner für mich einen Tipp ? *dezentes push*

Nuclear-Ping 29. Dez 2007 12:12

Re: MDI-Form & MDI-Child & DLL's
 
Der dezenteste Tipp den ich dir geben kann ist, es über BPLs - statt DLLs - zu machen.

Um MDI-Forms für Delphi in DLLs auszulagern und zu benutzen muss man fast mit Kanonen auf Spatzen schießen. BPLs sind zwar auch "nur" DLLs, die aber etwas umgebogen sind und hier von Haus aus unterstützung für solche Vorhaben mitbringen und deswegen besser geeignet sind - auch wenn anderes behauptet wird.

RWarnecke 29. Dez 2007 12:26

Re: MDI-Form & MDI-Child & DLL's
 
Zitat:

Zitat von Nuclear-Ping
Der dezenteste Tipp den ich dir geben kann ist, es über BPLs - statt DLLs - zu machen.

Um MDI-Forms für Delphi in DLLs auszulagern und zu benutzen muss man fast mit Kanonen auf Spatzen schießen. BPLs sind zwar auch "nur" DLLs, die aber etwas umgebogen sind und hier von Haus aus unterstützung für solche Vorhaben mitbringen und deswegen besser geeignet sind - auch wenn anderes behauptet wird.

Wenn BPLs zwar auch nur DLLs sind, verstehe ich das ganze nicht, warum es nicht auch einfach über eine DLL geht ? Ich habe hier im Forum und auch in anderen gelesen, dass BPLs veraltet sind und auch sehr fehlerbehaftet sind. Mein Ziel ist es, dass Programm modular aufzubauen. Das heißt, dass sich der User aussuchen kann, welche Module er vom Programm nutzen möchte. Ich stelle mir dann auch das Update für das Programm viel leichter vor, wenn ich nur eine DLL austauschen muss zum Beispiel.

Nuclear-Ping 29. Dez 2007 12:32

Re: MDI-Form & MDI-Child & DLL's
 
BPLs sind "spezielle" DLLs. Man kann sie aber auch nach dem compilen von BPL nach DLL umbenennen.

Veraltet und Fehleranfällig würde ich nicht unbedingt sagen. Soweit ich weiß ist das einzige Manko: Man muss die BPLs mit ausliefern, die man im Projekt verwendet hat. Also rtl60, vcl60, vcljpg60, ... Wo vorher halt alles in die .exe reincompiled wurde.

RWarnecke 29. Dez 2007 19:08

Re: MDI-Form & MDI-Child & DLL's
 
Zitat:

Zitat von Nuclear-Ping
Veraltet und Fehleranfällig würde ich nicht unbedingt sagen. Soweit ich weiß ist das einzige Manko: Man muss die BPLs mit ausliefern, die man im Projekt verwendet hat. Also rtl60, vcl60, vcljpg60, ... Wo vorher halt alles in die .exe reincompiled wurde.

Genau das ist das Problem, was ich nicht machen möchte. Desweiteren weiß ich nicht ob ich diese Dateien vom Turbo Delphi Explorer mitgeben darf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:58 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz