VBA OOP如何生成子属性

VBA OOP如何生成子属性,vba,class,properties,Vba,Class,Properties,如何对类模块进行编程,以便调用属性上的属性 我不确定我使用的术语是否正确,因此我将尝试澄清。在MsAccess中,每当我想要操作表单上的元素时,我都可以使用句点来分隔每个对象来引用它们。例如,如果我想更改文本框的值,我可以调用: form("formname").txtboxname.value = "new value" 这就像我有一个表单对象,它有一个文本框对象,它有一个值对象 我如何在自己的课堂模块中实现这一点 我的具体示例是,我在类的私有变量中存储了一个数组,但是我不能简单地使用属性G

如何对类模块进行编程,以便调用属性上的属性

我不确定我使用的术语是否正确,因此我将尝试澄清。在MsAccess中,每当我想要操作表单上的元素时,我都可以使用句点来分隔每个对象来引用它们。例如,如果我想更改文本框的值,我可以调用:

form("formname").txtboxname.value = "new value"
这就像我有一个表单对象,它有一个文本框对象,它有一个值对象

我如何在自己的课堂模块中实现这一点

我的具体示例是,我在类的私有变量中存储了一个数组,但是我不能简单地使用属性GET返回数组。(我不想公开它,因为数组是以编程方式填充的)但是如果我想迭代,我需要知道该数组的Ubound和Lbound值

我宁愿避免将Ubound和Lbound值存储在它们自己的变量中,因为这似乎是一种浪费

我怎样才能对类进行编程以获得?子类

所以如果我想要ubound或lbound,我可以调用

set x = mycls
debug.? x.pArrayVariable.getLBound
即使是正确的术语也能让我更接近一个答案,我试着搜索属性和子属性,但我不确定这是否能帮我找到答案

我的类的示例:mycls

Private pArrayVariable() as string

public property get pArrayVariable() as string
  'Run Code to Populate array here
  Array() = pArray()
end property

我问的是所谓的“集合”吗?

我仍然对上面的原始问题感到好奇,但它是由于无法访问阵列而产生的。看来我错了

你可以用

Public Property Get ArrayVariable() As String()
  Call 'code to populate array
  ArrayVariable= pArrayVariable() 'Notice the paren here
End Property
然后引用数组

debug.? ubound(clsvar.ArrayVariable()) 'Notice paren here too
or
debug.? clsvar.ArrayVariable()(1) 'Notice the parens here too

因此,属性可以返回具有自己属性的对象(如用户类)。示例如下:

下面是名为
MinMax

Private m_min As Integer
Private m_max As Integer

Public Property Get MinValue() As Integer
    MinValue = m_min
End Property
Public Property Let MinValue(ByVal x As Integer)
    m_min = x
End Property
Public Property Get MaxValue() As Integer
    MaxValue = m_max
End Property
Public Property Let MaxValue(ByVal x As Integer)
    m_max = x
End Property

Public Sub SetMinMax(ByVal min_value As Integer, ByVal max_value As Integer)
    m_min = min_value
    m_max = max_value
End Sub

Private Sub Class_Initialize()
    m_min = 0
    m_max = 1
End Sub
Private m_target As MinMax
Private m_name As String

Public Property Get Target() As MinMax
    Target = m_target
End Property

Public Property Get Name() As String
    Name = m_name
End Property

Private Sub Class_Initialize()
    Set m_target = New MinMax
    m_name = vbNullString
End Sub

Public Sub SetValues(ByVal a_name As String, ByVal min_value As Integer, ByVal max_value As Integer)
    m_name = a_name
    m_target.SetMinMax min_value, max_value
End Sub
下面是名为
MyClass
的类的代码。请注意它如何公开类型为
MinMax

Private m_min As Integer
Private m_max As Integer

Public Property Get MinValue() As Integer
    MinValue = m_min
End Property
Public Property Let MinValue(ByVal x As Integer)
    m_min = x
End Property
Public Property Get MaxValue() As Integer
    MaxValue = m_max
End Property
Public Property Let MaxValue(ByVal x As Integer)
    m_max = x
End Property

Public Sub SetMinMax(ByVal min_value As Integer, ByVal max_value As Integer)
    m_min = min_value
    m_max = max_value
End Sub

Private Sub Class_Initialize()
    m_min = 0
    m_max = 1
End Sub
Private m_target As MinMax
Private m_name As String

Public Property Get Target() As MinMax
    Target = m_target
End Property

Public Property Get Name() As String
    Name = m_name
End Property

Private Sub Class_Initialize()
    Set m_target = New MinMax
    m_name = vbNullString
End Sub

Public Sub SetValues(ByVal a_name As String, ByVal min_value As Integer, ByVal max_value As Integer)
    m_name = a_name
    m_target.SetMinMax min_value, max_value
End Sub
现在主代码可以有如下语句

Public Sub Test()
    Dim t As New MyClass
    t.SetValues "Mary", 1, 100

    Debug.Print t.Target.MinValue, t.Target.MaxValue
End Sub

表单中的文本框不是子类,而是该类的成员。你可能要找的术语是“构图”。表单由其他对象组成。这是我们在OOP中实现重用的方法之一。你剩下的问题我真的不明白。“集合”只是对象的集合。表单不是集合。数组是集合的一种类型。您可以有一个表单数组,即表单的集合……并且
Value
是一个变量属性,而不是一个对象如果您想调用“Properties on Properties”,那么第一个属性调用将需要返回一个本身具有属性的对象,因此它是一个包含另一个对象的对象。我不知道我在这个问题上是否走得太远了,但是在我构建MSAcces表单的情况下。每次添加文本框时,我都在第一个对象(表单)中创建一个新对象(文本框)。如何在不首先将私有m_目标设置为MinMax的情况下动态分配。所以要简化。如何将对象添加到类中。因为总是有form.txbx1和form.txbx2。我不知道如果不对这两个属性进行硬编码,您将如何分配它们?(当然,如果表单不是这样工作的,我可能会把苹果和橘子做比较)
VBE
在向设计器添加内容时负责向控件类型的表单添加字段。你为什么关心内部?在
VBA
中,创建一个在运行时更改的动态UI非常困难,但在中却非常简单。感谢所有的信息,我想知道winforms对象是否以与VBA相同的方式编写,但您似乎证实了我的怀疑,即它是一种不同类型的beast。