2016-07-05 2 views
0

я нашел большой пост на SO что, кажется, именно то, что я хочу: Is it possible to access a parent property from a child that is in a collection? Однако моя адаптация этого дает мне Object doesn't support this property or method.VBA пройти родительский класс для дочернего класса

Мой код, который теперь работает благодаря кружкой Мэта и Томалак:

родитель Класс - clsComputer

Option Explicit 
Private pCD As clsCD 

'''''''''''''''''''''''''''''' 
' CD property 
'''''''''''''''''''''''''''''' 
Public Property Get CD() As clsCD 
    If pCD Is Nothing Then 
     Set pCD = New clsCD 
     'Per Mat's Mug post, drop the parenthesis 
     pCD.Initialze Me 
    End If 
    Set CD = pCD 
End Property 
Public Property Set CD(value As clsCD) 
    pCD = value 
End Property 

Детский класс - clsCD

Option Explicit 

Private pParent As clsComputer 

''''''''''''''''''''''''''''' 
' Status property - READ ONLY 
''''''''''''''''''''''''''''' 
Public Property Get Status(Optional strHost As String) As String 
    Dim strResult As String 

    If strHost = "" Then strHost = Me.Parent.HostName 

    strResult = RunCMD("cmd /c ""winrs -r:" & strHost & _ 
     " reg query hklm\system\currentcontrolset\services\cdrom /v start""") 
    If InStr(1, strResult, "0x4", vbTextCompare) Then 
     Status = "Disabled" 
    Else 
     Status = "Enabled" 
    End If 
End Property 

''''''''''''''''''''''''' 
' Parent property 
''''''''''''''''''''''''' 
Public Property Get Parent() As clsComputer 
    Set Parent = pParent 
End Property 

'Because as Tomalak points out, you use Set with Objects. 
Public Property Set Parent(Obj As clsComputer) 
    Set pParent = Obj 
End Property 

''''''''''''''''''''''''' 
' Initialize Method 
''''''''''''''''''''''''' 
Public Sub Initialize(Obj As clsComputer) 
    Set Me.Parent = Obj 
End Sub 

Модуль Код - Модуль1

Sub test() 
    Dim oPC As clsComputer 
    Set oPC = New clsComputer 
    Debug.Print "CD Status: " & oPC.CD.Status 
End Sub 

Если я испытайте Меня, это объект (например, If IsObject(Me) Then Stop оценивает истинный), и Intellisense показывает все свойства и методы в clsКомпьютер при вводе Me. Окна локалей показывают мне как объект clsComputer. Все, что я знаю, чтобы проверить, говорит, что я - объект clsComputer, так что я делаю неправильно?

ответ

2

Классик.

pCD.Initialize (Me) 'Error occurs on this line when using F8 

уронить скобки.

pCD.Initialize Me 

Выполнено.

Скобки вокруг параметра силу его быть оценены и прошли ByVal (независимо от того, что говорит подпись процеду) - и так как вы, вероятно, не определено свойство по умолчанию для clsComputer то оценка взрывает и время выполнения даже не доходит до метода Initialize.

Тем не менее, нет ничего плохого в передаче ссылки на объект по значению. Фактически, это то, что делают C# и VB.NET по умолчанию - рассмотрите передачу любого параметраByVal.

+1

Aha! Между этим и @tomalak это исправляет!Я обновлю свой пост. – Tim

+0

Awesome. Наконец, я знаю последний бит о том, что нужно делать с парсерами. Благодарю. – Tomalak

2
Public Property Set Parent(ByRef Obj As clsComputer) 
    Set pParent = Obj 
End Property 
+0

Нет кубиков. Он все еще ошибается. ByRef по умолчанию для объектов, поэтому изменение с Let to Set не исправило проблему. – Tim

+1

Но вы не можете даже «Дать» ссылку на объект, AFAIK. Поправьте меня если я ошибаюсь. – Tomalak

+0

Неправильно, абсолютно правильно. За исключением того, что я передал бы ссылку на объект по значению, а не по ссылке. @Tim 'Свойство Let' относится к типам значений. Используйте «Свойство» для объектов. –

0

Я не мой компьютер так просто кодирование слепого

Попробуйте для clsComputer класса

Option Explicit 
Private pCD As clsCD 

'''''''''''''''''''''''''''''' 
' CD property 
'''''''''''''''''''''''''''''' 
Public Property Get CD() As clsCD 
    Set CD = pCD 
End Property 

Public Property Set CD(value As clsCD) 
    pCD = value 
End Property 

Sub Class_Initialize() 
    Set pCD = New clsCD 
    pCD.Initialize(Me) 
End Property 
Смежные вопросы