2014-12-05 57 views
0

如何編程我的類模塊以便可以調用屬性屬性?VBA OOP如何製作子屬性

我不確定我使用了正確的術語,所以我會盡力澄清。在MsAccess中,只要我想操作表單上的元素,我就可以使用句點來分隔每個對象。例如,如果我想改變文本框的值,我可以打電話:

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

所以它就像我有了,有一個值對象文本框對象的窗體對象。

我怎麼能在我自己的班級模塊中實現這一點。

我的具體例子是,我已經在類中的私有變量中存儲數組,但我不能簡單地使用Property 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 

一些所謂的 「收藏」 我要問什麼?

+0

表單中的文本框是不是一個子類的聲明,這是類的成員。您可能正在尋找的術語是「組合」。該表單由其他對象組成。這是我們在OOP中實現重用的方法之一。您的問題的其餘部分我不太瞭解。 「集合」就是這樣 - 對象的集合。表單不是一個集合。數組是一種集合。你可以有一系列的表格,也就是一組表格。 – rism 2014-12-05 01:43:31

+0

...和'Value'是一個Variant屬性,而不是一個對象 – 2014-12-05 02:19:22

+1

如果你想調用「Properties on Properties」,那麼第一個Property調用將需要返回一個對象,它本身具有屬性 – 2014-12-05 05:21:25

回答

1

所以一個屬性可返回一個對象(如用戶類)。下面的示例:

這裏是一個名爲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 

類的代碼,這裏是一個名爲MyClass類的代碼。注意它暴露型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 

的屬性現在主要的代碼可以有一個像

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

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

所以它是一個包含另一個對象的對象內。我不知道我是否在這個問題上做得太過分,但在構建MSAcces表單的情況下。每次我添加一個文本框時,我都會在第一個對象(Form)中創建一個新對象(TextBox)。如何在沒有首先將Private m_target設置爲MinMax的情況下進行動態分配。所以簡化。你如何添加一個對象到一個類。因爲總是有form.txbx1和form.txbx2。我不確定你如何分配這兩個屬性而不用硬編碼它們? (當然,如果這不是表格的工作方式,我可能會將蘋果與桔子進行比較) – Mallow 2014-12-05 18:23:02

+1

當您向設計師添加東西時,VBE負責爲控件類型添加字段。你爲什麼關心內部?創建一個在運行時更改的動態UI在'VBA'中很難,但在[tag:winforms]中很簡單。 – ja72 2014-12-05 21:30:54

+0

感謝所有的信息,我想知道winforms對象是否以與VBA相同的方式編寫,但似乎您確認我懷疑它是一種不同類型的野獸。 – Mallow 2014-12-05 22:11:01

0

我仍然很好奇我上面的原始問題,但它出現了無法訪問數組的問題。看來我錯了。

您可以使用

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