列子1:
在一个表单中有n个命令按钮,我想随便单击其中任何一个按钮,此表单关闭,进入另一个表单。
不想一个按钮一个按钮的添加代码,而想用动态方式将对象的CLICK事件与原有或新建的事件或方法绑定。
----------------------------------------------------------------------------------
可以为表单新建一个方法,比如MyMethod,然后写入诸如下面的代码:
THISForm.Release
DO FORM 表单名
在表单的Init事件中加入以下代码:
FOR i = 1 TO THIS.ControlCount
IF UPPER(THIS.Controls[i].BaseClass) == "COMMANDBUTTON"
= BINDEVENT(THIS.Controls[i], "Click", THIS, "MyMethod")
ENDIF
ENDFOR
这样应该就可以了。但是,需要注意的是,只有VFP7以上版本才有BINDEVENT()函数。
也完全可以把按钮做成类,然后再向表单中添加若干基于该类的按钮。
不过如果如你所说,按钮是不可视的,那应该怎么都没用了。
列子2:
----------------------------------------------------------------------------------
动态加载一个控件,如按钮,并给按钮的Click事件绑定事件:
1、建一个过程文件(如MyProc.PRG),内容如下
DEFINE CLASS myhandler AS Session
PROCEDURE CmdClick
MESSAGEBOX('ok',64,'') &&此处改为相应代码
RETURN
ENDPROC
ENDDEFINE
2、表单的INIT事件:
SET PROCEDURE TO MyProc.prg
3、表单上动态加载控件按钮的CLICK事件:
THISFORM.ADDOBJECT('Cmd_Test','CommandButton')
THISFORM.Cmd_Test.CAPTION='Cmd_Test'
THISFORM.Cmd_Test.TOP=100
THISFORM.Cmd_Test.LEFT=100
THISFORM.Cmd_Test.HEIGHT=25
PUBLIC oHandler
oHandler=NEWOBJECT("myhandler")
BINDEVENT(THISFORM.Cmd_Test,"Click",oHandler,"CmdClick")
THISFORM.Cmd_Test.VISIBLE=.T.
----------------------------------------------------------
例子3:
*BINDEVENT() 函数。下面是一个简单示例。
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.SHOW
RETURN
DEFINE CLASS form1 AS FORM
TOP = 24
LEFT = 158
DOCREATE = .T.
CAPTION = "Bindevent 示例"
NAME = "Form1"
PROCEDURE _click
THISFORM.text1.VALUE=THISFORM.ACTIVECONTROL.NAME &&此处可改为表单文件名
ENDPROC
PROCEDURE INIT
LOCAL i,j,cname
THISFORM.LOCKSCREEN=.T.
FOR i=1 TO 3
FOR j=1 TO 3
cname='cmd'+STR(i,1)+STR(j,1)
THISFORM.ADDOBJECT(cname,'commandbutton')
WITH THISFORM.&cname.
.LEFT=j*100-60
.TOP=i*40
.CAPTION='按钮 &cname.'
.HEIGHT=25
.WIDTH=80
.VISIBLE=.T.
ENDWITH
BINDEVENT(THISFORM.&cname.,'click',THISFORM,'_CLICK')
ENDFOR
ENDFOR
THISFORM.ADDOBJECT('text1','textbox')
WITH THISFORM.text1
.LEFT=80
.TOP=160
.HEIGHT=25
.WIDTH=200
.VISIBLE=.T.
ENDWITH
THISFORM.LOCKSCREEN=.F.
ENDPROC
ENDDEFINE
*注意一点:Bindevent引用的代码中慎用“This”引用控件,它指向的还是原方法所在对象。如上例中,如果方法中出现“This”,则,它指的是表单,而不是按钮。
---------------------------------------------------------------
例子4:
下列代码将Visual FoxPro主窗口的MouseMove事件绑定到自定义类MyHandler的MyMouseMove方法,绑定后,当在主窗口中移动鼠标时,将显示鼠标的坐标位置。
PUBLIC oHandler &&注意,请将保存对象的变量设置为全局变量
oHandler=NEWOBJECT("MyHandler")
*!* 将_SCREEN.MouseMove绑定到oHandler.MyMouseMove
=BINDEVENT(_SCREEN,"MouseMove",oHandler,"MyMouseMove")
DEFINE CLASS MyHandler AS Custom
PROCEDURE MyMouseMove
*!* 要保证该方法与_SCREEN.MouseMove有同样的参数设置
LPARAMETERS nButton, nShift, nXCoord, nYCoord
WAIT WINDOW "鼠标坐标:"+STR(nXCoord)+"|"+STR(nYCoord) NOWAIT
ENDPROC
ENDDEFINE
或
PUBLIC oHandler &&注意,请将保存对象的变量设置为全局变量
oHandler=NEWOBJECT("MyHandler")
=BINDEVENT(_SCREEN,"RESIZE",oHandler,"MyRESIZE")
=BINDEVENT(_SCREEN,"CLICK",oHandler,"MyCLICK")
=BINDEVENT(_SCREEN,"MouseMove",oHandler,"MyMouseMove")
DEFINE CLASS MyHandler AS CUSTOM
PROCEDURE MyRESIZE
? "发生了Resize事件"
ENDPROC
PROCEDURE MyCLICK
? "发生了Click事件"
ENDPROC
PROCEDURE MyMouseMove
LPARAMETERS nButton, nShift, nXCoord, nYCoord
WAIT WINDOW "水平坐标:"+STR(nXCoord)+"垂直坐标:"+STR(nYCoord) NOWAIT
ENDPROC
ENDDEFINE
---------------------------------------------------------------
注意:
函数BINDEVENT只有VFP8.0开始才有
联系客服