社区
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是否自己删除自己?
...全文
76
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自己。
关于动态
窗口
的
释放
和ThemeEngine的
问题
本文探讨了 Delphi VCL 中动态
窗口
FORM3 的创建与
释放
过程中的常见
问题
,包括如何正确处理窗体关闭后的资源
释放
,避免内存泄漏和引用已
释放
对象的错误。同时,分析了使用 ThemeEngine 时遇到的索引越界异常,提供了解决方案。
窗口
结束后资源
释放
不掉
问题
解决办法
这篇博客探讨了在.NET环境中如何优雅地关闭
窗口
和退出应用程序。主要内容包括Application.Exit()、Environment.Exit(0)、Application.ExitThread()以及Form.Close等方法的使用和区别。作者指出,当子窗体中的循环操作未结束时,简单关闭窗体并不足以结束循环,需要使用强制退出方法。然而,这些强制退出方法可能会导致程序资源未被完全
释放
。因此,最佳实践是在子窗体的Closing事件中设置循环退出条件,以避免资源浪费和潜在错误。
Godot2d拖拽
窗口
时
窗口
异常闪现及无法正确
释放
问题
的结局办法
本文针对Godot2D中拖拽
窗口
时出现的闪现与无法
释放
问题
,分析了因使用全局坐标导致的位置异常,并修正了输入事件中鼠标按钮状态判断逻辑错误,通过调整click_mouse_position获取方式和修复条件嵌套结构,实现了正确的
窗口
拖拽控制。
C#关闭子
窗口
而不
释放
子
窗口
对象的
问题
解决
本文主要探讨了在C#编程中如何在关闭子
窗口
时保持其对象不被
释放
,提供了详细的解决方法和参考链接,对于避免内存泄漏和优化程序设计具有指导意义。
C++ Builder
13,874
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章