2015-03-19 17 views
14

To naprawdę przeszkadza mi i przeszkadza w rozwoju/debugowaniu. Ilekroć deklaruję typ zmiennej interfejsu, który implementuję, okno Locals nie pokazuje jego wartości właściwości. Zamiast po prostu czytaJak uzyskać wartości właściwości klas implementujących interfejs w oknie Locals?

Obiekt nie obsługuje tej właściwości lub metody

Która jest głupie, bo absolutnie nie. W rzeczywistości to ma, aby spełnić swoją umowę z interfejsem.

Jeśli zadeklaruję zmienną jako konkretną implementację interfejsu, okno działa zgodnie z oczekiwaniami. Jednak to całkowicie odrzuca cel kodowania do abstrakcji na początku.

Jak mogę uzyskać okno locals, aby poprawnie wyświetlać wartości właściwości klasy?

Minimal, kompletne i weryfikowalne Przykład:

Utwórz klasę IClass do wykorzystania jako interfejs.

Option Explicit 

Public Property Get Name() As String 
End Property 

Utwórz Class1, który implementuje interfejs.

Option Explicit 

Implements IClass 

Public Property Get Name() As String 
    Name = "Class1" 
End Property 

Private Property Get IClass_Name() As String 
    IClass_Name = Name 
End Property 

I wreszcie, niektóre kod testowy w zwykłym module .bas w celu zilustrowania problemu.

Option Explicit 

Public Sub test() 
    Dim x As Class1 
    Dim y As IClass 

    Set x = New Class1 
    Debug.Print x.Name 

    Set y = New Class1 
    Debug.Print y.Name 

    Stop 
End Sub 

enter image description here

+0

Funkcjonalną częścią jest to, że wciąż oczekuje się, że 'String' ... wygląda jak błąd w oknie locals! –

+6

Prawdopodobnie najprostszym rozwiązaniem jest po prostu odtworzenie całego VBA IDE, znalezienie błędu Microsoftu, dostrojenie trochę kodu na poziomie zespołu, a następnie ... bingo, działającego okna Locals. – mwolfe02

+6

W rzeczywistości odkryłem naprawdę cudowną implementację tego, co ten komentarz jest zbyt wąski, aby go powstrzymać. – mwolfe02

Odpowiedz

-1

mogę się mylić, ale myślę, że może to mieć coś wspólnego ze sposobem zajęcia instancja w VBA.

Na przykład:

Dim oClass1 as Class1 
Set oClass1 = new Class1 

jest inny niż

Dim oClass1 as New Class1 

w drugim przypadku uważam, że konstruktor nie sprawdzony aż właściwość jest dostępna.

Jeśli spróbujesz, zobaczysz właściwość w oknie Watch. Zwróć uwagę na nowe w IClass - tylko do demonstracji - Wiem, że jej nie sposób to zrobić :)

Public Sub test1() 

    Dim x As Class1 
    Dim y As IClass 

    Set y = New IClass 
    Set x = New Class1 
    Debug.Print x.Name 
    Debug.Print y.Name 
    Stop 

End Sub 

Podejrzewam jej coś z tym i okna zegarka wymaga to ... może ...

+0

Niestety, nie mam już dostępu do instalacji pakietu Office, aby to przetestować. – RubberDuck

+4

Uruchamianie interfejsu pokonuje cel - oczywiście, że to zadziała, patrzysz na instancję klasy, która ma nazwę z prefiksem 'I' - która nie czyni z niego interfejsu. Chodzi o to, że ten błąd VBE powoduje, że debugowanie kodu ** napisanego na interfejsie ** jest trudniejsze do debugowania przy użyciu okna narzędziowego locals. –

+0

Wiem to, dlatego właśnie powiedziałem: "Wiem, że to nie jest sposób, aby to zrobić". My Point próbował zademonstrować różnice w tworzeniu instancji między dwoma wywołaniami i prawdopodobnie korzystał z tego wewnętrzny system Windows. :) – PaulG