关于把 MDIChild 做在 DLL中.我已经做出来了,运行也没问题. 但遇到点小问题. 子窗体显示后,主窗体的 ActiveMDICHild 还是为 nil

  • 主题发起人 主题发起人 QSmile
  • 开始时间 开始时间
Q

QSmile

Unregistered / Unconfirmed
GUEST, unregistred user!
关于把 MDIChild 做在 DLL中.我已经做出来了,运行也没问题. 但遇到点小问题. 子窗体显示后,主窗体的 ActiveMDICHild 还是为 nil ,请教高手,如何解决?(100分)<br />关于把 MDIChild 做在 DLL中.我已经做出来了,运行也没问题. 但遇到点小问题. 子窗体显示后,主窗体的 ActiveMDICHild 还是为 nil ,请教高手,如何解决?<br><br>子窗体可以显示出来了.运行结果也是正确的.没什么错.现在就有这样一点小问题<br><br>DLL 子窗体游活后 主窗体的 ActiveMDIChild 还是为 nil 的<br><br>而激活不是DLL里的子窗本,那么 ActiveMDICHild 就为当前显示的子窗体.<br><br>如何办?<br><br>DLL 原理代码:<br>library MyDLL1;<br><br>uses<br> &nbsp;Windows,<br> &nbsp;Messages,<br> &nbsp;SysUtils,<br> &nbsp;Classes,<br> &nbsp;Graphics,<br> &nbsp;Controls,<br> &nbsp;Forms,<br> &nbsp;uForm1 in 'uForm1.pas' {frmDLLForm};<br><br>{$R *.res}<br><br>var<br> &nbsp;DLL_App : TApplication;<br><br>procedure ShowForm1(App:TApplication; frmParent:TForm); export; stdcall;<br>var<br> &nbsp;f:TfrmDLLForm;<br>begin<br> &nbsp;Application := App;<br> &nbsp;f := TfrmDLLForm.Create(frmParent); // TfrmDLLForm 为 MDIChild<br> &nbsp;f.Show;<br>end;<br><br><br>exports<br> &nbsp;ShowForm1;<br><br>begin<br> &nbsp;Dll_App := Application;<br> &nbsp;DllProc := @MyDllProc;<br>end.
 
还有一个<br>procedure MyDllProc(Reason:Integer);<br>begin<br> &nbsp;case Reason of<br> &nbsp; &nbsp;DLL_PROCESS_DETACH:<br> &nbsp; &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Application := DLL_App;<br> &nbsp; &nbsp; &nbsp; &nbsp;end;<br> &nbsp;end;<br><br>end;
 
procedure ShowForm1(App:TApplication; frmParent:TForm); export; stdcall;<br>var<br> &nbsp;f:TfrmDLLForm;<br>begin<br> &nbsp;Application := App;<br> &nbsp;f := TfrmDLLForm.Create(frmParent); // TfrmDLLForm 为 MDIChild<br> &nbsp;f.Parent:=Parent;//你加上试试看。<br> &nbsp;f.Show;<br>end;
 
f.Parent:=Parent;//你加上试试看。<br><br>------------------<br>加上不行. 不知道为什么加上这句, MDIChild 窗体闪一下就不见,而且程序关闭时会出现严重错误.
 
ShowForm1(App:TApplication; frmParent:TForm; Scren: TScreen); export; stdcall;<br>begin<br> &nbsp;Screen := Scren;<br>.....
 
主控和dll都需带包编译(最简单也是最好的办法),也可以传screen
 
我改了代码了。传了 Screen ,还是不能用 &nbsp;ActiveMDIChild
 
用 ChildFormCount 可以正准读出子窗体个数。
 
这个问题是不太好处理,我也查了很多资料。包括FREE等问题,出错也无法预测。<br>技术交流QQ:136293586
 
Free 这个问题我解决了.<br><br>如果是一般应用都是没问题的.只是我主窗体用了 TBX.一个菜单与工具栏控件. 这时 DLL 子窗体最大化后有关闭按钮在菜单栏出现.但点它不能关闭子窗体.<br>因为它是用 ActiveMDIChild &nbsp; 来访问的<br>而这个属性为 nil
 
我最近也在弄这个东西,可以正常的生成子窗体,但是关闭一次后子窗体对象老是无法释放<br>导致无法再次生成窗体。<br>if not Assigned(LoginFrm) then<br> &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MessageBox(0, '版本:1.0', '提示', MB_OK + MB_ICONINFORMATION + MB_TOPMOST);<br><br><br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//Application.CreateForm(TLoginfrm,loginfrm);<br><br><br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loginfrm:=Tloginfrm.Create(ffrm);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//loginFrm.ParentWindow:=ffrm.Handle;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//LoginFrm.Parent:=Ffrm;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loginfrm.FormStyle:=fsMDIChild;<br><br> &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp; &nbsp;LoginFrm.Show;
 
带包编译吧。<br>带上vcl,rtl这两个包
 
后退
顶部