2013-02-18 73 views
1

我有有一個自定義COM類的成員類模塊MyVBAclassVBA獲取財產

Private mMyCOMclass As MyCOMclass 
Public Property Get InnerClass() As MyCOMclass 
    Set InnerClass = mMyCOMclass 
End Property 
Public Property Let InnerClass(value As MyCOMclass) 
    Set mMyCOMclass = value 
End Property 
Private Sub Class_Initialize() 
    Set mMyCOMclass = New MyCOMclass 
End Sub 

MyCOMclass具有的clone()和CopyTo從()來實現,克隆返回MyCOMclass的一個新的實例方法,並CopyTo從只是將屬性複製到已經初始化的對象。 這是我的問題,如果有人能解釋如何避免這個問題,那將會很棒。

Dim MyVBAinstance As MyVBAclass 
Set MyVBAinstance = New MyVBAclass 

Dim COMinstance As MyCOMclass, copyOfCOM As MyCOMclass 
Set COMinstance = New MyCOMclass 
Set copyOfCOM = New MyCOMclass 

' Do some stuff with COMinstance 

Call COMinstance.CopyTo(copyOfCOM) ' Works fine 
MyVBAinstance.InnerClass = COMinstance.Clone() ' Works fine even without Set 

Call COMinstance.CopyTo(MyVBAinstance.InnerClass) ' DOESN'T WORK 
+0

MyVBAinstance類的Instancing屬性具有什麼值?你是否試圖將其設置爲「2 - 公衆不可創造」? – dee 2013-02-18 12:31:22

+0

如果這是你所問的,我已經用Initialize擴展了這個問題。此外,這個相同的代碼運行,所有3種複製方式都可以與舊版MyCOMclass一起使用。 – gajo357 2013-02-18 13:48:11

回答

2

面向對象的思想是對象隱藏它的成員來自外部世界。 GETSET屬性充當「網關」。這樣,沒有例程可以簡單地覆蓋更改MyVBAinstance.InnerClass下的對象。你需要做的是:

Dim objTemp as As MyCOMclass 
Set objTemp = New MyCOMclass 'this will reserve the memory and store the pointer in objTemp 
Call COMinstance.CopyTo(objTemp) 'this will fill the allocated memory 
Set MyVBAinstance.InnerClass = objTemp 'this will copy the pointer from objTemp to MyVBAinstance.InnerClass 

如果你想暴露你的類的一些私人的成員,您需要提供 PROPERTY GETPROPERTY SET/ PROPERTY LET方法,你在做什麼。每次訪問該屬性時都會調用 GET - 並且在將屬性賦予對象/值時調用 PROPERTY SET/ PROPERTY LET

如果屬性是一個對象,則需要使用PROPERTY SET - 如果它是本機類型(整數,字符串等),則必須使用PROPERTY LET

以同樣的方式,那麼你需要的對象賦給屬性與SET(如Set MyVBAInstance.InnerClass = anotherObject),但原生類型,而SET(例如,「MyVBAInstance.Name =‘測試’`)

因此,在你的代碼SET這裏更換LET

Public Property Set InnerClass(value As MyCOMclass) 
    Set mMyCOMclass = value 
End Property 

,然後也用SET關鍵字在你的代碼:

Set MyVBAinstance.InnerClass = COMinstance.Clone() 

+0

但是這行與克隆()已經工作。問題在於最後一行。 – gajo357 2013-02-18 10:12:00

+0

你確定,即你是否嘗試類似'MyVBAinstance.InnerClass.MethodCall'? – 2013-02-18 10:36:59

+0

如果設置類不是問題,那麼問題很可能出現在'CopyTo'方法中... – 2013-02-18 10:55:57