2013-02-18 118 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