VARIANT: ALGUEM SABE ESSA?
No exemplo abaixo, S e Label1.Caption são strings passadas para MySub como parâmetros ByRef. Lá elas recebem Null, o que deveria provocar erro em ambos os casos, já que apenas Variant podem receber Null. Mas apenas quando S é passada ocorre erro, nada acontece com Label1.Caption. Mas Label1.Caption NÃO é Variant. Basta tentar fazer Label1.Caption = Null em algum lugar do código que dá erro. Alguém pode explicar o que está havendo?
Obrigado.
Private Sub Command1_Click()
Dim S As String
MySub S [ô]<--- Causa erro: [Ô]Runtime error 94: Invalid use of null[Ô]
MySub Label1.Caption [ô]<--- OK? Por que? Deveria dar erro também.
End Sub
Private Sub MySub(ByRef X As Variant)
X = Null
End Sub
[Ô]Causa erro[Ô] é muito vago, que erro causa, que mensagem de erro ele informa? Leia a mensagem e terá a resposta do que está acontecendo...
Citação::
MySub S [ô]<--- Causa erro.
[Ô]Causa erro[Ô] é muito vago, que erro causa, que mensagem de erro ele informa? Leia a mensagem e terá a resposta do que está acontecendo...
Talvez você não tenha lido toda a minha mensagem, se concentrando apenas no exemplo de código.
Como o código é simples, estava supondo que os amigos do fórum pudessem executá-lo e ver a mesagem.
De qualquer forma, a mensagem de erro é esta:
Runtime error 94: Invalid use of null.
Imagino que o erro ocorra somente para a variável S por não ter ela algum tratamento interno que impeça o erro de acontecer. Para a propriedade Caption, é provável que haja algum tratamento interno para os possÃveis erros que podem acontecer quando da sua utilização. Deve ser isso...
JSFF77
www.visualgria.com.br
primeiro X é uma Variant, isso significa que X pode assumir qualquer valor, no caso você declara S como string e passa para X, que fatalmente se torna uma string e por consequencia não poderá receber um valor Null.
Dim S As String
MySub S [ô]<-- aqui MySub transforma o S em String
veja o resultado passando S como Variant
Dim S As Variant
MySub S [ô]<-- agora sim S permanece como Variant e não causa o Erro
o Mesmo não acontece com Label.Caption porque o Objeto label é uma variant
outra coisa seria o fato de se estar passando a variavel para ByRef que reserva um endereço na memória, acredito que o ideal seria passar esta variavel como ByVAL.
Private Sub MySub(ByVal X As Variant)
X = Null
End Sub
reparae que como ByVal e S como string o erro não ocorre
Pesquise diferença entre ByVal e ByRef
quando vc passa o Argumento com ByRef, significa que o procedimento pode modificar a variavel
e quando vc passa o Argumento com ByVal, significa que o procedimento NÃO pode modificar a variavel.
ou seja você passando o argumento como ByRef o Valor de X assumirá o valor de S que é string
e você passando o argumento como ByVal o Valor de X permanecerá como Variant e evitará o erro.
caramba, eu conseguiiii, rs
Citação::
Só pra fechar e tentar sanar a duvida.
quando vc passa o Argumento com ByRef, significa que o procedimento pode modificar a variavel
e quando vc passa o Argumento com ByVal, significa que o procedimento NÃO pode modificar a variavel.
ou seja você passando o argumento como ByRef o Valor de X assumirá o valor de S que é string
e você passando o argumento como ByVal o Valor de X permanecerá como Variant e evitará o erro.
caramba, eu conseguiiii, rs
Sim, eu sei. Eu entendo bem o que é ByRef e ByVal.
O que eu não entendo é porque 2 strings são tratadas de forma diferente pelo compilador quando passadas como parâmetro.
Repare que fazer S = Null e Label1.Caption = Null gera o mesmo erro, mas quando se passa como parâmetro isso não acontece.
Na verdade, não estou preocupado em atribuir Null a alguma string, só queria saber o porque dessa diferença no tratamento de variáveis de mesmo tipo.
No meio de um código grande e complexo, em que se assumiu que variáveis de um mesmo tipo são tratadas da mesma forma e depois descobrir que não é assim pode ser a maior dor de cabeça.
Alguma ideia sobre o caso?
como eu disse anteriormente quando você declara S como String, e a função MySub for ( ByRef X As Variant) então X vai assumir o Valor de S e não será mais uma Variant e Sim Uma String.
o Mesmo não ocorre com o Label, porque o componente label foi desenvolvido com suas propriedades como Variant, pra ser mais dinâmico, o que não causa o erro.
Citação:o mesmo não ocorre com o Label, porque o componente label foi desenvolvido com suas propriedades como Variant, pra ser mais dinâmico, o que não causa o erro.
Se assim fosse, amigo Marcelo, ou seja, se as props. de um Label fossem Variant, ao fazer Label1.Caption = Null não geraria erro.
Concorda?
quando vc passa o label.caption para MySub
MySub Label1.Caption
ele de alguma forma, mesmo vazio ele pode não estar Null, o pq isso eu não sei, mas acredito que seja isso, uma vez que ele label, já está incluida no caption do mesmo.