关于动态生成Form的一个问题

donwmufromdying 2006-06-01 05:11:34
具体代码如下:
Form1:包含控件Button1,程序自动生成并显示
Form2:程序过程中由Form1的button1的click事件触发后动态生成的。
Form2包含一个button2,click event是关闭Form2

现在遇到一个Form2的关闭问题
代码如下:
TForm1::OnButton1Click()
{
if (Form2!=NULL)
{
Form2=new TForm2(this);
//Form2->Visible=true; 第二种方式
//Form2->Show(); 第二种方式
Form2->ShowModal();
Form2=NULL;
}
}
Form1的其他代码部分 //Form2->Close(); 第二种方式


Form2里面的代码:
TForm2::OnButton2Click()
{
//Form2->Close(); 这样调用出错 --方法1
//Close(); //这样就正确 --方法2
//this->Close(); //正确 --方法3
//TCustomForm::Close(); //正确 --方法4
}

我发现一个有趣的现象,当我使用Close关闭Form2时候,用Form2->Close()竟然是错误的
这里的this指针应该就是Form2阿!检查发现这里的Close实际调用的是父类TCustomForm的
函数。我想问的是,这里为什么不能使用Form2->Close();来关闭Form2?
还是如上例子,当我如代码使用第二种方式在Form1里Form2->show,也在Form1里Form2->Close()
就完全没问题!
...全文
164 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
donwmufromdying 2006-06-02
  • 打赏
  • 举报
回复
也非常感谢大家的参与
donwmufromdying 2006-06-02
  • 打赏
  • 举报
回复
weixing979闪电侠的提示有帮助。发现了我的问题,那就是全局变量Form2在两个Unit里都定义了,这样在Form1种生成实例Form2时,Form2里面的指针是0,或者说已经不是Form1里面的那个全局变量指针了,这时候调用Form2->Close不对。我把Unit2(Form2)里面的定义去掉后,Form2->Close正常了。
wood542344 2006-06-02
  • 打赏
  • 举报
回复
哦,知道了。谢谢 zyyoung。
那如何创建出类似QQ聊天对话框一样的对话框呢?难道聊天对话框不是动态创建的吗?而且要非模态的。
并且这个对话框存在的时间很长。。。应用程序一开始就把这个对话框调入内存似乎又不太现实。
以上问题的核心是如何有效的控制窗体的动态创建和销毁。有专门的帖子吗,想深入了解。求教
weixing979 2006-06-02
  • 打赏
  • 举报
回复
可以在TForm1的退出时判断下pNewForm 是否为NULL,非NULL则delete pNewForm
zyyoung 2006-06-02
  • 打赏
  • 举报
回复
以上引用一高手,请保持其完整性
zyyoung 2006-06-02
  • 打赏
  • 举报
回复
一、动态调用窗体Form

  在缺省情况下,由File/NewForm生成添加入项目文件中的窗体都具有"AutoCreate"(自动创建)的特性。即只要程序运行,该窗体就存在于内存中了,不管当前它是否被调用。具有这种特性的窗体一般适用于窗体属性比较固定、经常被调用的情况。其优点是速度快,缺点是占用内存。在实际程序设计中,会遇见大量类似对话框功能的窗体,它们用于显示状态或输入信息,仅须在程序中调用一下,完成其功能就行了,无需常驻内存。这时可以通过选择Project/Options/Forms,将"Auto--Createforms"栏中相应的窗体,如Form1,用">"键移动到"Availableforms"栏中,并在程序需调用该窗体处,加入下列语句:

TForm1*myform=newTForm1(this);

myform->ShowModal();

deletemyform;


  窗体Form1仅是在需要调用时才调入内存,调用完成后,即用delete清除出内存。这样可减少程序对内存资源的占用。
wood542344 2006-06-02
  • 打赏
  • 举报
回复
这个我知道,可是怎么样才可以用show,然后又可以释放资源呢,不会一定要用模态对话框吧。
weixing979 2006-06-02
  • 打赏
  • 举报
回复
你用Show 调用,然后就执行
__finally
{
if(pNewForm)
{
delete pNewForm;
pNewForm = NULL;
}
}
立刻就把pNewForm删了,当然就是一闪就没有了.

用ShowModal因为是模态的,需要关闭后才往下走
wood542344 2006-06-02
  • 打赏
  • 举报
回复
我也是新学的,不知道这样写对不对:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2 *pNewForm = NULL;
try
{
pNewForm = new TForm2(NULL);
pNewForm->ShowModal();
}
__finally
{
if(pNewForm)
{
delete pNewForm;
pNewForm = NULL;
}
}
}

void __fastcall TForm2::Button1Click(TObject *Sender)
{
this->Close();
}
这样写有一个问题,就是如果是用show出来的话,Form2一闪就没有了。。。请高手指教。。
勉励前行 2006-06-02
  • 打赏
  • 举报
回复
可怕的代碼:

if (Form2!=NULL) //判斷錯 已有實例就不要生成新實例
{
Form2=new TForm2(this);
Form2->ShowModal();
Form2=NULL; //沒釋放內存就更改指針,導致該實例無法再使用,浪費內存
}
應檢查:指針Form2有無初始化, 何時生成實例,何時釋放。
建議樓主回想一下對象與實例的概念,復習一下指針的用法,及this的用途。


weixing979 2006-06-01
  • 打赏
  • 举报
回复
你编译的程序应该有[Linker Warning] Public symbol '_Form2' defined in both module ..................这个吧.
C++里类的方法里,调用类的本身用this
而且你的Form2->Close()的Form2已经不是Form1里生出的Form2

13,825

社区成员

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

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