主窗体(FORMSTYLE=FSMDIFORM),调用DLL子窗体的时候,只要把它的FORMSTYLE设置为FSMDICHILD,调用的时候就出现cannot create form,No MDI Forms are currently active;
说什么就是找不到主窗体,设置成FSNORMAL,就能正常调用,各位大虾们有没有高招指点一下?
怎么样才能调用DLL子窗体而且另调用它的窗体与之建立父子关系,谢谢!
说什么就是找不到主窗体,设置成FSNORMAL,就能正常调用,各位大虾们有没有高招指点一下?
怎么样才能调用DLL子窗体而且另调用它的窗体与之建立父子关系,谢谢!
解决方案 »
- 如何判断输入的是中文逗号
- WinAPI TextOut
- 报表问题
- 如何使用IdCoderMD5?在线等
- ★★在NT系统下网络掉线的消息★★
- 承诺大送分!!Delphi的通讯端口控件有哪些,对于串口IC卡读写器的控制问题,再线等候,谢谢!!!
- 各位兄弟哪儿有DELHPI 5.0 的升级程序??????????????????????拜托!!!!!!!!
- 怎样使调用外部程序显示在最前面?
- 如何在打开子窗口的时候让主窗口的菜单disable?
- 大侠们:请看我的这段程序有什么不对地方吗?(关于读文件的)
- *********COM+更新组件后,客户端如何能自动找到更新后的接口*************
- ListView中能不能设置某个列的每一行有个下拉框?
Application := AApp;
AApp时传递过来的exe的application。
我的代码是这样的:
function ShowUserForm(aHandle:THandle;aCaption:PChar):boolean;stdcall;
begin
Application.Handle:=aHandle;
try
UserForm:=TUserForm.Create(Application);
UserForm.Show;
UserForm.Caption:=aCaption;
except
UserForm.free;
end;
Result:=true;
end;需要那里加点什么吗?!
因为exe和dll在分别两块地址段中,
比如exe里用了forms单元,dll里也用了forms单元,
exe里的application和dll里的application是不同的对象.
所以forms单元里的公共变量都要传过去,而且释放dll的时候
application要还原,否则exe里的application就丢失了.
做MDI的时候问题还远不止这些,不伦是否创建了子窗体,
你会发现ActiveMDIChild永远为空.如果非要这样,最好使用带包编译.
是application
begin
Application.:=AApp;
try
UserForm:=TUserForm.Create(Application);
UserForm.Show;
UserForm.Caption:=aCaption;
except
UserForm.free;
end;
Result:=true;
end;
var
Form1: TForm1;
ptr:PLongInt;
begin
ptr:=@(Application.MainForm);//先把dll的MainForm句柄保存起来,也无须释放,只不过是替换一下
ptr^:=LongInt(mainForm);//用主调程序的mainForm替换DLL的MainForm。MainForm是特殊的WINDOW,它专门管理Application中的Forms资源.
//为什么不直接Application.MainForm := mainForm,因为Application.MainForm是只读属性
Form1:=TForm1.Create(mainForm);//用参数建立
end;
备注:参数是主调程序的Application.MainForm