AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MDI-Form & MDI-Child & DLL's

Ein Thema von RWarnecke · begonnen am 12. Dez 2007 · letzter Beitrag vom 29. Dez 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

MDI-Form & MDI-Child & DLL's

  Alt 12. Dez 2007, 19:38
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#2

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

  Alt 19. Dez 2007, 16:41
Ja, im Prinzip ist es möglich.
Wie war das noch ...

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:
fCreateForm(Application,Form1);
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 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 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.
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#3

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

  Alt 19. Dez 2007, 16:48
Du kannst Forms in BPLs auslagern.

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

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#4

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

  Alt 19. Dez 2007, 21:27
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
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#5

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

  Alt 26. Dez 2007, 14:31
Danke erstmal für eure Antworten.
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 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:
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

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

  Alt 29. Dez 2007, 13:09
*dezentes push* Hat keiner für mich einen Tipp ? *dezentes push*
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#7

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

  Alt 29. Dez 2007, 13:12
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.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#8

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

  Alt 29. Dez 2007, 13:26
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#9

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

  Alt 29. Dez 2007, 13:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#10

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

  Alt 29. Dez 2007, 20:08
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.
Rolf Warnecke
App4Mission
  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 02:41 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