社区
C++ Builder
帖子详情
关于窗口的释放问题
splitter
2002-10-23 07:03:24
如果在工程里面添加一个Form,那么这个form的owner缺省是application,
释放似乎也是application的事情。现在我添加了一个forma,初始化时将设置
它的parent为formB.那么当formB出现的时候,formA也就显示出来,FormB最小
化的时候formA就消失了。
问题是当formB关闭的时候,是否在formB中delete formA.formA的释放问题如
何解决?如果用户点击formA的关闭按钮,formA是否自己删除自己?
...全文
50
18
打赏
收藏
关于窗口的释放问题
如果在工程里面添加一个Form,那么这个form的owner缺省是application, 释放似乎也是application的事情。现在我添加了一个forma,初始化时将设置 它的parent为formB.那么当formB出现的时候,formA也就显示出来,FormB最小 化的时候formA就消失了。 问题是当formB关闭的时候,是否在formB中delete formA.formA的释放问题如 何解决?如果用户点击formA的关闭按钮,formA是否自己删除自己?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jishiping
2002-10-25
打赏
举报
回复
To splitter(小刚):
在MDI child窗口(FormB)关闭时,需要关闭formA。这是因为,你创建formA
时,使用的是TForm(HWND ParentWindow)这样的构造函数,所以它的Owner为0。
这样在FormB关闭时,因为FormA是FormB的子窗口,所以FormA的窗口句柄会被
Windows销毁。但是由于FormA的Owner为0,所以在关闭FormB时,FormB不会自
动关闭FormA。这样以后再删除FormA时,就会造成“非法的窗口句柄”这样的错
误信息。解决方法:
class TFormB : public TForm
{
__published: // IDE-managed Components
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
TForm* FormA; //注意这儿,需要自己定义一个局部变量
public: // User declarations
__fastcall TFormB(TComponent* Owner);
};
void __fastcall TFormB::FormCreate(TObject *Sender)
{
//这儿的FormA是FormB定义的局部变量,而不是那个全局变量FormA
FormA = new TFormA(Handle); FormA->Show();
}
//------------------------------------------------------------------
void __fastcall TFormB::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree; delete FormA;
}
Spring414
2002-10-25
打赏
举报
回复
不用的吧!
beckc
2002-10-25
打赏
举报
回复
MDI ChildForm在close的时候
用 Action = caFree;
释放该子窗体.那么该窗体上的其它VCL控件能得到释放吗?
还是要专门写几个delete?
splitter
2002-10-25
打赏
举报
回复
我以前犯的错误就是使用了系统自己定义的全局变量formA,因此在formB
onclose的时候删除formA就会出错。改成formB的一个成员变量以后再删除
就没有问题了。
另外再请教斑竹一个问题。在vc中,通过dialogBar可以实现一个浮动的
窗口。但是这个浮动的窗口可以与MDI child window同时获得焦点。两个
窗口的标题栏都是蓝色。但是在c++ builder中实现的浮动窗口与MDI child
window 只能有一个获得焦点。不知道C++ builder有没有类似的程序。
jishiping
2002-10-25
打赏
举报
回复
To weibz0525(小虫) :
2个都不是。VCL里的Owner和API里的父窗口是由区别的。一个Form的Owner不
一定是它的父窗口(在VCL里基本上都不是)。在VCL里,一般来说是不用TForm(
HWND ParentWindow)这样的构造函数的,只是特殊情况下采用的,比如:Parent
是其它开发工具写的一个窗口,这时才采用这个构造函数。一般情况下,都采用
TForm(TComponent* Owner)这样的构造函数。正如楼主 splitter (小刚) 遇到
的情况,采用TForm(HWND ParentWindow),而ParentWindow又是VCL的Form的
句柄。这时就遇到了麻烦。
weibz0525
2002-10-25
打赏
举报
回复
to 斑竹:
1。您代码的意思是将formA的owner设为formB吗?然后在delete
2。是不是在创建form的时候第一个创建的就是从TForm(HWND ParentWindow)构造函数出来的,owner为0,其他的form(如果都关联的话)owner默认为 上一个form呢?
greendesert
2002-10-24
打赏
举报
回复
好!!!
jishiping
2002-10-24
打赏
举报
回复
再补充一下:在OnClose里写了Action=caFree;以后,别的地方就不能再用
delete去删除Form了。另外,很多初学者喜欢通过VCL自动定义的全局变量
FormA这样的名字来访问FormA的东西(而且喜欢在TFormA的成员函数内用
FormA->xxx这样的方式,这是我认为绝对应该禁止的,因为这儿的FormA->
完全是多余的,弄不好还会出错。如果有必要的话,可以用this->xxx这样
的写法),如果FormA已经被delete了,再访问FormA时,当然就会出错了。
hup
2002-10-24
打赏
举报
回复
日落霞漫天:说得好
39457760
2002-10-24
打赏
举报
回复
to splitter(小刚) :
对没有Free的Form直接调用delete,就没事了,原因我也不知道,
还等大侠们来解释了
39457760
2002-10-24
打赏
举报
回复
和我遇到的问题一样
to JSP:
>>再补充一下:在OnClose里写了Action=caFree;以后,别的地方就不能再用
>>delete去删除Form了
我在DLL中生成的窗体 ,如果不用delete删除,同时又不关闭这个窗体,而是直接关闭MainForm那么程序就无法退出。这是怎么一回事阿
splitter
2002-10-24
打赏
举报
回复
我试了一下,没有到formA响应onClose消息的时候就产生异常了.
单步跟踪的时候,在formB OnClose结束的时候,产生一个异常报告 Invalidate
window handle.
我是做了一个MDI application,然后响应菜单,显示一个MDI child窗口(FormB)
出现的时候,这个child窗口响应FormCreate消息里面formA = new FORMA((HWND)
this->Handle),这样formB就是FORMA的父窗口,但是FormB关闭的时候就会报异
常.此时尚没有执行到formA的OnClose()处.
大大怪老张
2002-10-23
打赏
举报
回复
jishiping(JSP 季世平) 的方法可以...
splitter
2002-10-23
打赏
举报
回复
To:39457760(日落霞漫天)
我就是在formB关闭的时候delete formA,结果系统总是出现异常。
jishiping(JSP 季世平)的方法我试一试。
weibz0525
2002-10-23
打赏
举报
回复
学习学习
Libran
2002-10-23
打赏
举报
回复
把FormA的Owner指定为FormB:
FormA = new TFormA(FormB);
这样FormB释放时会自动释放FormA
jishiping
2002-10-23
打赏
举报
回复
在BCB中,对于一般的Form(不是主Form,也不是MDIChild),当用户按关闭
时,Form只是隐藏,并没有释放(被删除)。如果需要Form释放,需要在事
件OnClose里写代码:
void __fastcall TFormA::TFormA(TObject* Sender, TCloseAction &Action)
{
Action = caFree; //这样Form在关闭时,VCL会自动 delete 这个Form
}
对于MDIChild来说,Form在关闭时缺省的行为是最小化;对于主Form来说,
Form在关闭时缺省的行为是关闭整个应用程序。
39457760
2002-10-23
打赏
举报
回复
问题是当formB关闭的时候,是否在formB中delete formA.formA的释放问题如
何解决?
要看formA是如何得到的,如果是使用new Form得到的那么,要么在使其自动删除
自己,要么使用delete。如果是用了Project设置中的auto-create form得到的
那么就不必理会了,会自动删除的。
如果用户点击formA的关闭按钮,formA是否自己删除自己?
OnClose事件中有个参数,CloseAction,将其设为caFree
就会自动删除Form自己。
Qt局域网聊天工具
在上2次文章Qt学习之路_5(Qt TCP的初步使用) Qt学习之路_4(Qt UDP的初步使用) 中已经初步介绍了群聊功能和文件传输功能,这一节中主要在这个基础上加入一...但是当
窗口
关闭时我们觉得其内存
释放
应该在Qt内部自己实现。
QT通过new创建的子
窗口
释放
问题
setAttribute(Qt::WA_DeleteOnClose)
以下两种方法创建子
窗口
及
释放
问题
。 一、如果你定义在栈上: QWidget* w; w.show(); 这时候在构造函数中增加了:setAttribute(Qt::WA_DeleteOnClose),那么关闭的时候会出现异常情况,因为main退出的时候,会...
窗口
结束后资源
释放
不掉
问题
解决办法
.net类库已经帮助我们实现了
窗口
的关闭,如果此
窗口
是系统的主
窗口
,关闭此
窗口
即应该退出了整个应用程序。但事实上有时候并不是这样的,关闭
窗口
,只是停止了当前
窗口
的消息循环。系统主
窗口
,实质上是Main函数中...
Qt中子
窗口
关闭之后,立即
释放
资源的方法
用Qt做界面的时候,很多时候都会遇见点击一个按钮弹出一个新的
窗口
的功能。...所以在新建一个
窗口
的时候就可以设置
窗口
的属性,设置
窗口
在关闭之后立即
释放
资源: notepadpage *NotepadPage = new n...
QT局部
窗口
资源
释放
窗口
销毁
问题
当我们将一个A
窗口
作为父
窗口
,B
窗口
作为A
窗口
的子
窗口
,如果直接关闭B
窗口
,由于主
窗口
不销毁,B
窗口
是不会被销毁的,会一直占内存。 方法一: 用widget举例 QWidget *widget = new QWidget(this); ...
C++ Builder
13,825
社区成员
102,678
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章