VARIANT: ALGUEM SABE ESSA?

JALEXM 05/04/2012 09:07:54
#399175
Olá.
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
KERPLUNK 05/04/2012 09:17:51
#399178
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...
JALEXM 05/04/2012 09:39:03
#399180
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.
JSFF77 05/04/2012 09:53:07
#399185
Bom dia.

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
MARCELO.TREZE 05/04/2012 09:59:27
#399188
Bom vamos aos [Ô]supositórios[Ô], rs

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



MARCELO.TREZE 05/04/2012 10:23:01
#399194
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

JALEXM 05/04/2012 10:46:17
#399196
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?
MARCELO.TREZE 05/04/2012 11:16:16
#399200
Vamos lá não sei se fui claro, primeiro iremos entender o erro, uma string não pode receber um valor Null (Gera Erro).

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.


JALEXM 05/04/2012 11:24:22
#399201
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?
MARCELO.TREZE 05/04/2012 11:48:07
#399206
sim agora entendi a duvida, o problema deve ser o seguinte então

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.





Página 1 de 2 [14 registro(s)]
Tópico encerrado , respostas não são mais permitidas