Frage

In VB6 versuche ich, ein spät gebundenes Objekt an eine andere Form zu übergeben.

frmmain.vb

Dim x
Set x = CreateObject("MyOwn.Object")
Dim f as frmDialog
Set f = New frmDialog
f.SetMyOwnObject x

Frmdialog

Dim y
Public Sub SetMyOwnObject(ByVal paramX As Variant)
  Set y = paramX
End Sub

Der Inhalt von y ist eine Zeichenfolge, die den Typnamen des spätgebundenen Objekts "myown.Object" enthält. Byval und Byref machen keinen Unterschied. Irgendwelche Hinweise? Probleme haben, sich zu erinnern.

War es hilfreich?

Lösung

Ich habe Vartype (y) verwendet. Das Ergebnis ist 8 für Vbstring. Es sollte 9 für Objekt sein. - Ssorrrell vor 1 Stunde

Verwenden Sie Druck Y im unmittelbaren Fenster, um den Inhalt von y zu finden. - Ssorrrell vor 55 Minuten

Dies scheint meinen Verdacht zu bestätigen. Das MyOwn.Object Die Klasse muss eine Standardeigenschaft oder -methode haben, die eine Zeichenfolge zurückgibt.

Daher, wenn Sie es versuchen Debug.Print Es gibt den Wert der Standardeigenschaft/Methode zurück. Wenn Sie über die Variable in der IDE schweben, zeigt VB6 den Wert der Standardeigenschaft/-methode an. Wenn du a machst VarType Rufen Sie an y Es gibt den variablen Typ der Standardeigenschaft oder -methode zurück.

Der Grund ist, dass wenn Sie eine Variable vom Typ haben Variant das speichert und Object, Und die Klasse des Objekts definiert eine Standardmethode oder Eigenschaft, die Variable bewertet in den meisten Situationen den Rückgabewert der Standardmethode oder Eigenschaft.

Sie können schnell prüfen, ob die MyOwn.Object Die Klasse hat ein Standardmitglied durch Öffnen der Objektbrowser zum MyOwn.Object Klasse und betrachten die Liste der Eigenschaften und Methoden. Wenn Sie eine Methode oder Eigenschaft sehen, die ein Symbol mit kleinem blauem Kreis in der Ecke hat, ist die Methode oder Eigenschaft das Standardelement der Klasse. Wenn Sie einen finden, bin ich bereit zu wetten, dass es erklärt wird, eine Zeichenfolge zurückzugeben.

Beachten Sie, dass Sie alle Ihre geändert haben VariantS zu ObjectS, Sie würden dieses Verhalten immer noch an einer Reihe von Orten begegnen. Zum Beispiel auch wenn y wird deklariert As Object, machen a Debug.Print y druckt weiterhin den Wert der Standardeigenschaft oder -methode aus und macht a VarType(y) wird immer noch 8 (String) zurückkehren.

Zu wissen, wann VB6 das Standardmitglied verwendet und wann es nicht verwirrend sein kann. Zum Beispiel, wenn Sie deklarieren y wie Object, dann tun TypeName(y) wird zurückkehren MyOwn.Class, aber VarType(y) wird immer noch 8 (String) zurückkehren. Wenn Sie jedoch deklarieren y wie Variant, dann TypeName(y) kehrt zurück String.

Wenn Sie eine verspätete Bindung verwenden, ist es schwierig, diesen Nebeneffekt zu vermeiden, da Sie Ihre Objektvariable nur als deklarieren können Object oder Variant.

Andere Tipps

Ich habe keine Kopie von VB6 Handy, aber ich kann mich erinnern, dass das Gleiche mehr oder weniger ziemlich oft getan wird, und ich glaube, dass wir Objekte als eine Variante in der Methodensignatur verwendet haben. Die Variante ist im Allgemeinen viel weniger vorhersehbar in Bezug auf welche Arten von Conversions, die sie auf einer Variablen ausführen können, während ich mit Objekt ziemlich sicher bin, dass VB keine Konvertierung versucht.

Sind Sie sicher, dass Sie das Set -Keyword -EG nicht weggelassen haben

Dim y
Public Sub SetMyOwnObject(ByVal paramX As Variant)
  ' Set y = paramX  ' thought you had this...
  y = paramX        ' ...actually have this
End Sub

Wenn dies der Fall wäre, wäre der Wert von Y der Standardwert des Objekts. Hat Ihre Myown.Object -Klasse eine Eigenschaft, die eine Beschreibung ihres Typs zurückgibt und als Standardelement für die Klasse definiert wurde (mit einem blauen Punkt im VB -Objektbrowser gekennzeichnet)?

frmmain.vb

Dim x As Object
Set x = CreateObject("MyOwn.Object")
Dim f as frmDialog
Set f = New frmDialog
f.SetMyOwnObject x

Frmdialog

Dim y As Object
Public Sub SetMyOwnObject(ByRef paramX As Object)
  Set y = paramX
End Sub

Wenn Sie CreateObject verwenden, erstellen Sie ein Objekt, die keine Variante haben. Wenn Sie ein Objekt im Allgemeinen übergeben, verwenden Sie ByRef.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top