treeview控件怎么没有gotfocus事件?
http://topic.csdn.net/u/20090224/09/e4db8513-4cae-4b22-9ada-ddceb161272d.html?seed=226467083 --------------------编程问答-------------------- 补充说明:在VBA中,对标准控件却没有上面这个帖子所说的情况。比如,在类里封装指向textbox的withevents变量m_txtSngValue,那么它的所有事件都可在IDE的下拉列表里看到(如下图);并且在给m_txtSngValue赋值的时候,可以直接set它等于一个textbox对象,而不需要等于textbox.object。
--------------------编程问答-------------------- 下图是封装treeview变量的类,你看它没有gotfocus事件,许多其他常规事件也不见了:
--------------------编程问答-------------------- Access.TextBox 是 Access 的标准控件,而不是 COM 的标准控件,没有可比性。
Access 不熟悉,你可以试试用 Access 的 UserControl 封装一下标准的 TreeView 控件。 --------------------编程问答-------------------- 请问你在VB6下封装treeview有事件丢失的情况么? --------------------编程问答-------------------- ,另外,想问一下,有次你说MSDN用的时候要限制一下子集什么的。我记性不好,刚才找了半天没找到,你能再告诉我一下么? --------------------编程问答-------------------- '让当前节点的子节点生孩子 --------------------编程问答--------------------
热吧?快开空调吧。 --------------------编程问答-------------------- 在 VB 下就不用封装直接使用 TreeView 了。
MSDN 子集:菜单“查看\定位选项卡”要选中,左侧上部的“活动子集”下拉框。 --------------------编程问答--------------------
不用封装,R U SURE?!
刚在网上看到一段代码,感觉是一样的要封装啊?!
(1)类cls的代码;--------------------编程问答-------------------- 这是VB6的一个网络教程里的代码,楼上贴的有点乱,重贴:
Option Explicit''''变量检查
Private WithEvents mytxt As TextBox
''''本类中的方法接受和控制一个text密码框
Dim isNUM As Boolean
''''类的模块级变量
Public Sub Attach(itTEXT As TextBox)
''''接受外部变量到mytxt中
Set mytxt = itTEXT
End Sub
Private Sub mytxt_KeyUp(KeyCode As Integer, Shift As Integer)
isNUM = (KeyCode >= 65) And (KeyCode <= 90)
''''测试密码框的键盘输入是否是英文字母
If isNUM = False Then
Beep
mytxt.Text = ""
''''如果输入不是英文字母则响铃并且清空密码框内容
MsgBox "非法字符输入!"
End If
Debug.Print mytxt.Text
''''调试输出密码框内容
End Sub
''''类的代码结束
Option Explicit''''变量检查--------------------编程问答-------------------- from here:http://www.host01.com/article/software/VisualBasic/2006091718394741.htm --------------------编程问答-------------------- 我的“封装”特指将控件用容器装起来。 --------------------编程问答--------------------
Private WithEvents mytxt As TextBox
''''本类中的方法接受和控制一个text密码框
Dim isNUM As Boolean
''''类的模块级变量
Public Sub Attach(itTEXT As TextBox)
''''接受外部变量到mytxt中
Set mytxt = itTEXT
End Sub
Private Sub mytxt_KeyUp(KeyCode As Integer, Shift As Integer)
isNUM = (KeyCode >= 65) And (KeyCode <= 90)
''''测试密码框的键盘输入是否是英文字母
If isNUM = False Then
Beep
mytxt.Text = ""
''''如果输入不是英文字母则响铃并且清空密码框内容
MsgBox "非法字符输入!"
End If
Debug.Print mytxt.Text
''''调试输出密码框内容
End Sub
''''类的代码结束
你的意思是说:在VB6中如果要在类里声明一个指向treeview控件的withevents变量m_tvw,那么attach的时候,你只需要这样:
set m_tvw = form1.treeview0
而不需要这样:
set m_tvw= form1.treeview0.object
是么? --------------------编程问答-------------------- 与是否用 Object 属性无关。
“封装”通常是指将某个对象、控件用另外一个对象、控件包起来,外部不用直接调用被封装的对象,只要调用外部容器就能完成功能。
当然有时候也会将一些内部对象的方法、属性通过容器的同名方法、属性来间接进行调用。
如果是一对一的封装就比较接近继承机制。只是 COM 标准是没有继承的,所以用封装。
在 Access 中“封装”,是因为 TreeView 没有你要的事件或属性,我想 Access 自己的 UserControl 应该有相关的事件或属性,所以考虑用 UserControl 封装 TreeView。
--------------------编程问答--------------------
那个treeview是标准的SP6的treeview啊。你确定在VB里那么用不会丢事件么? --------------------编程问答-------------------- 事件是控件定义的,它决定给你什么事件。
实践是检验的标准。 --------------------编程问答--------------------
为了检验它,费老了劲了。刚把VB6装上…… --------------------编程问答-------------------- 唉。实践表明,许多在VBA中的问题在VB6中不是问题。 --------------------编程问答-------------------- 刚才发现,在ACCESS VBA里,当在ACCESS窗体上添加一个treeview控件时,系统自动把它封装在一个叫做customcontrol的容器里。
也就是:
?TypeName(me.TreeView0)
CustomControl
?TypeName(me.TreeView0.object)
TreeView
--------------------编程问答-------------------- 我在CTreeCtl类里设了个成员变量:Private WithEvents m_ocxTree As CustomControl
这样在对象框里选m_ocxTree,过程列表框里就有gotfocus --------------------编程问答-------------------- 麻烦的是,貌似CustomControl类型是通用类型,不支持withevents的。
因为我在CTreeCtl类里试图初始化ocxTree,下面这句会报错“对象或类不支持的事件集”
Set m_ocxTree = Forms(strTreeWnd).Controls(strTreCtlName)
如果把Private WithEvents m_ocxTree As CustomControl 改成
Private m_ocxTree As CustomControl
就不会报错。可是酱紫我也得不到gotfocus事件了。
真够纠结的 --------------------编程问答-------------------- 这样才比较合理,如果每个 ActiveX 都需要自己编程封装一下微软的设计也太差了。
好像是通过 OnGotFocus 属性来指定关联的事件响应,不知道在类中可不可以用。 --------------------编程问答--------------------
可以指定。这不是问题的关键。
关键在于,我得不到gotfocus事件,就是说,在VBA IDE的代码编辑区的顶端右侧的事件列表里没有gotfocus, 除非我把m_ocxTree设置为withevents。
可是另一方面,把m_ocxTree设置为withevents会报错…… --------------------编程问答-------------------- 机制不一样,用 OnGotFocus 指定类似于回调函数,不可能在事件列表中找到。 --------------------编程问答-------------------- 啊?这种用法我常用啊?一般是像下面这么用
Forms(strTreeWnd).Controls(strTreCtlName).OnGotFocus = "[Event Procedure]"
其中的"[Event Procedure]"是不能改的,就必须是这俩词儿,这么写完之后,系统就会自动调用对应的事件过程(用对象名加下划线加事件名标识的那种)
难道你的意思说,我直接这么写:
Forms(strTreeWnd).Controls(strTreCtlName).OnGotFocus = "m_ocxTree_GotFocus"
i try try哈 --------------------编程问答-------------------- Forms(strTreeWnd).Controls(strTreCtlName).OnGotFocus = "m_ocxTree_GotFocus"
这条语句不行。报错:Access找不到宏“m_ocxTree_GotFocus”。 --------------------编程问答-------------------- 我看看!! --------------------编程问答-------------------- 看来不行,要求指定的是宏,不是函数名。 --------------------编程问答-------------------- 灵异事件:09年6月2号的帖子竟然浮到第一页了? --------------------编程问答-------------------- 问题还没解决,所以不能结帖。
可我未结帖超过限制,不能发帖了,无奈只好移动一哈:) --------------------编程问答-------------------- o ,还可以自己移动未结贴啊。 --------------------编程问答--------------------
上有政策,下有对策 --------------------编程问答-------------------- 哦,‘移动’就浮到面上了?
补充:VB , 非技术类