我在MainForm上放了一个Panel,我想把DLL中的窗体放到这个Panel上。程序如下:
//我先自己做了一个窗体, ChildForm.FormStyle:=fsNormal;unit ChildFrm;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, Menus;type TChildForm = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction); private
FAsChild: Boolean;
FTempParent: TWinControl;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce;
overload; end;var
ChildForm: TChildForm;
RequireAction: Boolean;implementation{$R *.DFM}constructor TChildForm.Create(AOwner: TComponent);
begin
FAsChild := False;
inherited Create(AOwner);end;constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
FAsChild := True;
FTempParent := aParent;
inherited Create(AOwner);
end;
procedure TChildForm.Loaded;
begin
inherited;
if FAsChild then
begin
align := alClient;
BorderStyle := bsNone; //??
BorderIcons := [];
Parent := FTempParent;
Position := poDefault;
Scaled := false;
end;
end;procedure TChildForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
if FAsChild then
Params.Style := Params.Style or WS_CHILD;
end;procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
RequireAction := False;
Action:=caFree;
end;end./////////////////////////////////TDLLForm1 = class(TChildForm)
输出函数是这样写的:
function TestformCreat(mymainform:TForm; PWin: TWinControl): TChildForm; stdcall;
var
Form1: TDLLForm1;
ptr:PLongInt;
begin
ptr:=@(Application.MainForm);
ptr^:=LongInt(mymainform);
Application.Handle:=mymainform.Handle; //保存在任务栏不出现图标
Form1:=TDLLForm1.Create(Application, PWin);
Form1.Show;
Result:=Form1;
end;exports
TestformCreat;在调用时,什么都看不到。可如果在Exe中调另一个ChildForm子窗体(非DLL形式),再关闭它,就可以看到DLLForm了。怎么回事?搞不明白!
//我先自己做了一个窗体, ChildForm.FormStyle:=fsNormal;unit ChildFrm;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, Menus;type TChildForm = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction); private
FAsChild: Boolean;
FTempParent: TWinControl;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce;
overload; end;var
ChildForm: TChildForm;
RequireAction: Boolean;implementation{$R *.DFM}constructor TChildForm.Create(AOwner: TComponent);
begin
FAsChild := False;
inherited Create(AOwner);end;constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
FAsChild := True;
FTempParent := aParent;
inherited Create(AOwner);
end;
procedure TChildForm.Loaded;
begin
inherited;
if FAsChild then
begin
align := alClient;
BorderStyle := bsNone; //??
BorderIcons := [];
Parent := FTempParent;
Position := poDefault;
Scaled := false;
end;
end;procedure TChildForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
if FAsChild then
Params.Style := Params.Style or WS_CHILD;
end;procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
RequireAction := False;
Action:=caFree;
end;end./////////////////////////////////TDLLForm1 = class(TChildForm)
输出函数是这样写的:
function TestformCreat(mymainform:TForm; PWin: TWinControl): TChildForm; stdcall;
var
Form1: TDLLForm1;
ptr:PLongInt;
begin
ptr:=@(Application.MainForm);
ptr^:=LongInt(mymainform);
Application.Handle:=mymainform.Handle; //保存在任务栏不出现图标
Form1:=TDLLForm1.Create(Application, PWin);
Form1.Show;
Result:=Form1;
end;exports
TestformCreat;在调用时,什么都看不到。可如果在Exe中调另一个ChildForm子窗体(非DLL形式),再关闭它,就可以看到DLLForm了。怎么回事?搞不明白!
DLLForm
的Parent指向它的父窗体(例如你指定的panel)就行了。