已经动态生成的窗体,怎样在按钮里关闭?

gxsky 2004-12-24 02:14:31
比如,生成时
TForm *Form3=new TForm3(this);
Form3->ShowModal();
delete Form3;

但在点击这个窗体的弹出信息按钮的同时想关闭这个窗体并释放,怎么办呢
ShowMessage("注册成功!");
Form3->Close();---总是出错
...全文
156 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
L·D·N 2004-12-27
  • 打赏
  • 举报
回复
那是否可以在真正的动态生成窗体后在这个窗体内动态生成这些控件呢?
ThinkX 2004-12-27
  • 打赏
  • 举报
回复
Form本身就有一个ModalResult属性的,设置这个属性就可以关闭窗体,和button的没有关系。

void __fastcall TForm2::BitBtn1Click(TObject *Sender)
{
if (注册成功)
{
// this 就是 Form2
this->ModalResult = mrOk;
}
}
gxsky 2004-12-27
  • 打赏
  • 举报
回复
看样子式我没说明白,情况是这样的,我把注册的窗体(窗体1)做成动态生成的了,在该窗体里面有一个注册的按钮,如果上面的Edit里输入的注册码正确,点击这个按钮,弹出显示注册成功信息窗(窗体2,我使用的是showmessage),然后点击显示注册成功窗体(窗体2)的按钮后,同时也关闭注册的窗体(窗体1),如果注册失败,弹出显示注册失败信息窗(窗体2,我使用的是showmessage),然后点击显示注册失败窗体(窗体2)的按钮后,不关闭注册的窗体。

不知道这回能不能说明白,我自己都觉得罗里罗唆的,请大侠赐教!
真如实观 2004-12-27
  • 打赏
  • 举报
回复
如果 lswhome(Borland C++初学者) 不是楼主,下面可以,因为
感觉窗体并不是真正动态创建的,当然你可以先设计好,不使
窗体在程序就创建(在Project Option里设定)如果
lswhome(Borland C++初学者) 和楼主是同一个人,那么你一开始
动态生成的窗体都有问题,窗体上的按钮、TEdit及事件的定义等
都没有。
///////////////////////////////////////////////////////////
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2 *Form2=new TForm2(Application);
//改成下面这样:
TForm2 *Form2=new TForm2(this);//离开"可视范围"后自动释放
Form2->ShowModal();
delete Form2;
}
////////////////////////////////////////////////////////
void __fastcall TForm2::BitBtn1Click(TObject *Sender)
{
...
if(...)
{
ShowMessage("注册成功!");
this->Close();
}
else
{
ShowMessage("注册失败,重新输入注册码!");
Edit1->SetFocuse();
return;
}
...

}
L·D·N 2004-12-27
  • 打赏
  • 举报
回复
郁闷!请问,这样生成的窗口上面是不是什么控件都没有?
如果我要在生成的这个窗口上生成一些控件,比如按钮,Edit等等,我该怎么做呢?
谢谢!
gxsky 2004-12-27
  • 打赏
  • 举报
回复
上面的描述也不准确,好想我只能再up这一次了,头都大了
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2 *Form2=new TForm2(Application);
Form2->ShowModal();
delete Form2;
}



我想通过在这个Form2上的一个按钮关闭Form2,并最终释放空间。
void __fastcall TForm2::BitBtn1Click(TObject *Sender)
{
...
if(...)
{
ShowMessage("注册成功!");
}
else
{
ShowMessage("注册失败,重新输入注册码!");
}
...

}

}

如果使用bitbtn按钮ModalResult = mrOK 时,注册失败也关闭Form2窗体,而我只想注册成功时关闭,失败时不关,给用户重新输入的机会。

怎么来做到呢?或许我的做法本来就是错的???
gxsky 2004-12-27
  • 打赏
  • 举报
回复
感谢各位的回答,帮我解决了问题!
也谢谢 lswhome(Borland C++初学者)的参与,但我希望你的问题能在另一个贴子里发布,并给于给你正确答案的人一个分数上的肯定,幸好ThinkX(思·秋天的树·求职中)给我正确的答案,否则我的贴子主题整个就会发生变化,我也就会得不到我的答案,我想这是一个道德的问题吧,对于这个问题我已经等了好几天了。先不结贴,对我的说法有意见可以提出来。
谢谢ThinkX(思·秋天的树·求职中)、xuby5228(潇湘大少) 、milkwayhong(自在)、qibo999(行路者) 、 tiegerium(/*唐秀观*/) 、 chiengod(钱神爷) ,我并不知道Form也有ModalResult属性,只知道bitbtn有,所以弄了个笑话,呵呵!
gxsky 2004-12-27
  • 打赏
  • 举报
回复
说得还是有点复杂了,应当是这样的:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2 *Form2=new TForm2(Application);
Form2->ShowModal();
delete Form2;
}

这没问题。

我想通过在这个Form2上的一个按钮关闭Form2,并最终释放空间。
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Form2->Close();

}


如果直接点窗体的X关闭Form2则没问题,但是我需要用按钮来完成的。

怎么写才对?
ThinkX 2004-12-27
  • 打赏
  • 举报
回复
当然可以窗体中动态生成控件了。
qibo999 2004-12-24
  • 打赏
  • 举报
回复
我大致明白了你的意思,为什么要那样做呢?直接在当前窗体中用ShowMessage()不行吗?为什么要新建一个?如果你将代码不加到Form3的OnShow OnCreate里,应该没问题(参照上面说法),否则会有问题的。
milkwayhong 2004-12-24
  • 打赏
  • 举报
回复
同意楼上同意ThinkX的观点
呵呵
xuby5228 2004-12-24
  • 打赏
  • 举报
回复
同意ThinkX(思·秋天的树·求职中)的看法!
ThinkX 2004-12-24
  • 打赏
  • 举报
回复
Modal窗体最好不要action=cafree,
如果要关闭窗体,一个办法是ModalResult = mrOK // or mrCancel
chiengod 2004-12-24
  • 打赏
  • 举报
回复
在onclose 事件里加action=cafree;

13,825

社区成员

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

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