form2是动态创建的,我在form2里的FormClose里面写了这样代码
action:=cafree;
if Assigned(changemodify) then
changemodify.Free;
TForm2(sender):=nil;
其中changemodify是我定义的一个私有变量,类型是Tstringlist。我是在FormCreate里面创建的changemodify:=tstringlist.Create;现在又2个问题:1.有人说在FormCreate创建,最好在FormCloseQuery里释放?为什么
2.FormClose里面的代码。action:=cafree;这个不是已经将窗体和代码释放了吗?为什么Assigned(changemodify)还是为true呢?
action:=cafree;
if Assigned(changemodify) then
changemodify.Free;
TForm2(sender):=nil;
其中changemodify是我定义的一个私有变量,类型是Tstringlist。我是在FormCreate里面创建的changemodify:=tstringlist.Create;现在又2个问题:1.有人说在FormCreate创建,最好在FormCloseQuery里释放?为什么
2.FormClose里面的代码。action:=cafree;这个不是已经将窗体和代码释放了吗?为什么Assigned(changemodify)还是为true呢?
解决方案 »
- 好久没来看大家了,整理个串口通信的程序给大家做参考吧!撒分!
- 如何把一篇文章的字符根据指定的中英文标点符号分割?
- 关于dbgrid多行修改的问题。(续一个比较简单的数据更新问题,在线等待)
- 关于DBGrid的奇怪问题????急!!!急!!!急!!!
- 大富翁最近一个月一直上不去, 是我们网络有问题 还是大富翁出了问题
- 关于TStream的问题:如何得到一个指定的文件大小的stream?
- 点击对象检视器里的commandtext弹出的对话框的密码的问题,请高手指教。
- 99分请教: 如何将字符串转化为tform做参数使用? (100%结贴率)
- Canvas的问题(急)
- 动态库中使用SpComm 读写串口问题
- 求ReportBuilder Enterprise Edition V5.0 for d5
- IDFtp多线程下载的问题
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
if Assigned(TForm(self.Owner)) then
enablewindow(TForm(self.Owner).handle,true);//这个是让主窗口可用
except on E: Exception do
if Assigned(TForm(self.Owner)) then
enablewindow(TForm(self.Owner).handle,true);//可用
end;
action:=cafree;
changemodify.Free;
TForm2(sender):=nil;
end;
我的程序里面都用到这个
意思 是释放不够彻底?指针还没释放?
问题2:action只是个标志,为了向后一个操作表明它的上一个操作的某种需求,可以肯定在onclose事件中窗体还没有被释放。
action参数的作用是让你决定FormClose结束后如何执行关闭操作,
caFree:释放窗体
caHide:隐藏窗体
caMinimize:最小化窗体
在FormClose执行完成后,VCL会根据你对action参数的赋值情况来进行相应的处理
与onCreate对应的是onDestroy。
2.你的意思是最好写在这onDestroy里面?
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
if Assigned(TForm(self.Owner)) then
enablewindow(TForm(self.Owner).handle,true);//这个是让主窗口可用
except on E: Exception do
if Assigned(TForm(self.Owner)) then
enablewindow(TForm(self.Owner).handle,true);//可用
end;
action:=cafree;//这句只是修改标志,放在这个事件哪里都无所谓。
changemodify.Free;//最好是用Freeandnil(changemodify);让指针为空值
TForm2(sender):=nil;//这句可以省略
end;
OnDestroy在对象析构之前被调用。
在OnClose如果有action:=cafree的时候都会调用到OnDestroy,如果Action没有赋值为caFree,窗体对象是不会释放的,也不会调用析构函数,析构函数是你最后可以释放相关地方。
如果你在OnDestroy里把其他资源释放了,但没有action:=cafree,窗体本身不会释放,如果你后面的对窗体进行处理时用到了被释放的资源就会报错。
可以去看看VCL的源代码,了解了窗体对象是怎么创建和释放后,在哪里写代码都可以,方法不只一种。OnClose和Ondestroy都可以用,就看你具体怎么用了。附上一点源代码 procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;CloseQuery
DoClose
Release就自己看吧。
如果你在OnClose里把其他资源释放了,但没有action:=cafree,窗体本身不会释放,如果你后面对窗体进行处理时用到了被释放的资源就会报错,
这一句话是不是有错误? fsModal in FFormState为false则 CloseQuery都会调用到???
CloseModal里面有有调用CloseQuery。
谢谢你哈 我再看看琢磨下
Action:=caFree注释跟不注释的结果大不同
procedure TForm2.FormDestroy(Sender: TObject);
begin
ShowMessage(' Form2 is Destroying!');
end;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Action:=caFree;end;
end;[/code]
看源代码是最好的方法!
begin
//Action:=caFree
end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
showmessage('sdf');
end;
是
procedure TForm2.FormDestroy(Sender: TObject);
begin
ShowMessage(' Form2 is Destroying!');
end;OnCloseQuery会先执行,跟OnCloses木有关系,
古都的调用顺序如下:
OnCloseQuery
OnCloses
OnDestroy
自己看TCustomForm的源代码吧