两种打开窗口的方式
一种用窗口名直接打开窗口对象,
open(w_win),
它可以用isvalid进行判断
if not isvalid(w_win) then
open(w_win)
end if
我想问的是另外一种,通过窗口变量和窗口类型打开的,
window w_1
string ls_wname
select wname into :ls_wname from t;
open(w_1,ls_wname)
它如何判断已经打开,从而防止重复被重复打开?
如何防止重复打开窗口 ?pb
------解决方案--------------------
如果是用opensheet打开的,如
window lw_win
opensheet(lw_win, "w_1", w_mdi)
可以通过mdi窗口的getfirstsheet 和getnextsheet来查找,判断classname是否为"w_1"可知
如果是用open打开的,建议用一个实例变量或者全局变量来存储一下
window[] lw_win //定义为全局或者实例变量
open(lw_win[upperbound(lw_win)], "w_1")
然后遍历lw_win即可
------解决方案--------------------
也可以用标题区分...
------解决方案--------------------
findwindowA
------解决方案--------------------
调用API 函数 findwindowA ,检查有没有标题一样的窗口
------解决方案--------------------
给个类似的例子你,是防止多次运行的。
只让程序运行一次
1、定义外部函数:FUNCTION ULONG CreateMutexA(ULONG lpMutexAttributes , INT bInitialOwner , REF STRING lpName) LIBRARY 'kernel32.dll' 。
2、定义外部函数:FUNCTION ULONG GetLastError() LIBRARY 'kernel32.dll'
3、在应用的OPEN事件中写如下代码:
ULONG Ll_Mutex = 0 //应用句柄
ULONG Ll_Err = 0
STRING Ls_Mutex_Name //应用名称
IF handle(GetApplication() , FALSE) <> 0 THEN
Ls_Mutex_Name = THIS.AppName + CHAR(0)
Ll_Mutex = CreateMutexA(0 , 0 , Ls_Mutex_Name)
Ll_Err = GetLastError()
IF Ll_Err = 183 THEN
//程序已经运行
MESSAGEBOX("系统提示!" , "程序已经运行了!不能多次运行!")
HALT CLOSE
END IF
ELSE
//开发模式
...
END IF
另外一种方法:
定义一个外部函数:
FUNCTION ulong FindWindowA(ulong classname,string windowname) LIBRARY "user32.dll"
Application的Open事件中的代码:
boolean rtn
ulong l_handle, lu_class
string ls_name
setnull(lu_class)
ls_name = "API Name" // 将API Name换了你的主窗口的标题title
l_handle = FindWindowA(lu_class, ls_name)
if l_handle > 0 then
MessageBox("应用程序多次运行", This.AppName + "已经运行,你不能多次启动!")
Halt Close
else
open(w_main)
end if
------解决方案--------------------
可以考虑使用定义窗体的shared variables 变量,如定义一数值,在open事件里自动加1,close事件里减1,然后判断此值是否大于1来实现。