Thema: Delphi Form in DLL - ShowModal

Einzelnen Beitrag anzeigen

heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#1

Form in DLL - ShowModal

  Alt 26. Jun 2006, 14:35
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
Angehängte Dateien
Dateityp: rar test_863.rar (7,9 KB, 28x aufgerufen)
  Mit Zitat antworten Zitat