hallo zusammen
ich hab folgendes Problem:
ich habe eine Form in einer DLL und möchte diese Modal anzeigen - kein Problem und denkt an: Application.Handle := AHandle;
das funktioniert ja auch - aber erst nach dem zweiten Aufruf der ShowModal Funktion: !?
(Detailbeschreibung:
Beim ersten Aufruf der ShowModal Funktion wird ein eigenes Fenster für die Form in der
DLL in der Taskleiste angezeigt. Wenn ich alle Fenster minimiere und das Fenster der Hauptapplikation dann wieder anklicke, erscheint die Hauptapplikation - nicht aber wie erwartet die ModalForm aus der
DLL. Wenn ich dann die ModalForm schliesse und mir erneut anzeige ohne die Applikation zu schliessen, dann funktionierts korrekt?)
((ich hab hier auch schon einige threads zu diesem thema gefunden, deshalb hat meinem Testprojekt im attachment auch ähnlichkeiten mit dem
dll tutorial von
http://assarbad.net))
vielleicht kann mir ja bitte jemand helfen?
meine
DLL:
Delphi-Quellcode:
library VCL_SampleDLL;
uses
Forms,
Windows,
FormUnit1 in 'FormUnit1.pas' {FormDLL};
procedure FormShowModal(AHandle: THandle); stdcall;
begin
with TFormDLL.Create(nil) do
begin
AHandleInCreate := AHandle; //für einen Versuch über SetParent
Application.Handle := AHandle;
ShowModal;
Free;
end;
end;
exports
FormShowModal;
end.
meine Form in der
DLL:
Delphi-Quellcode:
unit FormUnit1;
interface
uses
dialogs, Windows, Forms, Classes, StdCtrls, Controls, unit3;
type
TFormDLL =
class(TForm)
procedure FormCreate(Sender: TObject);
private
public
AHandleInCreate: THandle;
end;
var
FormDLL: TFormDLL;
implementation
{$R *.DFM}
procedure TFormDLL.FormCreate(Sender: TObject);
begin
FormDLL := Self;
Windows.SetParent( FormDLL.Handle, AHandleInCreate );
end;
end.
und meine
Unit in welcher ich die
DLL aufrufe:
Delphi-Quellcode:
unit AppFormUnit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, unit2;
type
TForm1 =
class(TForm)
Button1: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
const
dllname = '
VCL_SampleDLL.dll';
type
TFNFormShowModal =
procedure(AHandle: THandle);
stdcall;
var
FormShowModal: TFNFormShowModal =
nil;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(FormShowModal)
then
FormShowModal(Application.Handle);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
form2.ShowModal;
end;
var lib: HMODULE;
initialization
lib := LoadLibrary(@dllname[1]);
if lib <> 0
then
@FormShowModal := GetProcAddress(lib, '
FormShowModal');
finalization
if lib <> 0
then
FreeLibrary(lib);
end.
vielen dank für euren Input