Domanda

In VB6, sto cercando di passare un oggetto in ritardo legato a un'altra forma.

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

Il contenuto di y sono una stringa contenente il nome del tipo di oggetto associato tardi, "MyOwn.Object". ByVal e ByRef non fanno una differenza. Eventuali indizi? Avendo difficoltà a ricordare.

È stato utile?

Soluzione

  

Ho usato VarType (y). Il risultato è 8,   per vbString. Dovrebbe essere 9 per   oggetto. - ssorrrell 1 giorno fa

     

Utilizzare Stampa y nella finestra immediata per   trovare il contenuto di y. - ssorrrell 55   min fa

Ciò sembra confermare i miei sospetti. La classe MyOwn.Object deve avere una proprietà predefinita o un metodo che restituisce una stringa.

Di conseguenza, quando si tenta di Debug.Print esso, verrà restituito il valore della proprietà di default / metodo. Quando si passa sopra la variabile nell'IDE, VB6 visualizzerà il valore della proprietà di default / metodo. Quando si esegue una chiamata VarType su y verrà restituito il tipo di variabile della proprietà predefinita o il metodo.

La ragione è che quando si dispone di una variabile di tipo Variant che memorizza un Object, e la classe dell'oggetto definisce un metodo o una proprietà di default, la variabile valuterà per il valore di ritorno del metodo di default o la proprietà nella maggior parte delle situazioni .

È possibile verificare velocemente per vedere se la classe MyOwn.Object ha un membro predefinito aprendo il Visualizzatore oggetti per la classe MyOwn.Object e guardando la sua lista di proprietà e metodi. Se vedi un metodo o una proprietà che dispongono di un'icona con il piccolo cerchio blu in un angolo, che indica il metodo o proprietà è il membro predefinito della classe. Se si trova uno, io sono pronto a scommettere che è dichiarata per restituire una stringa.

Si noti che, anche se è stato modificato tutti i vostri VariantS a ObjectS, si sarebbe ancora verificare questo comportamento in un certo numero di posti. Ad esempio, anche se y è dichiarato As Object, facendo un Debug.Print y ancora stampare il valore della proprietà di default o il metodo, e facendo un VarType(y) restituirà ancora 8 (stringa).

Sapere esattamente quando VB6 userà il membro predefinito e quando non sarà in grado di essere fonte di confusione. Ad esempio, se si dichiara y come Object, poi facendo TypeName(y) tornerà MyOwn.Class, ma VarType(y) restituirà ancora 8 (stringa). Tuttavia, se si dichiara y come Variant, poi ritorna TypeName(y) String.

Se si utilizza late-binding, è difficile evitare questo effetto collaterale, in quanto sarete solo in grado di dichiarare la variabile oggetto come Object o Variant.

Altri suggerimenti

Non ho una copia di VB6 a portata di mano, ma mi ricordo facendo la stessa cosa più o meno abbastanza spesso, e credo che abbiamo usato oggetto piuttosto che Variante nella firma del metodo. Variante è in genere molto meno prevedibile in termini di quali tipi di conversioni può funzionare su una variabile, mentre con oggetto Sono abbastanza sicuro VB non cercherà alcun tipo di conversione.

Sei sicuro di non aver omesso la parola chiave Set per esempio

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

Se questo fosse il caso, allora il valore di y sarebbe valore predefinito dell'oggetto. La vostra classe MyOwn.Object ha una proprietà che restituisce una descrizione di questo tipo ed è stato definito come il membro predefinito per la classe (contrassegnata con un punto blu nel Browser VB Object)?

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

Quando si utilizza CreateObject, si sta creando un oggetto non una variante. Quando si passa un oggetto in genere si utilizza ByRef.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top