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.

Foi útil?

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 VariantS para ObjectS, 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top