11
2007
08

如何避免表单重复打开?

  这是一个很经典的问题,见诸于各大VFP论坛,热情解答者提供的答案也有很多。   其实这个问题细分的话,有很多种情况。一旦提问者不能很好的表达自己的确切目的,或者解答者没有细看提问者要求,即便答案无数,真正符合的,寥寥无几,甚至一个都没有。   这个问题最为典型的答案,来自于CSDN论坛的版主Apple_8180,其对应问题是“如何防止窗体重复打开(程序或表单重复运行)?”。   具体代码如下:   DECLARE INTEGER FindWindow IN Win32API STRING,STRING   *Declare integer FindWindow IN USER32.DLL STRING,STRING &&或用此句   LOCAL cTitle   cTitle="窗体的Caption"   IF FindWindow(0,cTitle)<>0   MESSAGEBOX("程序已运行!",48,"信息提示")   RETURN   *QUIT   ENDIF   CLEAR DLLS   需要说明的是,这段代码仅用于程序或顶层表单。   那么对于顶层表单(As Top-Level Form)中的非顶层表单(In Top-Level Form)呢?   最为简单的是非顶层表单使用模式表单(Window Type,1),当模式表单激活时,其他表单都不可用,只有关闭模式表单,才能激活其他表单。不过使用模式表单有个前提,那就是其标题栏状态应该是打开的,要不然一旦打开该模式表单,就不能关闭它,也不能打开其他表单(除非菜单中有关闭该表单的按钮)。   有时候,根据程序需要,我们需要隐藏子表单(非顶层表单)的标题栏,此时使用模式表单就不是一个好的选择。   而我现在一直在做的这个程序,就有这样的需要。   程序设计思路是,一个主表单Main(顶层表单,加载菜单),其他几个子表单(在顶层表单中)诸如AA、BB之类,当我启动主表单Main时,自动加载并显示子表单AA,然后通过主表单的菜单进行操作,比如说点击菜单中AA,此时因为子表单AA已经打开,所以经程序判断之后,不会重复打开子表单AA,点击之后应该是不会有反应,比如说再点击菜单中BB,因为此时子表单BB并未打开,所以该操作会打开子表单BB,同时,关键的,该操作会关闭先前打开的AA。以此类推,就是打开一个子表单的同时,关闭先前打开的子表单,避免同时打开两个表单,也避免重复打开同一个表单。   关于这个设想,我百度了N多资料,拜访了各大VFP论坛,也在CSDN的群中咨询过,但是一直没有得到满意的解答。   N天以来,苦恼中,思索中……   直到有一天,受到某仁兄提出的表量的启发,我灵感喷发,并经多次试验后,终于解决这个难题。   下面我来写一个实例(VFP9测试成功):   1、创建两个子表单aa、bb(ShowWindow,1-In Top-Level Form),其Caption分别修改为aa、bb;   2、创建一个主表单main(ShowWindow,1-As Top-Level Form),其Caption改为main(此次Caption对程序运行无影响,可任意修改)。   其Init事件为do menu.mpr with this   其Load事件如下:   PUBLIC ActFormName,NowForm &&创建两个变量   ActFormName="aa" &&设定变量ActFormName的初始值   其Refresh事件如下:   Do form aa.scx name NowForm 打开表单aa,&&定义该表单别名为NowForm   3、创建名为Menu的菜单,创建两个菜单项,一个为菜单aa,一个为菜单bb。(需要提醒的是,该菜单“常规选项”中应勾选“顶层表单”)   创建菜单aa的过程如下:   IF ActFormName="aa" &&由此判断表单aa是否打开   Return   Else   NowForm.Release &&关闭先前打开的表单   Do form aa.scx name NowForm &&打开表单aa,定义该表单别名为NowForm   ActFormName="aa" &&定义变量值   Endif   创建菜单bb的过程如下:   IF ActFormName="bb"   Return   Else   NowForm.Release   Do form bb.scx name NowForm   ActFormName="bb"   Endif   到此该实例完成,具体思路应该很清晰了,不作具体解释,大家可以拿去试试。   最后,很高兴自己能完成这个非常具有挑战性的问题,也希望我的思路能给有需要的同仁们带来或多或少的帮助。
« 上一篇下一篇 »

相关文章:

多个DBF文件合并之蹊跷事件  (2009-5-7 23:48:23)

药品数据分析系统截图  (2007-4-16 13:18:56)

一些很有用的VFP代码  (2007-2-11 10:48:51)

对比程序的最后测试  (2006-5-2 10:7:11)

终于结束了,我的数据库!  (2006-4-27 23:39:33)

求助是一条捷径  (2006-4-12 12:44:0)

重拾遗忘的编程  (2006-4-2 22:22:30)

郁闷的人到深夜  (2005-11-11 20:48:5)

评论列表:

1.  2009/1/22 8:57:24 回复该留言
多谢
2.路过  2012/2/15 10:57:51 回复该留言
非常感谢

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。