社区
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是否自己删除自己?
...全文
92
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的
问题
关于动态
窗口
的
释放
和ThemeEngine的
问题
VCL组件开发及应用http://www.delphi2007.net/DelphiVCL/html/delphi_20061221110256226.html 首先第一个
问题
我有个动态查询
窗口
FORM3,当我在form1里按BUTTON1的时候,创建FORM3,并且把查询数据库的结果返回给FORM3上的ST...
窗口
结束后资源
释放
不掉
问题
解决办法
.net类库已经帮助我们实现了
窗口
的关闭,如果此
窗口
是系统的主
窗口
,关闭此
窗口
即应该退出了整个应用程序。但事实上有时候并不是这样的,关闭
窗口
,只是停止了当前
窗口
的消息循环。系统主
窗口
,实质上是Main函数中开始消息循环的
窗口
,这个消息循环结束后,Main函数就基本上完成了历史使命,整个应用程序自然就结束了。Application.Exit()方法是终止所有线程上的消息循环,一般情况下,无论在什么地方调用此方法,程序就能退出。但是如果你在程序中加入了某些耗时甚至是死循环的线程,那么即使是消息循环终止,程序也依
Godot2d拖拽
窗口
时
窗口
异常闪现及无法正确
释放
问题
的结局办法
摘要:文章记录了从Unity转向Godot2D开发时遇到的
窗口
拖拽功能
问题
。作者详细分析了两个核心bug:1)
窗口
闪现右下角
问题
,发现是使用了错误的event.global_position,应改用DisplayServer.mouse_get_position()获取鼠标真实位置;2)鼠标
释放
失效
问题
,通过重构条件逻辑解决嵌套判断错误。最终给出修正后的完整代码,强调正确获取屏幕坐标和严谨的事件处理逻辑的重要性。文章展示了系统性调试思路,对Godot开发者具有实用参考价值。(148字)
C#关闭子
窗口
而不
释放
子
窗口
对象的
问题
解决
C#关闭子
窗口
而不
释放
子
窗口
对象的
问题
解决
窗口
close 后资源无法
释放
的
问题
最近碰到一个
窗口
close()后资源无法
释放
的
问题
,找了很久才发现原来时存在交叉引用,虽然close()但是该form的对象依然被其他对象所引用,所以垃圾收集器并不能回收该form所占的资源。 1 public class DeviceManager : IDeviceMonitorStatusNotify 2 { 3
C++ Builder
13,871
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章