if form1=nil then form1:=Tform1.create(Application);
{******************************************************************* 函 数 名: if_have_form( FormClass, fm, AOwner ) 功能描述:判定某一子窗口是否已打开 参数说明:类名(FORMCLASS)、父窗口名(fm);窗体名(AOwner) 返回 :True :表示有此FORM False :表示没有此FORM AUTHOR : CXB Date : 2002-12-01 *******************************************************************} function if_have_form( FormClass: TFormClass; var fm; AOwner: TComponent ):Boolean; var i: integer; Child: TForm; begin for i := 0 to Screen.FormCount - 1 do //如有一窗口打开,将不打开新的窗口 if Screen.Forms[i].ClassType = FormClass then begin Child := Screen.Forms[i]; if Child.WindowState = wsMinimized then //如已存在但最少化的窗口,将还原显示 ShowWindow(Child.handle, SW_SHOWNORMAL) else ShowWindow(Child.handle, SW_SHOWNA); if (not Child.Visible) then Child.Visible := True; Child.BringToFront; Child.Setfocus; TForm(fm) := Child; result := True; exit; end else if Screen.Forms[i].FormStyle = fsMDIChild Then begin application.MessageBox( '请先关闭窗口','警告',mb_iconwarning ); result := True; exit; end; result := False; end;
If Form2 = nil then Application.CreateFrom(TForm, Form2); Else Form2.show; End;
最常规的做法:使用Assigned函数来进行判断if not Assigned(Form1) then Form1:=TForm1.Create(Application);类TForm1的VMT已经存在于堆中,所以这个时候只要判断栈上的窗体指针Form1的内容是否有效就可以了!
if findwindow('tform1','form1')=NULL then tform1.creat(application)
To Sy_315 常规的编写代码方法是在释放了对象实体后立刻对对象指针进行释放,这样做的唯一目的就是避免以后对野指针的调用,从而出现内存访问错误! 所以,按照你说的不对对象指针进行释放,这种操作从根本上就是错误的!你一开始就这样错误的写代码,接着又用Assigned函数去判断对象指针内容意义与否,你认为这种操作逻辑正确吗?最直接的方法,释放的时候使用FreeAndNil函数!
窗口指针还是类的实体?
form2.BringToFront;
若不存在这个form则创建它。
可以用findwindow来检查
form1:=Tform1.create(Application);
函 数 名: if_have_form( FormClass, fm, AOwner )
功能描述:判定某一子窗口是否已打开
参数说明:类名(FORMCLASS)、父窗口名(fm);窗体名(AOwner)
返回 :True :表示有此FORM
False :表示没有此FORM
AUTHOR : CXB
Date : 2002-12-01
*******************************************************************}
function if_have_form( FormClass: TFormClass; var fm; AOwner: TComponent ):Boolean;
var
i: integer;
Child: TForm;
begin
for i := 0 to Screen.FormCount - 1 do
//如有一窗口打开,将不打开新的窗口
if Screen.Forms[i].ClassType = FormClass then
begin
Child := Screen.Forms[i];
if Child.WindowState = wsMinimized then //如已存在但最少化的窗口,将还原显示
ShowWindow(Child.handle, SW_SHOWNORMAL)
else
ShowWindow(Child.handle, SW_SHOWNA);
if (not Child.Visible) then Child.Visible := True;
Child.BringToFront;
Child.Setfocus;
TForm(fm) := Child;
result := True;
exit;
end
else if Screen.Forms[i].FormStyle = fsMDIChild Then
begin
application.MessageBox( '请先关闭窗口','警告',mb_iconwarning );
result := True;
exit;
end;
result := False;
end;
Application.CreateFrom(TForm, Form2);
Else
Form2.show;
End;
Form1:=TForm1.Create(Application);类TForm1的VMT已经存在于堆中,所以这个时候只要判断栈上的窗体指针Form1的内容是否有效就可以了!
我动态创建完以后如果释放不把object:=nil的话
判断assigned(object)时候出错了的
tform1.creat(application)