在UserControl上的VB6中,我必须使用UserControl.MousePointer = vbDefault
而不是Me.MousePointer = vbDefault
。我可以在表单上使用Me.MousePointer
(并Form.MousePointer
无效。
为什么我必须使用UserControl.MousePointer
代替Me.MousePointer
?
我的意思是文字" UserControl",而不是UserControl
作为另一个控件名称的占位符。
答案 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