Mallow
Mallow

Reputation: 864

VBA OOP How can I make subproperties

How can I program my class module so that I can call properties on properties?

I'm not sure I'm using the right terminology, so I will try to clarify. In MsAccess whenever I want to manipulate elements on a form I can reference them using a period to separate each objects. For example, if I wanted to change the value of a text box I can call:

form("formname").txtboxname.value = "new value"

So it's like I have a form object that has a textbox object that has a value object.

How could I achieve this in my own class module.

My specific example is that I have stored an array in a private variable in the class however I cannot simply use a Property GET to return an array. (And I don't want to make it public because the array is programmatically populated) But if I want to iterate I need to know the Ubound and Lbound value of that array.

I would rather avoid having to store the Ubound and Lbound values in their own variable as that seems a waste.

How could I somehow program the class in order to get a ?subclass?

so that if I want the ubound or lbound I could call something like

set x = mycls
debug.? x.pArrayVariable.getLBound

Even the right terminology for what I'm trying to do could get me closer to an answer, I've tried searching for properties and sub properties but I'm not sure that's getting me somewhere.

Example of my class: mycls

Private pArrayVariable() as string

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

Is something called "Collections" what I'm asking about?

Upvotes: 0

Views: 188

Answers (2)

John Alexiou
John Alexiou

Reputation: 29244

So a property can return an object (like a user class) which has its own properties. Example below:

Here is the code for a class called 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

and here is the code for a class named MyClass. Notice how it exposes a property of type MinMax

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

Now the main code can have a statement like

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

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

Upvotes: 1

Mallow
Mallow

Reputation: 864

I still am curious about my original question above, however it came out of a problem of not being able to access the array. Seems I am incorrect.

You can use

Public Property Get ArrayVariable() As String()
  Call 'code to populate array
  ArrayVariable= pArrayVariable() 'Notice the paren here
End Property

And then to reference the array

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

Upvotes: 0

Related Questions