我现在想做个EXE调DLL中的窗体的程序
要求如下:
1、EXE中的主窗体为fsNormal
2、Dll中的Form为fsMDIForm
3、Dll中的Form要嵌入到EXE中的主窗体的一个Panel中
4、这个Panel的大小是可变的(即,是alClient的)
5、Dll中的Form要融合到EXE中的主窗体中(即,在主窗体移动、大小变化时Form要随之变化)
......
不知道说得清不清楚?其实我就是想在ChildForm中再嵌有Child!
要求如下:
1、EXE中的主窗体为fsNormal
2、Dll中的Form为fsMDIForm
3、Dll中的Form要嵌入到EXE中的主窗体的一个Panel中
4、这个Panel的大小是可变的(即,是alClient的)
5、Dll中的Form要融合到EXE中的主窗体中(即,在主窗体移动、大小变化时Form要随之变化)
......
不知道说得清不清楚?其实我就是想在ChildForm中再嵌有Child!
。PARENT:=FORM1
dbExpress(都是昵称惹的祸)
能不能说的详细点?
能不能给个例子?
谢谢~
2年没用过DELPHI了
只是知道能够找到窗体的HANDLE,然后就可以操作了似乎是这样
//------------------------------------------------------------program MainFormProj;uses
SysUtils,
Classes,
Windows,
Forms,
Controls,
ExtCtrls;type
TMainForm = class(TForm)
private
fChildFormHandle: THandle;
fChildFormControl: TForm;
fPanel: TPanel;
procedure FormShow(aSender: TObject);
procedure FormDestroy(aSender: TObject); procedure PanelClick(aSender: TObject);
public
constructor Create(aOwner: TComponent); override;
end;var
MainForm: TForm;{$R *.res}const
DLLProj = 'DLLProj.dll';function CreateForm: THandle; stdcall; external DLLProj name 'CreateForm';
procedure FreeFrom(const aFormHandle: THandle); stdcall; external DLLProj name 'FreeForm';{ TDummyObj }procedure TMainForm.FormShow(aSender: TObject);
begin
Caption := 'MainForm'; //创建Panel
fPanel := TPanel.Create(Self);
fPanel.Align := alClient;
fPanel.OnClick := PanelClick; //主窗显示完毕后,点击Panel就可以看到DLL的子窗
fPanel.Parent := Self;
end;procedure TMainForm.PanelClick(aSender: TObject);
begin
//创建DLL的子窗
fChildFormHandle := CreateForm;
fChildFormControl := TForm(FindControl(fChildFormHandle));
fChildFormControl.Caption := 'ChildForm';
fChildFormControl.Parent := fPanel;
fChildFormControl.Align := alClient;
fChildFormControl.Visible := True;
end;procedure TMainForm.FormDestroy(aSender: TObject);
begin
//释放子窗
FreeFrom(fChildFormHandle);
fChildFormControl := nil;
end;constructor TMainForm.Create(aOwner: TComponent);
begin
inherited CreateNew(aOwner, 0); OnShow := FormShow;
OnDestroy := FormDestroy;
end;begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.//DLL Source
//----------------------------------------------------------------------
library DLLProj;uses
SysUtils,
Forms,
Controls;{$R *.res}function CreateForm: THandle; stdcall;
begin
Result := TForm.Create(nil).Handle;
end;procedure FreeForm(const aFormHandle: THandle); stdcall;
begin
FindControl(aFormHandle).Free;
end;exports
CreateForm,
FreeForm;
begin
end.
看着你的代码觉得...
高手 :)
等我试试
谢谢先
不行~
:(
最起码DLL中无法正常使用MDI
这不行!另,让我换换思路我也想呀!
本来这就已经换了思路了!——原来是想MDI下再有MDI
:(怎么办?
我现在的最简单的需求就是:要有三个层次的窗体结构(不一定非要DLL形式,其实这应该不是主要问题吧?!我想)
要是可以的话我另开贴给你分
:)
大侠,我要的不是DLL调用MDIChild
这只是两级的!我是要三级窗体关系
:(不过还是谢谢你的热心
:)
把 anh(hananying) 代码给大家看看啊
说不定就可以解决呢
主程序是一个MDIFORM 的,那个算不算呀。
有问题请发信息到我的E-mail:[email protected]
大侠,我要的不是DLL调用MDIChild
这只是两级的!我是要三级窗体关系我给你的是一个主程序(MDIFORM)调用DLL 中的子窗口,在子窗中再调用一个一般的窗口。
而不是你说的,”DLL调用MDIChild“,你的,明白!!!你说我这是几层的呀。