水流年

首页 | |

如何避免表单重复打开?



  这是一个很经典的问题,见诸于各大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
  到此该实例完成,具体思路应该很清晰了,不作具体解释,大家可以拿去试试。
  最后,很高兴自己能完成这个非常具有挑战性的问题,也希望我的思路能给有需要的同仁们带来或多或少的帮助。

2007/8/11 | Tags:ViusalFoxPro,VFP,编程 | 景岳手记 | 查看评论(2)

相关文章:

Powered By Z-Blog  触屏版 | WAP版 | 电脑版