请问我在MDI sheet的onDestroy中写self := nil怎么不执行啊?(100分)

  • 主题发起人 seabelial
  • 开始时间
S

seabelial

Unregistered / Unconfirmed
GUEST, unregistred user!
调试时也不执行,显示为无效断点。

我的应用是一个mdi的,我在close中写了action := cafree,因为我的mdi sheet可以重复调用,所以我做了个判断:
if not assigned(frmSheet1) then
begin
...create
...show
end else
...show

问题是:我关闭了sheet后,sheet并不为nil,所以下才打开时直接就执行else中的show方法,很明显要出错。请问怎么办啊?我在什么地方把SHEET设置为Nil呢?
 
你在什么地方释放SHEET,就在什么地方把SHEET设置为Nil。

 
我做过类似的,但是不会出现你说的问题,不过我不是安你下面的做的,而是查找MDIChild的类名来判断是否存在的。没有问题~
 
在关闭窗体的事件中把参数Action设置为CaFree,就可以了吧;
Action:=CaFree;
看看;
好像其他的什么也不用设置;
上面的代码中的else中我认为应该改为:
frmSheet1.bringtofront;
愚见尔[:D]
 
对不起,我昨天没看清题目;
 
&&&&&&&&&&&&&&&&&&&&
www.517yn.net
&&&&&&&&&&&&&&&&&&&&&
up
 
在Close 时
直接用FreeAndNil函数
 
这个问题讨论过N遍了,在一个类的内部是不能清空其实例指针的,除非你早就把实例
指针传进来了。(见:http://www.delphibbs.com/delphibbs/dispq.asp?lid=1556758)
简单的办法:
const WM_SHEETFREE = WMUSER + 1;
在mdi的,我在close中写action := cafree,再加上
PostMessage(Form1.Handle, WM_SHEETFREE, 0, 0)
// 释放时向主窗口发送自定义消息

在主窗口中截获该消息,并清空其实例指针:
...
procedure WMSHEETFREE(var Msg: TMessage)
message WM_SHEETFREE;
...
procedure TForm1.WMSHEETFREE(var Msg: TMessage);
begin
frmSheet1 := nil;
end;
 
执行函数时的Self是每次以隐含参数的形式传进来的,不可能把实例的指针清空的
在MDI Application中,设置 caFree 足够了,因为Free时会从MdiChild中自动删掉
这还不够吗?在MDI MAIN中的菜单 各个Action应该只对全局的冬冬和 ActiveMdiChild
进行操作
 
我认为,就算是caFree了,也应该不会是nil,可能会指向原来的地址,但是值变了罢了,应该手动加frmSheet1:=nil;用assigned来判断未必适合。
 
多人接受答案了。
 
顶部