Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Form in DLL - ShowModal (https://www.delphipraxis.net/72152-form-dll-showmodal.html)

heri 26. Jun 2006 13:35


Form in DLL - ShowModal
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

heri 27. Jun 2006 13:26

Re: Form in DLL - ShowModal
 
hallo DPler

ich hab nochmals alle möglichen und unmöglichen ideen durchprobiert - doch ich kriegs nicht hin :(

vielleicht hat jemand ein bisschen beispielcode wo's funktioniert?
eine Form in einer DLL welche Modal angezeigt wird?

thx 4 every input

mirage228 27. Jun 2006 13:52

Re: Form in DLL - ShowModal
 
Hi,

was passiert, wenn du in der DLL das Application.Handle vor dem Form.Create setzt?

mfG
mirage228

heri 27. Jun 2006 14:27

Re: Form in DLL - ShowModal
 
you are the hero! :hello: yes that's it!

manchmal kommt man auf die 'einfachsten' sachen nicht, deshalb an alle hier die LÖSUNG:
man muss den Application Handle vor dem FormCreate zuweisen:

Delphi-Quellcode:
procedure FormShowModal(AHandle: THandle); stdcall;
begin

  Application.Handle := AHandle;

  with TFormDLL.Create(nil) do
  begin

    ShowModal;

    Free;

  end;

end;
thx a lot - i'm :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 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