如何释放通过Show()显示的窗体?
如何释放通过Show()显示的窗体?
楼主Cuteric(What?)2002-11-22 19:53:24 在 C++ Builder / 基础类 提问 代码如下
TfrmTest* frmTest = new TfrmTest(Application);
frmTest->Show();
...
以上代码,frmTest显示出来之后,在什么地方delete呢?
我试过在frmTest的OnClose事件中调用delete this,发现可以释放,但偶尔会出异常。
我就想不通还有什么地方可以释放呢? 问题点数:20、回复次数:11Top
1 楼whitelion(www.ccproj.com)回复于 2002-11-22 19:59:37 得分 0
在完成显示任务后就可以释放了。
但是不能在frmtest的内部函数中释放.Top
2 楼invalid(空心菜(Python是个好东东,大家多用用!))回复于 2002-11-22 20:01:58 得分 5
在frmtest的OnClose中用caFree应该可以吧。Top
3 楼Cuteric(What?)回复于 2002-11-22 20:04:43 得分 0
caFree和delete this有什么不一样?
哪位能告诉我为什么delete this不行呢?Top
4 楼iris_zhu(个个)回复于 2002-11-22 20:07:54 得分 0
Close事件里加上Release();Top
5 楼favorit(九天剑舞·曾几何时,醉里挑灯看剑)回复于 2002-11-22 20:09:30 得分 0
caFree关闭form,并且释放所有分配给form的内存
不能在form自己的内部函数中delete自己吧?Top
6 楼warton(新群:软件创业13734424)回复于 2002-11-22 20:18:16 得分 0
显示完后不就可以释放了吗??Top
7 楼jishiping(JSP 季世平)回复于 2002-11-22 20:22:37 得分 15
在事件OnClose里,不能使用delete this;这是因为,当Form关闭时,会调用
事件OnClose,但是调用完OnClose之后,VCL中还会有其它的代码用到Form,
所以被你delete之后,再次访问Form时就成了访问非法的指针了,这就是造成
程序异常的原因。而在OnClose里设定Action=caFree;的话,VCL会在完全不再
使用Form的情况下才删除Form的,这样就不会有问题了。Top
8 楼favorit(九天剑舞·曾几何时,醉里挑灯看剑)回复于 2002-11-22 20:27:59 得分 0
还是老大说得清楚!Top
9 楼jishiping(JSP 季世平)回复于 2002-11-22 20:29:23 得分 0
将源程序的相关代码贴在下面:
procedure TCustomForm.DoClose(var Action: TCloseAction);
begin
if Assigned(FOnClose) then FOnClose(Self, Action);
end;
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;
从上面的代码可以看出,OnClose是被DoClose函数调用的,而在Form的Close
函数里,调用DoClose之后,还有其它的代码。一旦你在OnClose里使用delete
this;之后,再执行其它的代码时,就造成了非法访问内存了。Top
10 楼Tern(Tern)回复于 2002-11-23 02:10:56 得分 0
给一个全局的NULL指针,new了以后先留着它,程序退出的时候看看不是NULL就deleteTop
11 楼Cuteric(What?)回复于 2002-11-25 10:09:58 得分 0
分不多,各位老大將就點。Top
-
相关文章
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn
