Domino 9 und frühere Versionen > ND8: Entwicklung

Probleme mit Property Get/Set

(1/1)

Jürgen Schomann:
Ich habe folgende Klassenbibliothek zum Testen

Class TestArray
   Private vValues As Variant
   
   Property Get Values As Variant
      Me.Values = Me.vValues
   End Property
   
   Property Set Values As Variant
      Me.vValues = Me.Values
   End Property

   Function GetValues As Variant
      Me.GetValues = Me.vValues
   End Function
End Class

und dazu folgenden Testagenten

Sub Initialize
   Dim ob As New TestArray
   Dim v As Variant
   Dim v0(1) As Variant
   Dim s0(1) As String
   
   v0(0) = "v0"
   v0(1) = "v1"
   s0(0) = "s0"
   s0(1) = "s1"
   
   ob.Values = s0
   
   'Test 1 - Fehler
   ForAll e1 In ob.Values
      MsgBox DataType(e1),,"Test 1"           'Fehlerhafte Datentyp-Werte z. B. 191, 10800 oder auch 0
   End ForAll
   
   'Test 2 - OK
   v = ob.Values
   ForAll e2 In v
      MsgBox DataType(e2),,"Test 2            'Datentyp 8 ok
   End ForAll
   
   'Test 3 - OK
   ForAll e3 In ob.GetValues
      MsgBox DataType(e3),,"Test 3           'Datentyp 8 ok
   End ForAll
End Sub

Die Properties erwarten als Typ Variant. Wenn ich ein Feld vom Typ String übergebe und über die Property Get in einer ForAll-Schleife die Werte abrufen will, bekomme ich einen Fehler wegen falschem Datentyp.
Ich habe deshalb über DataType den Datentyp ausgegeben und bekomme je nach Speicherkonstellation die unterschiedlichsten Werte wie oben im Kommentar angegeben. Richtig wäre ja der Wert 8 für String.
Dies ist ein stark abgerüsteter Test. In der eigentlichen Anwendung wird je nach Speicherkonstellation oft leer für den Wert ausgegeben oder Lotus Notes stürzt ab.
Wenn ich wie im 'Test 2' vorher den Wert der Property Get einer Variant-Variablen zuweise oder wie im 'Test 3' eine Funktion verwende ist alles richtig. Auch wenn ich statt eines String-Feldes ein Variant-Feld benutze laufen alle 3 Tests richtig.

Was ist die Ursache dafür, dass die Properties Get/Set den Typ Variant  nicht richtig behandeln?

Andrew Harder:
Sorry, der Test läuft bei mir (zugegeben unter Notes 9, habe gerade keinen 8.5er zur Hand) einwandfrei  :-:

Mal ein Schuss ins blaue... versuche mal diese Klasse

--- Code: ---Class TestArray

Private vValues As Variant

Property Set Values As Variant
Me.vValues = Values
End Property

Property Get Values As Variant
Values = Me.vValues
End Property

Function GetValues As Variant
GetValues = Me.vValues
End Function

End Class
--- Ende Code ---

Jürgen Schomann:
Vielen Dank für deine Antwort. Auch mit dem Vorschlag der geänderten Klasse bleibt es bei dem Fehler. Allerding ist die Referenz über Me doch sicherer, z. B. wenn man auch eine Property/Method mit gleichem Namen wie ein LotusScript-Schlüsselwort hat. Ich habe z. B. eine Klasse mit der Methode Implode, die aber nicht die Anweisung von LotusScript ist. Hier muss ich unbedingt Me.Implode verwenden.
Übrigens meine Teste sind alle unter Notes 8.5. gelaufen. Notes 9 werden ich in der Firma auch mal probieren und berichten.

Jürgen Schomann:
Sorry, aber bei uns läuft es auch unter Notes 9 nicht richtig.

Navigation

[0] Themen-Index

Zur normalen Ansicht wechseln