当前位置: 代码迷 >> PB >> 怎么防止重复打开窗口
  详细解决方案

怎么防止重复打开窗口

热度:84   发布时间:2016-04-29 06:53:25.0
如何防止重复打开窗口
两种打开窗口的方式
一种用窗口名直接打开窗口对象,
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来实现。
  相关解决方案