如何判断某个form是否已经create?

golinjin 2003-09-13 02:10:11
如何判断一个form是否已经存在?因为若不存在就动态创建它,存在就不创建。
...全文
91 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrameSniper 2003-09-13
  • 打赏
  • 举报
回复
To Sy_315

常规的编写代码方法是在释放了对象实体后立刻对对象指针进行释放,这样做的唯一目的就是避免以后对野指针的调用,从而出现内存访问错误!

所以,按照你说的不对对象指针进行释放,这种操作从根本上就是错误的!你一开始就这样错误的写代码,接着又用Assigned函数去判断对象指针内容意义与否,你认为这种操作逻辑正确吗?最直接的方法,释放的时候使用FreeAndNil函数!
flyfish99 2003-09-13
  • 打赏
  • 举报
回复
if findwindow('tform1','form1')=NULL then
tform1.creat(application)
jpyc 2003-09-13
  • 打赏
  • 举报
回复
http://218.56.11.178:8020/web/technology.aspx

->下载基地->例程-基础应用->如何检测已创建的form
mingjunlee 2003-09-13
  • 打赏
  • 举报
回复
对,assigned并无可靠,
sy_315 2003-09-13
  • 打赏
  • 举报
回复
比较经典~的判断
我动态创建完以后如果释放不把object:=nil的话
判断assigned(object)时候出错了的
FrameSniper 2003-09-13
  • 打赏
  • 举报
回复
最常规的做法:使用Assigned函数来进行判断

if not Assigned(Form1) then
Form1:=TForm1.Create(Application);

类TForm1的VMT已经存在于堆中,所以这个时候只要判断栈上的窗体指针Form1的内容是否有效就可以了!
S海鸥 2003-09-13
  • 打赏
  • 举报
回复
If Form2 = nil then
Application.CreateFrom(TForm, Form2);
Else
Form2.show;
End;
wyr521 2003-09-13
  • 打赏
  • 举报
回复
up
coreblood 2003-09-13
  • 打赏
  • 举报
回复
{*******************************************************************
函 数 名: 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;
cl250 2003-09-13
  • 打赏
  • 举报
回复
if form1=nil then
form1:=Tform1.create(Application);

Miracle 2003-09-13
  • 打赏
  • 举报
回复
也可以用mutex,窗口创建的时候检查互斥元,不存则创建,存在则取消窗口创建,窗口销毁的时候一并撤销此mutex。这种方法最好,可以将窗口封装成一个新的类,以后直接拿来用就行了
Miracle 2003-09-13
  • 打赏
  • 举报
回复
assigned(object)

前提是object如果曾经创建过,然后释放,需要在释放后设置object:=nil;否则下次测试assigned(object)仍然为true。

findwindow的办法不是很好,如果存在同名(同类名)的窗口,就麻烦了
Miracle 2003-09-13
  • 打赏
  • 举报
回复
哈哈,FS说得对。
耙子 2003-09-13
  • 打赏
  • 举报
回复
你的意思是检查是否有这个实例了,
可以用findwindow来检查
golinjin 2003-09-13
  • 打赏
  • 举报
回复
是这样的。我定义了就一个form,然后动态创建它,就是想在创建之前先判断是否已经创建过
若不存在这个form则创建它。
samcrm 2003-09-13
  • 打赏
  • 举报
回复
if not assigned(form2) then form2:=Tform2.Create(Application);
form2.BringToFront;
耙子 2003-09-13
  • 打赏
  • 举报
回复
你这个form存在的标志是什么?
窗口指针还是类的实体?

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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