如何动态在文本框加入,触发代码
我想在文体框,运行时,右键加入以下代码
do test.mpr
***
加入后,效果,文体框,右键时,弹出一个菜单
[解决办法]
请参考:
表单运行时用BINDEVENT()来绑定事件,属性或方法从VFP自己的对象到其它VFP对象
*--------------------------------
列子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