?主窗体不识DLL创建的子窗体,如何解决?(100分)

  • 主题发起人 主题发起人 踏雪无痕
  • 开始时间 开始时间

踏雪无痕

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟在用DLL做MDI子窗体的时候,发现MDI主窗体找不到子窗体,也就是当我创建了子窗体后,
主窗体的MDIChildCount属性还是为0,ActiveMDIChild属性值为nil,问哪位高手能解决此问题?
否则,我无法向子窗体发送消息,比如打印,保存等。此外,一个DLL能否共享另一个DLL中的变量,
书上讲得较多的是两个应用程序共享一个DLL中的变量。
 
参看http://www.delphibbs.com/delphibbs/dispq.asp?lid=534762
 
请参考:http://www.delphibbs.com/delphibbs/dispq.asp?lid=540766
 
难道没有人能解决此问题吗?
 
你可以在主程序中添加一个子窗口,然后在子窗口中添加FormPanel控件
你从Dll中取出窗口后
TFrm_Child(FSrvChildForm).FormPanel1.AddForm(FSrvForm,False);

TFrm_Chlid(FSrvChildForm) :主程序中的子窗口
FSrvForm : Dll中的窗口
 
FormPanel是Delphi标准控件吗?
 
to 踏雪无痕:
没看看540766这个帖子吗?你要把 exe 主程序中的 Application 传给 Dll,替换 Dll 中
的 Application 才行的, 不光是 Application 的 Handle.
 
TO bbkxjy:
替换了的,创建子窗体的时候,传递了三个参数一个是应用程序(主程序)的Application,还有父窗体还有要创建的子窗体的标题。
Dll中中的代码如下:
procedure CreateChild(ParentApplication: TApplication; ParentForm: TForm;ACaption:String); export; stdcall;
var
Form1: TForm1;
begin
Application:=ParentApplication;
Form1:=TForm1.Create(ParentForm);
Form1.Caption:=ACaption;
Form1.Show;
end;
主程序中如下:
procedure TfrmMain.N4Click(Sender: TObject);
var
DllHandle: THandle;
ProcAddr: FarProc;
CreateChild: T_CreateChild;
begin
DllHandle := LoadLibrary('UseDataDll');
ProcAddr := GetProcAddress(DllHandle, 'CreateChild');
if ProcAddr <> nil then
begin
CreateChild := ProcAddr;
CreateChild(Application,self,'DLL子窗体');
end;
end;
但不行。
 
怪了,你的代码跟我从深度历险下的一个例子里的差不多啊,怎么我试就没问题?在主窗口或
子窗口中读出的 Mainform 的 MDIChildCount 都 > 0,难道子窗口没有设成 fsMDIChild?
应该不会,真怪...不行你就让 Dll 中函数返回类型为 TForm 吧,主程序中将返回值保存起
来.
 
To bbkxjy:
帖子我看过了,很好,但我还是没有办法解决问题,麻烦你试一试,当创建了子窗体后,看一看
主窗体的MDIChildCount的值是多少,改control.pas的内容也试过了。还是没办法,我原来就用应用程序的
Application对象替换Dll的Application。
 
对了,你要把主程序中的 Screen 对象也传给 Dll,替换 Dll 中的 Screen 对象,就跟 Application
一样处理.看看 TCustomGorm.GetMDIChildCount 这个方法,它是遍历 Screen 对象中的 Forms
列表,返回 Style 为 fsMDIChild 的 form 的数量.所以会有问题.
 
非常谢谢,问题解决了!
 
后退
顶部