关于窗口的释放问题

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 打赏 收藏 转发到动态 举报
写回复
用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自己。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧