![]() |
DLL mit Form
Hi
will ein paar meiner sachen in dlls auslagern damit die hauptexe nicht so groß wird. nun hab ich folgendes Problem wie kann ich die dll so einbinden wie ich es normal in meinem hauptproject auch mache das sie nur einmal mit Show anzeigbar ist und mit Hide wieder unsichtbar wird. im momment ist es so das sich die form mehrmal öffnen lässt :/ Exe-File
Delphi-Quellcode:
DLL-File
procedure ShowForm(appHandle: THandle); stdcall; external 'Project1.dll' name 'ShowForm';
... procedure TForm1.Button1Click(Sender: TObject); begin ShowForm(Application.Handle); end;
Delphi-Quellcode:
Ich kann quasi die Form aufrufen und dann in dem moment nur dieser eben aufgerufenen Form etwas zuschicken.
procedure ShowForm(appHandle: THandle); stdcall;
begin if appHandle = 0 then apphandle := GetActiveWindow; Application.Handle := appHandle; try if Form2=nil then // Diese Zeile hat gefehlt Form2 := TForm2.Create(Application); Form2.Show; except On E: Exception Do Application.HandleException(E); end; Application.Handle := 0; end; Exports ShowForm; ich will aber die Form nur einmal aufrufen und auch dann nur dieser Form was zuschicken. Hab schon mehrere Seiten durchforstet aber find nur solche sachen oder showmodal sachen aber man soll ja immernoch die Hauptform nutzen können wenn die DLLForm angezeigt wird. Vielleicht könnt ihr mir ja weiter helfen. Mfg Capa Edit: Habs gefunden war nur ne kleine Zeile die gefehlt hat.
Delphi-Quellcode:
if form2=nil then
|
AW: DLL mit Form
Nun hab ich doch noch ein Problembei untenstehendem Code
wenn ich die Form1 beende beendet sich das Programm nicht wirklich ich muss es dann per TaskManager Killen :/ Code der Exe-File:
Delphi-Quellcode:
Code der DLL:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation procedure CreateForm2(appHandle: THandle); stdcall; external 'DLL1.dll' name 'CreateForm2'; procedure ShowForm2; stdcall; external 'DLL1.dll' name 'ShowForm2'; procedure HideForm2; stdcall; external 'DLL1.dll' name 'HideForm2'; procedure FreeForm2; stdcall; external 'DLL1.dll' name 'FreeForm2'; procedure Test(text1,text2,text3: string); stdcall; external 'DLL1.dll' name 'Test'; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin ShowForm2; Test('Need Help','Capa','DLL Form'); end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := False; try FreeForm2; finally CanClose := True; end; end; procedure TForm1.FormCreate(Sender: TObject); begin CreateForm2(Application.Handle); end; end.
Delphi-Quellcode:
Code der DLL Form:
library DLL1;
uses SysUtils, Classes, Forms, Sharemem, windows, DLLUnit1 in 'DLLUnit1.pas' {Form2}; {$R *.res} procedure ShowForm2; stdcall; begin Form2.Show(); end; procedure HideForm2; stdcall; begin Form2.Hide(); end; procedure CreateForm2(appHandle: THandle); stdcall; begin if appHandle = 0 then apphandle := GetActiveWindow; Application.Handle := appHandle; try if Form2=nil then Form2 := TForm2.Create(Application); except On E: Exception Do Application.HandleException(E); end; Application.Handle := 0; end; procedure FreeForm2; stdcall; begin FreeAndNil(Form2); end; procedure Test(text1,text2,text3: string); stdcall; begin Form2.Listbox1.Items.Add(text1); Form2.Listbox1.Items.Add(text2); Form2.Listbox1.Items.Add(text3); end; exports CreateForm2, ShowForm2, HideForm2, FreeForm2, Test; begin end.
Delphi-Quellcode:
unit DLLUnit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) ListBox1: TListBox; procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caHide; end; end. |
AW: DLL mit Form
Keiner eine Idee worans liegen könnte ?
|
AW: DLL mit Form
Ich habe zwar seit Jahren keine DLLs mit Formularen mehr erstellt, aber IIRC funktioniert das nur dann sauber, wenn die DLL das Form modal anzeigt und anschließend wieder freigibt.
|
AW: DLL mit Form
Du zerschießt dir mit
Delphi-Quellcode:
das Applicationobjekt der DLL, dann vermischst du auch noch die VCL und RTTI der DLL und EXE
Application.Handle := ...
und wunderst dich dann, daß es nicht ordentlich läuft? Lösung: Entweder nicht die die VCL der DLL mit der der EXE verbinden oder auf Laufzeitpackages umsteigen und statt der DLL dieses ebenfalls eine BPL erstellen. |
AW: DLL mit Form
Zitat:
Aber die Funktion "Test" mit String's ist "böse" wenn mann nicht einen passenden Memory-Manager wie ShareMem einsetzt. |
AW: DLL mit Form
sharemem setz ich ja schon ein. funktioniert ja auch der test nur halt das mit dem beenden nicht.
Zitat:
|
AW: DLL mit Form
Zitat:
Du mußt ShareMem sowohl in EXE- als auch DLL-project in der uses-List als erstes(!) einbinden: uses ShareMem, ... Gruß blauweiss |
AW: DLL mit Form
das mit sharemem hab ich geändert.
und auch das mit dem show/free hab nun caFree und create beim aufruf solange nicht schon vorhanden allerdings wenn ich die form schliesse und dann wieder neu öffnen will bekomm ich nen fehler Zitat:
|
AW: DLL mit Form
Hallo Capa,
Action=caFree im OnClose gibt die Form zwar frei, aber Deine Instanz (Form2) wird dabei nicht auf nil gesetzt -> die nächste Abprüfung auf nil (in CreateForm2) ergibt false, die Form wird nicht neu erzeugt -> AV beim Show-Versuch. Vorschlag: Entweder Action=caHide oder im Forum suchen, wie "Form nil setzen nach Schließen" o.ä. funktioniert. Gruß, blauweiss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 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-2025 by Thomas Breitkreuz