注册 登录
编程论坛 VFP论坛

关于判断表单是否运行的问题

雨花石568 发布于 2023-01-14 17:27, 2467 次点击
有两个表单:表单1、表单2。表单1中有command1、command2。
command1代码如下:
USE qj.dbf
DO FORM 表单2.scx
command2代码如下:
USE xj.dbf
DO FORM 表单2.scx
想要实现功能:点击command1时,首先检测表单2是否运行,如果运行了就提示“请先关闭表单2”,如果没有表单2没有运行,就直接打开表单2。点击command2同理。
测试文件如下
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-1-14 17:29编辑过]

14 回复
#2
kangss2023-01-14 17:29
回复 楼主 雨花石568
WEXIST( ) 函数
请参阅 示例
 全部折叠 全部展开
检测所指定的用户自定义窗口是否存在。

 
WEXIST(WindowName)
 

参数
WindowName

指定用户自定义窗口的名称。也可以指定 Visual FoxPro 系统窗口的名称(如“命令”窗口、“数据工作期”窗口、“浏览”窗口等),在 Visual FoxPro 中,还可以指定工具栏的名称。如果所指定的系统窗口或工具栏可见或隐藏,则 WEXIST( ) 函数返回“真”(.T.)。如果所指定的系统窗口或工具栏已关闭,则返回“假”(.F.)。“命令”窗口和“调试”窗口是两个例外。在 WEXIST( ) 中包含“命令”窗口 的名称时,总是返回“真”(.T.)。如果曾经打开过“调试”窗口,即使被关闭,WEXIST( ) 函数仍返回“真”(.T.)。
#3
雨花石5682023-01-14 17:30
回复 2楼 kangss
请问command1代码如何更改?
#4
sam_jiang2023-01-14 18:12
方法有很多种,我提供一种给你参考。

form2 的init里加以下代码:
public Oform
oform=this
form2 的destroy里加以下代码:
oform=null
Release oform

form1的command1里代码如下:
IF VARTYPE(oform)="U" OR ISNULL(oform)
    do form form2
esle
    MESSAGEBOX("请先关闭form2!")
ENDIF
#5
雨花石5682023-01-14 20:05
回复 4楼 sam_jiang
此方法可行。
如果用wexist()函数,怎么编写代码呢?
#6
sam_jiang2023-01-14 21:20
回复 5楼 雨花石568
很少用wexist()函数,好像不能通过form.name获得form窗体。
可以用Api函数FindWindow来查找是否有窗口form2
DECLARE integer FindWindow IN WIN32API string,string
nhwnd=findwindow(null,"yourformcaption")
if nhwnd =0
    do form form2
else
    MESSAGEBOX("请先关闭form2!")
endif

findwindow函数的例子

DECLARE integer FindWindow IN WIN32API string,string
a=findwindow(null,_vfp.Caption)
?a
?_vfp.hWnd
a=findwindow(null,"Command")
?a
a=findwindow(null,"命令")
?a
#7
laowan0012023-01-14 21:20
if vartype(变量2)='O'
    MESSAGEBOX("请先关闭form2!")
else
    DO FORM 表单2.scx name 变量2 linked
endif

#8
sam_jiang2023-01-14 21:35
回复 7楼 laowan001
又学到一种方法。。。
#9
pvm20002023-01-15 06:05
以下是引用laowan001在2023-1-14 21:20:16的发言:

if vartype(变量2)='O'
    MESSAGEBOX("请先关闭form2!")
else
    DO FORM 表单2.scx name 变量2 linked
endif


这种操作,有时间试试。
#10
雨花石5682023-01-15 21:16
回复 7楼 laowan001
我测试了一下,这个代码不行。
根据你的思路,我调整为如下代码,可行:
IF VARTYPE(asd)='O'
    MESSAGEBOX('请先关闭“查看”窗口')
ELSE
    PUBLIC asd   &&创建全局变量asd
    USE qj.dbf
    DO FORM 表单2.scx NAME asd linked
ENDIF
原因不知道

表单2的destroy中加上  release asd  可以达到效果,不加也可以达到效果。
原因也不知道


感谢提供新思路。
#11
sam_jiang2023-01-15 23:56
回复 10楼 雨花石568
他的代码可以的,不知道你说的不可以是什么情况,系统什么提示?
#12
sam_jiang2023-01-15 23:57
回复 10楼 雨花石568
全局变量要及时释放,系统不会自动释放的。
#13
csyx2023-01-16 09:11
用得着这么麻烦吗?
只有本站会员才能查看附件,请 登录
#14
雨花石5682023-01-16 13:26
回复 11楼 sam_jiang
没有提示,就是点击command1后,闪一下,没有显示表单2。
#15
jhm2023-02-07 19:43
If Type("MyForm") = "U"
    Public MyForm
    Do Form Main.scx Name MyForm Linked
Else
    Messagebox("该表单已经运行!", 0 + 64, "提示信息:")
    MyForm.WindowState=0
Endif
1