请问这个函数能不能判断窗体是否已经存在??(50分)

  • 主题发起人 主题发起人 wangsangwu
  • 开始时间 开始时间
W

wangsangwu

Unregistered / Unconfirmed
GUEST, unregistred user!
bool Openform(TForm *WForm) //判断窗体是否已经打开
{
int i;
bool FormExist ;
if (WForm == NULL) return false;
FormExist =false;
for(i=0 ;i<Screen->FormCount ;i++)
{
if(Screen->Forms->ClassType() == WForm->ClassType())
{
FormExist = true;
break ;
}
}
return FormExist;
// if (FormExist ==false) return FormExist ;
// if (FormExist)
// WForm->Visible = false;
}
 
for(i=0 ;i<Screen->FormCount ;i++)
{
if(Screen->Forms->ClassType() == WForm->ClassType())
{
FormExist = true;
break ;
}
}
这个方法不好
if (WForm == NULL) return false;应该就可以了
在要判断的那个窗体被释放的时候一定要将指针清空,否则上面那句话不起作用
 
你是指用if (WForm == NULL) return false;
在要判断的那个窗体被释放的时候一定要将指针清空吗?
在Delphi中可以用Assigned这个函数,BCB中有没有类似得函数那?
将窗体得指针清空是不是用Delete WForm?
 
C++Builder中的“if (WForm == NULL) ”就相当于Delphi中的Assigned。
Delete WForm是释放实例所占用的内存,以及将指针指向空,说清空指针不准确。
 
指针清空当然是在释放内存后做了,难道这点还要说?!
再说你不清空指针怎么判断WForm == NULL?!
 
TForm *Form;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Form = NULL;
}
bool IsFormNULL(TObject *F)
{
TForm *Form = dynamic_cast<TForm*>(F);
return (NULL == Form);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (IsFormNULL(Form))
Form = new TForm(this);
Form->Show();
delete Form;
}
 
copy_paste:
请问这两句的功能是什么?
TForm *Form = dynamic_cast<TForm*>(F);
return (NULL == Form);
是不是将Form强制转换成F,然后判断是否已经创建这个窗体??
多指教!
另外我想问一下我得这几行代码是不是有什么问题?
for(i=0 ;i<Screen->FormCount ;i++)
{
if(Screen->Forms->ClassType() == WForm->ClassType())
{
FormExist = true;
break ;
}
}

 
动态强制转换类型。
还有一个是static_cast,各个场合好像是通用,不过上面那函数不行。。。
我也不清楚,这种基础性的东西我也是一和半解的。
 
if(Screen->Forms->ClassType() == WForm->ClassType())
ClassType是类,类是可以多个实例,多个实例的类可能是一样的,那你怎么判断哪个实例了?
 
我现在将这个函数写在一个单元文件里面,没有窗体.
TForm *Form ;//定义
bool IsFormNULL(TObject *F)
{
Form = NULL;
TForm *Form = dynamic_cast<TForm*>(F);
return (NULL == Form);
}
然后再在需要得地方调用这个函数.
可是我发现调用几次后就会出现问题

 
经过调试,我发现当我第一次调用某一个窗体后,退出后,在调用第二次,我发现IsFormNULL的返回值
是false.也就是说他直接Show这个窗体了,于是报错.
if (IsFormNULL(Form))
Form = new TForm(this);
Form->Show();
delete Form;
我在Close事件里定义Action = caFree ;
不知道这是什么原因??
 
Assigned 函数
 
这个问题我已经解决了
其实上面几个函数都可以使用得
自要在Destroy时间中加上F=NULL 就可以了
 
我给你的答案不早就这么说了嘛?!你自己仔细看看!
这么简单的方法还有什么不好?给分啦!~[:)]
 
后退
顶部