![]() |
Unit geht, DLL nicht
Hallo zusammen,
bin am verzweifeln und hoffe auf eure Hilfe. :cry: Ich möchte ein Form in ein Mainform platzieren (ähnlich MDIChild). Da aber Verwaltungsaufgaben in MainForm noch auszuführen sind, muss das DLLForm in MainForm zugänglich sein. Für Units (über uses) ist das kein Problem, bei DLLs sieht das jedoch anders aus. Deshalb habe ich mir folgenden Aufbau ausgedacht:
Delphi-Quellcode:
Soweit funktioniert auch alles. Wenn ich nun die DLL_1_U1 als DLL-Datei einbinde (siehe "// Entweder als DLL..." in unit DLL_0_U1), wird das Fenster auch erzeugt und angezeigt. Doch bei der Zuweisung
unit DLL_0_U1;
interface uses ShareMem, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TMainForm = class(TForm) OpenDLLForm: TButton; procedure OpenDLLFormClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; // Entweder als DLL oder als Unit einbinden - siehe unten // function Show_DLLForm : TForm; stdcall; external 'DLL_1.DLL'; var MainForm: TMainForm; implementation {$R *.DFM} // Entweder als DLL (siehe oben) oder als Unit einbinden uses DLL_1_U1; procedure TMainForm.OpenDLLFormClick(Sender: TObject); var F : TForm; begin F := Show_DLLForm; F.Top := 1; F.Left := 1; F.Visible := true; Application.ProcessMessages; // nur zum Debuggen F.Parent := MainForm; // DLLForm als Child vom Mainform Application.ProcessMessages; // F.Show; // wird nicht gebraucht, da durch Create angezeigt ?! end; end. unit DLL_1_U1; interface uses ShareMem, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TDLLForm1 = class(TForm) Label1: TLabel; private { Private-Deklarationen } public { Public-Deklarationen } end; function Show_DLLForm : TForm; implementation {$R *.DFM} function Show_DLLForm : TForm; var DLLForm: TDLLForm1; begin DLLForm := TDLLForm1.Create (Application); Result := TForm (DLLForm); end; end. F.Parent := MainForm; verschwindet das Fenster. Einfach weg! :wall: Ich würde es jedoch gerne über DLLs lösen. Nur der Vollständigkeit halber:
Delphi-Quellcode:
Hat jemand eine Erklärung dafür oder noch besser EINE LÖSUNG ???
library DLL_1;
uses ShareMem, SysUtils, Classes, DLL_1_U1 in 'DLL_1_U1.pas' {DLLForm1}; {$R *.RES} exports Show_DLLForm name 'Show_DLLForm'; begin end. [edit=sakura] Nicht aller Text muss fett sein :roll: Mfg, sakura[/edit] |
Re: Unit geht, DLL nicht
Verwende keine "normale" DLL sondern Delphi-Packages. Mit normalen DLL's hast Du das Problem das TObject aus DLL <> TObject aus Exe ist und du 2 komplett unabhängige Klassenbibliotheken hast.
Die andere Lösung ist nicht VCL-Objekte aus der DLL in die Exe zu übergeben sondern auf Win32-API-Ebene herunterzusteigen und mit Windows-Handles zu arbeiten. |
Re: Unit geht, DLL nicht
Mit Packages stehe ich auf Kriegsfuß. Gerade wenn man noch viel an den Units ändern muss, bekomme ich immer Probleme. Daher ist mir Deine 2. Variante lieber. Dass die DLL das Handle vom Form zurückliefert (statt TForm), ist keine Problem. Nur wie kann ich über das zurückgelieferte Handle wieder auf die Eigenschaften des DLL-Form zugreifen?
|
Re: Unit geht, DLL nicht
Zitat:
|
Re: Unit geht, DLL nicht
Hmm, das klingt nach sehr viel Arbeit - hmm, und nach noch mehr nötigem (und nicht vorhandenem) Know-How.
Na ja, vielleicht werde ich es doch mit packages versuchen. Trotzdem erstmal DANKE! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 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