当前位置:编程学习 > VB >>

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用的时候要限制一下子集什么的。我记性不好,刚才找了半天没找到,你能再告诉我一下么? --------------------编程问答-------------------- '让当前节点的子节点生孩子  --------------------编程问答--------------------
引用 6 楼 AisaC 的回复:
'让当前节点的子节点生孩子 


热吧?快开空调吧。 --------------------编程问答-------------------- 在 VB 下就不用封装直接使用 TreeView 了。

MSDN 子集:菜单“查看\定位选项卡”要选中,左侧上部的“活动子集”下拉框。 --------------------编程问答--------------------
引用 8 楼 Tiger_Zhao 的回复:
在 VB 下就不用封装直接使用 TreeView 了。 


不用封装,R U SURE?!

刚在网上看到一段代码,感觉是一样的要封装啊?!

  (1)类cls的代码;

   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

    ''''类的代码结束
--------------------编程问答-------------------- 这是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

    ''''类的代码结束
--------------------编程问答-------------------- from here:http://www.host01.com/article/software/VisualBasic/2006091718394741.htm --------------------编程问答-------------------- 我的“封装”特指将控件用容器装起来。 --------------------编程问答--------------------
引用 12 楼 Tiger_Zhao 的回复:
我的“封装”特指将控件用容器装起来。


你的意思是说:在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。
--------------------编程问答--------------------
引用 14 楼 Tiger_Zhao 的回复:
与是否用 Object 属性无关。 

“封装”通常是指将某个对象、控件用另外一个对象、控件包起来,外部不用直接调用被封装的对象,只要调用外部容器就能完成功能。 
当然有时候也会将一些内部对象的方法、属性通过容器的同名方法、属性来间接进行调用。 
如果是一对一的封装就比较接近继承机制。只是 COM 标准是没有继承的,所以用封装。 

在 Access 中“封装”,是因为 TreeView 没有你要的事件或属性,我想 Access 自己的 …


那个treeview是标准的SP6的treeview啊。你确定在VB里那么用不会丢事件么? --------------------编程问答-------------------- 事件是控件定义的,它决定给你什么事件。
实践是检验的标准。 --------------------编程问答--------------------
引用 16 楼 Tiger_Zhao 的回复:
事件是控件定义的,它决定给你什么事件。 
实践是检验的标准。


为了检验它,费老了劲了。刚把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 属性来指定关联的事件响应,不知道在类中可不可以用。 --------------------编程问答--------------------
引用 22 楼 Tiger_Zhao 的回复:
这样才比较合理,如果每个 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 ,还可以自己移动未结贴啊。 --------------------编程问答--------------------
引用 30 楼 slowgrace 的回复:
问题还没解决,所以不能结帖。

可我未结帖超过限制,不能发帖了,无奈只好移动一哈:)


上有政策,下有对策 --------------------编程问答-------------------- 哦,‘移动’就浮到面上了?
补充:VB ,  非技术类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,