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
到此该实例完成,具体思路应该很清晰了,不作具体解释,大家可以拿去试试。
最后,很高兴自己能完成这个非常具有挑战性的问题,也希望我的思路能给有需要的同仁们带来或多或少的帮助。
发布:徐景岳 | 分类:景岳手记 | 评论:2 | 浏览:
相关文章:
多个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)
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
评论列表: