为什么我必须使用UserControl.MousePointer而不是Me.MousePointer?

时间:2018-03-20 23:00:29

标签: vb6

在UserControl上的VB6中,我必须使用UserControl.MousePointer = vbDefault而不是Me.MousePointer = vbDefault。我可以在表单上使用Me.MousePointer(并Form.MousePointer无效。

为什么我必须使用UserControl.MousePointer代替Me.MousePointer

我的意思是文字" UserControl",而不是UserControl作为另一个控件名称的占位符。

2 个答案:

答案 0 :(得分:2)

Me不是您认为的那样。它是对您使用它的模块的当前实例的引用,而不是“魔术”。

要获得您想要的内容,您必须将此属性添加到UserControl的默认界面,例如:

Option Explicit

Public Property Get MousePointer() As MousePointerConstants
    MousePointer = UserControl.MousePointer
End Property

Public Sub Test()
    MsgBox Me.MousePointer
End Sub

在VB6中,表单有点不同,可能是16位VB的保留,以便更容易移植旧代码。这些似乎总是从隐藏的接口继承。这是在您无权访问的类型库中定义的,因为Microsoft未将其作为VB6的一部分发布。试图查询它通常会出现如下错误:

  

无法跳转到'MousePointer',因为它位于库'Unknown10'中,当前未被引用

单从这一点来看,使用Me似乎总是会带来很小的性能损失。在我看来你正在通过它的默认COM接口而不是直接进入模块的程序。

您必须检查已编译的代码以确定是否存在性能损失,如果存在性能损失,则需要检查多少。我没有看到这个记录,所以否则我们只是猜测它。

在任何情况下,没有理由永远使用Me,除非您必须为了符合条件。

Crummy例子但是:

Option Explicit

Private mCharm As Long

Public Property Get Charm() As Long
    Charm = mCharm
End Property

Public Property Let Charm(ByVal RHS As Long)
    mCharm = RHS
    'Maybe we do more here such as update the user interface or some
    'other things.
End Property

Public Sub GetLucky(ByVal Charm As Long)
    'Do some stuff.
    Charm = Charm + Int(Rnd() * 50000)
    'etc.
    Me.Charm = Charm 'Here we use Me so we can assign to the property Charm.
End Sub

这真的是关于Me的唯一合法用途:确定所需的命名空间。依靠它,因为在输入时它会带来智能感知只是懒惰。

如果有任何 Forms 被“破坏”而不是UserControls。

答案 1 :(得分:1)

想出来。事实证明,由于UserControl是一个ActiveX控件,VB6为你做了一些魔术。使用Form控件,它不是ActiveX控件,这就是为什么可以通过Me访问MousePointer属性,就像您期望的那样。

对于UserControl,您在VB6中创建的UserControl控件位于另一个控件上 - ActiveX控件。可以通过UserControl访问该ActiveX控件。像这样:

class Form
{
    int MousePointer;
}
class YourForm : Form
{
    // we actually inherit from Form so we use Me.MousePointer
}

但对于表格,它更像是这样:

unittest