Como passar um parâmetro de vinculação tardia
-
19-09-2019 - |
Pergunta
No VB6, estou tentando passar um objeto vinculado a outra 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
O conteúdo de y é uma string que contém o nome do tipo do objeto vinculado tardio, "MyOwn.Object". Byval e Byref não fazem diferença. Alguma pista? Tendo problemas para lembrar.
Solução
Eu usei Vartype (Y). O resultado é 8, para vbstring. Deve ser 9 para objeto. - SSorrrell 1 hora atrás
Use imprimir y na janela imediata para encontrar o conteúdo de y. - SSorrrell 55 minutos atrás
Isso parece confirmar minhas suspeitas. o MyOwn.Object
A classe deve ter uma propriedade ou método padrão que retorne uma string.
Portanto, quando você tenta Debug.Print
Ele retornará o valor da propriedade/método padrão. Quando você passa o mouse sobre a variável no IDE, o VB6 exibe o valor da propriedade/método padrão. Quando você faz um VarType
ligar y
Ele retornará o tipo variável da propriedade ou método padrão.
O motivo é que, quando você tem uma variável de tipo Variant
que armazena um Object
, e a classe do objeto define um método ou propriedade padrão, a variável avaliará o valor de retorno do método ou propriedade padrão na maioria das situações.
Você pode verificar rapidamente para ver se o MyOwn.Object
A classe tem um membro padrão abrindo o Navegador de objeto para o MyOwn.Object
classe e olhando para a sua lista de propriedades e métodos. Se você vir um método ou propriedade que possui um ícone com pequeno círculo azul no canto, que indica que o método ou propriedade é o membro padrão da classe. Se você encontrar um, estou disposto a apostar que é declarado devolver uma string.
Observe que mesmo se você mudou todos os seus Variant
S para Object
S, você ainda encontraria esse comportamento em vários lugares. Por exemplo, mesmo que y
é declarado As Object
, fazendo um Debug.Print y
ainda imprimirá o valor da propriedade ou método padrão e fazendo um VarType(y)
ainda retornará 8 (string).
Saber exatamente quando o VB6 usará o membro padrão e quando ele não pode ser confuso. Por exemplo, se você declarar y
Como Object
, então fazendo TypeName(y)
retornará MyOwn.Class
, mas VarType(y)
ainda retornará 8 (string). No entanto, se você declarar y
Como Variant
, então TypeName(y)
retorna String
.
Se você estiver usando a ligação tardia, é difícil evitar esse efeito colateral, pois você só poderá declarar sua variável de objeto como Object
ou Variant
.
Outras dicas
Não tenho uma cópia do VB6 à mão, mas lembro -me de fazer a mesma coisa com mais ou menos frequência, e acredito que usamos objeto em vez de variante na assinatura do método. A variante geralmente é muito menos previsível em termos de que tipos de conversões podem ser executados em uma variável, enquanto que com o objeto tenho certeza de que o VB não tentará qualquer tipo de conversão.
Tem certeza de que não omitiu a palavra -chave definida, por exemplo
Dim y
Public Sub SetMyOwnObject(ByVal paramX As Variant)
' Set y = paramX ' thought you had this...
y = paramX ' ...actually have this
End Sub
Se esse fosse o caso, o valor de y seria o valor padrão do objeto. Sua classe Myown.Object tem uma propriedade que retorna uma descrição de seu tipo e foi definida como o membro padrão da classe (marcado com um ponto azul no navegador de objeto VB)?
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 você usa o CreateObject, você está criando um objeto que não é uma variante. Quando você passa em um objeto, geralmente você usa o BYREF.