关于创建新窗口的问题
我想在工程中用new动态创建新窗体
在创建之前查询一下是否已经存在该窗体,存在的话就删除
假设该窗体名为Form1
我用下面代码为什么不能实现呀?
if(Form1)
delete Form1;
[解决办法]
我认为对于 窗体 new它就要心中有数,十分明白在什么时候该 delete 它合适,并且还履行了。
同样 new 他时,也要确保这个名字压根没有。
这种情况下,还是不要靠if(Form1)的好。
[解决办法]
FindWindow不知道这个能不能用,我没用过
寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题)
返回值
Long,找到窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
参数表
参数 类型及说明
lpClassName String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类
lpWindowName String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题
注解
很少要求同时按类与窗口名搜索。为向自己不准备参数传递一个零,最简便的办法是传递vbNullString常数
[解决办法]
if(Form1)
{
delete Form1;
Form1=NULL;
}
楼主的这个方法应该可以实现的,楼主调试过有什么问题吗?
不过偶建议直接在TForm1里定义一个static TForm *OnlyOne成员(默认值为NULL),在构造里:
if(OnlyOne!=this && OnlyOne!=NULL) delete OnlyOne;
OnlyOne=this;
在析构里
if(OnlyOne==this) OnlyOne=NULL;
这样你就不用管了,只要new一个TForm1,前一个就会自动被delete.
[解决办法]
TForm1*IForm1;
//关掉所有子窗口
IForm1 = (TForm1*)ActiveMDIChild;
while (IForm1!= NULL)
{
delete IForm1 ;
IForm1 = (TForm1 *)ActiveMDIChild;
}
[解决办法]
LZ,如果你的窗体是new出来的,你最好用一个变量记着这个窗体的句柄,这样就可以不用findwindow去找这个上窗体的句柄了。
TFrom2 *pForm = new TForm2(this);
pForm-> Show;
最好把pFrom设为类变量,因为你的窗体可能在其它地方关闭。
在要关闭的地方用
if(pForm)
{
delete pForm;
pForm = NULL;
}这样写是可以的。