关于MDI窗口的子窗口关闭代码通用化问题

 

 

转自:http://hi.baidu.com/chinamis/blog/item/b52b242440c9d23ac995596b.html

 

在form 关闭后 ,窗口变量的指针变没有指向NIL,而是指向一个无效的地址,对于SDI 窗口来说,这不存在问题,但是对于 MDIChild ,则问题多多。

    一般来说,我们应该只需要在 close 事件中写上

Action := CaFree;

就可以解决问题,但是在mdichild 中,写上这行代码等于没有写。

如果有一个窗口为form 2 ,哪么关闭的时候要这样写才能让from2 指向NIL

方法一、

from2.free;

form2:=nil;

方法二、

freeandnil(form2);

上面的代码不存在问题,哪什么地方来的问题?

如果我们想把代码通用化,哪么,FREE 操作完成以后,你就无法让变量再指向nil

相关的通用化变量的使用,都是用指针来完成了,问题就出在这儿,指针只能操作他所指向的变量,而不能改变另一个指向同一地址的变量的指向,所以也就无法完成 更改变量为nil的操作

 

哪常规的主窗口中的代码:

 

if not assigned(form2) then form2:=tform2.create(Self);

//if form2=nil then form2:=tform2.create(Self);

form2.show;

就会无用,因为现在form2 不是空指针。

 

 

Delphi(Pascal) code
 

属性设置: form1.formstyle:=fsMDIform; form2.formstyle:=fsMDIChild; 代码: procedure TForm1.act_Frm2Execute(Sender: TObject); begin if form2=nil then form2:=tform2.Create(self); form2.Show ; end; procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin //freeandnil(tform(sender)); tform(sender).Free ; tform(sender):=nil; end; 如果FORM2中不用类型转换,直接把代码改成: procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin form2.free; form2:=nil; end; 则不会出现问题。

 

 

哪么,这个问题是DELPHI 的一个BUG 吗,相关官方人员没有给一个确切的回答,只是给了一个解决方案:

 

这个解决方案,这个对于小型软件来说,意义不大,但是对于大型的商业项目,确实是个不错的选择:

原贴请见:

http://bbs.codegear-cn.com/viewthread.php?tid=1013&extra=page%3D1

 

相关代码:

问题就在于你写的 if not assigned(child2) then了。我的意思是,不要写这一句,而是将其替换为 if IsInclude(TChild2) then 。 然后在主窗体中写一个函数: function TForm1.isInclude(formclass: TFormClass): boolean; var i: Integer; form: TObject; begin result := false; for i := 0 to MDIChildCount do begin form := MDIChildren[i]; if form is formclass then result := true; end; end; 这样就不需要再复制childn := nil 了。

 

也就是说,现在我们不用管这个指针是否指向NIL,而是在主窗口中查找引用次数,哪现在也就解决了子窗体中的代码不能通用化的问题.

 

最终的调用代码为:

procedure TForm1.form21Click(Sender: TObject); begin if not isInclude(tform2)then form2:=tform2.create(self); form2.show; end;

再修改下,就可以实现通用化了!

(最近如果能休改成功,则会把所有代码贴出来,思路有了,但是细节还是要慢慢的去实现)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值