如何判断一个窗体是否已经Create?(100分)

  • 主题发起人 主题发起人 pomb
  • 开始时间 开始时间
P

pomb

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,指的是在程序中动态创建的窗体,在创建的时候需要根据前面是否已经创建了该窗体
的实例来判断是否需要Free和Create,我使用的是if Assigned(FormName) then...
可是在监视其运行过程中发现,即使在关闭后该窗口仍然<>nil,所以使用Assigned根本
判断不出来,怎么办?不想使用一个标志变量Flag什么的.
 
判断窗口的句柄不行吗?
 
一个笨方法就是设下陷阱去尝试访问该Form的属性,如:

try
Form1.Visible;
except
MessageDlg('该表单尚未创建!',mtInformation,[mbOk],0);
end;

 
API:

IsWindow( Form.handle )

 
To hustmouse
如果Form尚未创建,试图访问Handle属性本身就会产生异常!
 
if assigned(form_name) then
showmessage('created');
 
不太明白你什么意思,
每次FREE完了再执行一条
FormXX:=nil
不就可以了吗?
 
在窗体的OnDestroy中加入
该窗体的名称:=nil;
Exp:
procedure TForm1.FormDestroy(Sender: TObject);
begin
Form1:=nil;
end;
另外:你创建的窗体是用那种方法显示的,是Show or ShowModel,
上述方法只适用于 Form1.Show;
对于ShowModel,则不需要。
 
利用获取该窗体的句柄不可以吗?
 
function HsaFrmTyp(FrmType:TFormClass);
var I:Integer;
begin
Result:=False;
for I:=0 to Screen.FormCount-1 do begin
if Screen.Forms is FrmType then begin
Result:=True;
exit;
end;
end;
end;

//========================
procedure CreateMyFrm;
var MyFrm:TMyFrm;
begin
if HasFrmTyp(TMyFrm) then exit;
MyFrm:=TMyFrm.Create(self);
.....
end;
 
关键是要在窗体Free后加入form1:=nil,将其指向空指针,以便下次动态创建时判断。

1、
对于showmodal的窗体
form1:=Tform1.create(application);
with form1 do begin
showmodal;
free;
end;
form1:=nil;
2、
对于show的窗体,则需要在该窗体的onclose事件中加入:
form1.free;
form1:=nil

创建时这样写:
if form1=nil then form1:=Tform1.create(application);
form1.show
应该没错的,给分吧 -)

 
>>关键是要在窗体Free后加入form1:=nil,将其指向空指针,
为什么这样我记不清了,但对所有控件一般都这样作.(是Marco Cantu说的)
所以coolx说法应该没有问题.
 
if assigned(form_name) then
tform_name.create(self);
 
谢谢大家,我的意思本来就是判断程序中动态创建的窗体是否已经释放完毕.用Assigned肯定
不行,它本来就是判断指针是否为nil,所以还是只有在Free以后自己令他等于nil了,
本来以为能有更好的办法呢!
 
多人接受答案了。
 
后退
顶部