专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Html教程 » vfp表单:VFP解决表单重复运行的最好程序 »正文

vfp表单:VFP解决表单重复运行的最好程序

来源: 发布时间:星期二, 2008年11月18日 浏览:114次 评论:0
解决表单重复运行的最好程序
&&方法一:
****程序名随意,如myrunform.prg
****假设表单文件名为:查询表单.scx
****调用方法为: do myrunform.prg with "查询表单"
****张某2003年8月于佛山
parameters runformfilename
local formIndex,runformname,ifrunform
ifrunform=.f.
For m.formIndex = 1 To _Screen.FormCount
if juststem(SYS(1271,_Screen.Forms(m.formIndex)))==runformfilename
ifrunform=.t.
runformname=_Screen.Forms(m.formIndex).Name
if _Screen.Forms(m.formIndex).WindowState=1 &&窗口最小化
_Screen.Forms(m.formIndex).WindowState=0 &&窗口恢复为原样大小
endif
exit
endif
endfor
if ifrunform=.t.
Activate Windows (runformname)
else
do form &runformfilename
endif
return

************************
&&方法作者之修改
*表单重复运行的解决方法1还可简单些:
parameters runformfilename
local formIndex,ifrunform
ifrunform=.f.
For m.formIndex = 1 To _Screen.FormCount
if juststem(SYS(1271,_Screen.Forms(m.formIndex)))==runformfilename
ifrunform=.t.
Activate Windows (_Screen.Forms(m.formIndex).Name)
if _Screen.Forms(m.formIndex).WindowState=1 &&窗口最小化
_Screen.Forms(m.formIndex).WindowState=0 &&窗口恢复为原样大小
endif
exit
endif
endfor
if ifrunform=.f.
do form &runformfilename
endif
return
**********************************************

&&方法二:
设表单的标题(form.caption)为:查询窗口
DECLARE INTEGER FindWindow IN win32api STRING , STRING
IF FINDWINDOW(0,"查询窗口")=0 &&表单还没有运行
do form 查询表单
ENDIF

**************************
方法3:
****保证只运行表单的一个实例
****在表单的 init 事件中放入以下代码:
local i,windowname,retval
retval=.t.
i=0
windowname=wchild("",0) && 参见 wchild() 函的帮助
do while not empty(windowname)
if windowname=upper(this.name)
i=i+1
if i>1
retval=.f.
exit
endif
endif
windowname=wchild("",1)

************************************************************
*方法4:
****使用说明:do RunForm with "表单文件名","表单引用名(name)"
****如:do runform with "查询表单","Form1"
***************************************************
Function runform
Para cFormName,mFormName
*/以下两句为红飞狐加入,如缺少此两句,函数不能正常运行
cPublic="Public "+mFormName
&cPublic
If !(Type("&mFormName.")="O" and !Isnull(&mFormName.))
Do Form &cFormName Name &mFormName
Else
If &mFormName..WindowState=1
&mFormName..WindowState=0
Endif
&mFormName..Show
Endif
***********************
enddo
if retval=.f.
wait window "对不起 ,该表单已运行,不能多次运行该表单" nowait
endif
return retval &&在表单或对象的init事件中返回.f. 将取消该实例的建立

***********************
&&方法五:
if wexist("表单NAME“)
activate window "表单NAME"
else
do form "查询表单.scx"
endif
***********************
&&方法六:
*第一次运行表单(查询表单.scx)前先执行代码
_screen.addproperty("requery",.t.)
在表单的Destroy写入如下的代码:
_screen.requery=.f.
*运行表单的代码:
if _screen.requery=.f.
do form 查询表单
else
wait window "查询窗口已打开,禁止再次打开"
endif

*说明:
*表单重复运行的解决方法5的补充说明:
*其中的_screen.addproperty("requery",.t.)
*可以这样: public requery
*requery=.t.
*但如在其它地方如果不慎使用release、clear等命令时
*可能把requery清除
***************************
*方法七
*--防止多次进入---------------------
If This._l不可重入 AND not gnGetkeystate(0x10)>100 && not shift press
For i=1 To _Screen.FormCount
o=_Screen.Forms(i)
IF not PEMSTATUS(o,'_c标识',5) OR o=this
LOOP
ENDIF
If o._c标识==this._c标识
If _Screen.Forms(i).WindowState=1
_Screen.Forms(i).WindowState=0
Endif
_Screen.Forms(i).Show
Return .F.
Endif
Next
Endif
*-EOF--防止多次进入---------------------
*******************************
*方法八
LOCAL nfrm
nfrm=0
FOR EACH fm IN _screen.forms
IF fm.caption=this.Caption
nfrm=nfrm+1
ENDIF
ENDFOR
RETURN (nfrm=1)
*-----------------------------------------------------
*将这段代码放到自己的form类的load()中即可,我是用Caption来标识form身份,你也可以用
*别的,如name,tag等等,我是不高兴用额外标识的. 自然,这种方法不能用于顶层表单.

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: