CSDN=>FAQ=>FAQ 展示
  • 问题内容:表单运行时用BINDEVENT()来绑定事件,属性或方法从VFP自己的对象到其它VFP对象
  • 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5209478
  • 所属论坛:VFP     审核组:其他数据库开发
  • 提问者:LAIYANGPJ     解决者:apple_8180
  • 感谢:apple_8180
  • 关键字:函数 控件 其他数据库开发 VFP 添加 代码 click 触发 addobject bindevent
  • 答案:

    列子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开始才有

  • 评价: 有价值 给朵鲜花(3) 无价值 扔个鸡蛋(1)
相关FAQ
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo