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
相关文章
读者评论
发表评论 |