如何判断窗口是否已经打开(100)

  • 主题发起人 主题发起人 superrock
  • 开始时间 开始时间
S

superrock

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中加入了一个Timer,定时打开form2(form2.ShowModal),如果form2是处于打开状态的话,下次执行form2.ShowModal就会出错. 请教我该如何判断form2已经ShowModal?
 
哎,加一个全局变量就可以了啊,例如Var GlobeVar : Boolean = False;begin if GlobeVar then exit; GlobeVar:=true; try Form2.ShowModal; finally Form2.Free; end; GlobeVar:=false;end;
 
if Form2.Showing then
 
to wql 这种方法与我以前使用的方法类似(我用了一个edit作标记),我想知道有没有语句或方法可以直接判断一个窗口是否已经ShowModal.
 
if not Assigned(Form1) then Form1:=TForm1.Create(Application); Form1.ShowModal;
 
to de410 这种方法好像也不行,我的form2是一个事先建好的窗口(用于显示查询结果),在form2的close中加入free也不行。
 
要么就是你问的问题你表述的不清楚,要么就是你对窗体的创建、释放、显示、隐藏的概念不清楚。窗体也是一个类,使用之前需要创建,用完了需要释放,这是通过Create和Free做的工作,而窗体的显示和隐藏,则是窗体这个类所拥有的一种能力,通过show和hide来实现,窗体在show之前,必须保证这个窗体类是存在的,也就是说是已经被创建了的,而窗体的隐藏,也不意味着窗体类被释放了,仅仅是隐藏起来你看不到而已。上面你说,你在窗体的Close是,调用了Free方法,那说明你在隐藏窗体的同时,释放了窗体类,这就意味着,下次你再要使用这个窗体,你必须重新创建。综上分析,你的问题应该是:你在某个窗体中保存了form2窗体类的一个引用(说白了就是一个窗体变量),并且通过这个引用Show出了这个窗体,因为你是Modal的方式Show出来的,因此,直到这个窗体关闭之前,你的调用部分是不会返回的,而你又说,你的窗体关闭的同时被你释放了,这就导致那个保存着form2窗体引用的变量这时候指向了一个无效的类(被释放了),如果在ShowModal返回之后,你还去使用这个引用来访问Form2中的东西,那肯定会报错。因此,如果你采用了ShowModal的方式显示窗体,并且在窗体关闭之后你还要使用窗体中的某些东西(或者说,窗体ShowModal之后,你还想通过那个引用去操作窗体),那么你就别在form2关闭的同时Free他,而是在你调用ShowModal之后,通过你这个引用手动释放他,并将你这个引用置空。按照你的想法,你是想让某个窗体动态去刷新你的数据,并且在用户关闭这个窗体的时候就释放他。那么你可以采用show的方式而不是showModal的方式,并且,采用其他的方式来实现form2和控制窗体之间的通讯,比如说采用发消息的方式,或者在form2窗体关闭时主动去通知控制窗体,以便让控制窗体可以记录form2的轨迹,而不是像你那样采用timer去猜测form2的状态
 
to: superrock在form2的close中加入Action:=caFree;Form2:=nil;
 
楼上说的极是!!!如果是: if not Assigned(Form1) then begin Form1:=TForm1.Create(Application); try Form1.ShowModal; finally Form1.Free; end; end;如果是: Form1.show在form2的close中加入Action:=caFree;Form2:=nil;
 
当然你得注意你的工程设置:probjcet》options>Forms注意自动创建还是手动创建的
 
用de410和ranyang说的能行。感谢各位。
 

Similar threads

后退
顶部