注册 登录
编程论坛 VFP论坛

用纯代码,在_SCREEN上添加控件,如何实现事件响应

oyjh710129 发布于 2025-06-18 09:46, 139 次点击
&&直接向 _SCREEN 添加控件的代码程序
* 清除 _SCREEN 上可能存在的旧控件
IF TYPE("_SCREEN.txtInput") = "O"
    _SCREEN.RemoveObject("txtInput")
ENDIF

gnVariable=0
use yourTable

* 向 _SCREEN 添加文本框控件
_SCREEN.AddObject("txtInput", "TextBox")
WITH _SCREEN.txtInput
    _SCREEN.txtInput.Visible = .T.
    _SCREEN.txtInput.Top = 50
    _SCREEN.txtInput.Left = 50
    _SCREEN.txtInput.Width = 200
    _SCREEN.txtInput.Height = 24
    .ControlSource = "gnVariable"  && 绑定到变量



* 添加按钮控件
_SCREEN.AddObject("btnClose", "CommandButton")

    _SCREEN.btnClose.Caption = "关闭"
    _SCREEN.btnClose.Top = 100
    _SCREEN.btnClose.Left = 50
    _SCREEN.btnClose.Width = 80
    _SCREEN.btnClose.Height = 30
    _SCREEN.btnClose.Visible = .T.


    PROCEDURE _SCREEN.btnClose.Click
      _SCREEN.RemoveObject("txtInput")
      _SCREEN.RemoveObject("btnClose")
    ENDPROC


* 刷新 _SCREEN 显示
_SCREEN.Refresh()

read events




以上
    PROCEDURE _SCREEN.btnClose.Click
      _SCREEN.RemoveObject("txtInput")
      _SCREEN.RemoveObject("btnClose")
    ENDPROC
出错,不知应该怎么才正确,请哪位大咖指导一下。










6 回复
#2
吹水佬2025-06-18 14:30
#3
oyjh7101292025-06-18 16:42
是的,建立类后是可以运行了,但事件运行完后,不会退出来执行程序的下一语句。
#4
hsfisher2025-06-19 00:07
学习了
#5
sam_jiang2025-06-19 11:34
回复 楼主 oyjh710129
创建的对象btnclose的click事件是空的,并没有代码。vfp不能运行时给事件写入代码。。。

可以自定义btnclose类,在类中加入click代码,再实例化这个类,就可以了。

或者使用bindevent给click事件关联一个自定义的事件,并执行它。

修改你的代码,vfp9.0+win7下运行通过~
程序代码:

&&直接向 _SCREEN 添加控件的代码程序
* 清除 _SCREEN 上可能存在的旧控件
IF TYPE("_SCREEN.txtInput") = "O"
    _SCREEN.RemoveObject("txtInput")
ENDIF
IF TYPE("_SCREEN.btnclose") = "O"
    _SCREEN.RemoveObject("btnclose")
ENDIF
*!*    gnVariable=0
*!*    use yourTable

* 向 _SCREEN 添加文本框控件
_SCREEN.AddObject("txtInput", "TextBox")
WITH _SCREEN.txtInput
    .Visible = .T.
    .Top = 50
    .Left = 50
    .Width = 200
    .Height = 24
*!*        .ControlSource = "gnVariable"  && 绑定到变量
ENDWITH


* 添加按钮控件
_SCREEN.AddObject("btnClose", "CommandButton")
WITH _screen.btnclose

    .Caption = "关闭"
    .Top = 100
    .Left = 50
    .Width = 80
    .Height = 30
    .Visible = .T.
   
ENDWITH

PUBLIC locustom && 没有申明这个变量作用域,居然不能正确运行,排错很久。。。
*加入read events,就可以删除上面这句了。
locustom=CREATEOBJECT("ocustom")
*确保控件已正确创建
IF TYPE("_SCREEN.btnClose") = "O"   
    BINDEVENT(_SCREEN.btnClose, "Click", locustom, "customClick")
ELSE   
    MESSAGEBOX("按钮控件不存在")
ENDIF
* 刷新 _SCREEN 显示
*_SCREEN.Refresh()
*RELEASE locustom
read events &&不然一闪而过

DEFINE CLASS ocustom AS Custom   
PROCEDURE customClick        
    *WAIT WINDOW "事件触发成功" TIMEOUT 1        
    _SCREEN.RemoveObject("txtInput")        
    _SCREEN.RemoveObject("btnClose")
    RELEASE locustom
    clear events
ENDPROC
ENDDEFINE






[此贴子已经被作者于2025-6-19 11:42编辑过]

#6
sam_jiang2025-06-19 12:04
添加自定义类的方式如下:

程序代码:

&&直接向 _SCREEN 添加控件的代码程序
* 清除 _SCREEN 上可能存在的旧控件
IF TYPE("_SCREEN.txtInput") = "O"
    _SCREEN.RemoveObject("txtInput")
ENDIF
IF TYPE("_SCREEN.btnclose") = "O"
    _SCREEN.RemoveObject("btnclose")
ENDIF
*!*    gnVariable=0
*!*    use yourTable

* 向 _SCREEN 添加文本框控件
_SCREEN.AddObject("txtInput", "TextBox")
WITH _SCREEN.txtInput
    .Visible = .T.
    .Top = 50
    .Left = 50
    .Width = 200
    .Height = 24
*!*        .ControlSource = "gnVariable"  && 绑定到变量
ENDWITH


* 添加按钮控件
_SCREEN.AddObject("btnClose", "mybtnclose")
WITH _screen.btnclose

    .Caption = "关闭"
    .Top = 100
    .Left = 50
    .Width = 80
    .Height = 30
    .Visible = .T.
   
ENDWITH

DEFINE CLASS mybtnclose AS commandbutton
PROCEDURE Click        
    _SCREEN.RemoveObject("txtInput")        
    _SCREEN.RemoveObject("btnClose")
ENDPROC
ENDDEFINE
#7
schtg2025-06-19 13:35
学习啦,谢谢!
1