在MDI窗口中如何控制子窗口(35分)

  • 主题发起人 主题发起人 kim_fu
  • 开始时间 开始时间
K

kim_fu

Unregistered / Unconfirmed
GUEST, unregistred user!
在MDI主窗口中。可以使用 ActiveMdiChild获得当前的活动的子窗口,
但问题是。当我使用以下代码调用DLL中的子窗口时。MDIChildCount根本没有加一
而ActiveMdiChild也获得不了当前活动的子窗口。但是我确实创建了DLL中的子窗口
下面是代码。是不是代码有问题?(这个代码也是在论坛上别人给我的)
只剩下35分了。全给了。
Dll的写法
Exports
TechTemplateFormCreate; //¹¤ÐòÄ£°å

Var DllApplication:TApplication;
DllScreen:TScreen;

{$R *.RES}

procedure LibraryProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Screen:=DllScreen;
Application:=DllApplication;
end;
end;

begin
DllApplication:=Application;
DllScreen:=Screen;
DLLProc:=@LibraryProc;
end.
----------------------------------------
TechTemplateForm
-------------
Procedure TechTemplateFormCreate(MDIApplication:TApplication);Export;

implementation

{$R *.DFM}

Procedure TechTemplateFormCreate(MDIApplication:TApplication);Export;
begin
if (not Assigned(TechTemplateForm)) then
begin
Application:=MDIApplication;
TechTemplateForm:=TTechTemplateForm.Create(Application);
end
else
begin
//TechTemplateForm.WindowState:=wsNormal;;
TechTemplateForm.BringToFront;
end;
end;

 
自己给自己提前。帮忙啊。
 
这句TechTemplateForm:=TTechTemplateForm.Create(Application);
应该为Application.CreateForm(TTechTemplateForm,TechTemplateForm);
 
这两句话不是一样的吗?
 
原因非常简单,因为你的MainForm的TScreen没有传递给你的MdiForm
if Reason = DLL_PROCESS_DETACH then
begin
Screen:=DllScreen;
^^^^^^^^^^^^^^^^^^^^^//这个是还原MdiForm的Tscreen的,
Application:=DllApplication;
end;
你在procedure "TechTemplateFormCreate"中的
"TechTemplateForm:=TTechTemplateForm.Create(Application);"
之前 应该把MainForm 的 TScreen的一起传递进来,并且赋值
不过,我提醒你一下,你的这个Dll编写得非常不好,有非常大得隐患
你第一访问不会有问题,不过~~~呵呵,你自己试试,我说得不一定正确
 
to hsw :

谢谢你。我试试。你能否给我一个好的DLL的写法?
 
to hsw

我把 Screen 传过去后。果然在MDI主窗口中的 MdiChildCount 反应出有这个子窗口
创建了。创建一个值也加一了,问题是。只要我创建了一个这个DLL中的子窗口。程序就不
能正常关闭。一关闭就出错。是什么问题呢?
 
楼上的,问题解决了吗?我也出现这问题
 
后退
顶部