TAO SIMPLES E NAO FUNCIONA. POR QUE?

JALEXM 13/03/2012 15:14:51
#397079
Citação:

:
ja o c# nao aceita e da erro.

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

alterartext(textBox1.Text);
}

void alterartext(ref string txt) {
txt = [Ô]teste_1[Ô];

}
}
}



Muito feio, na minha opinião. Mas pelo menos avisa e dá erro.
LVFIOROT 13/03/2012 15:19:41
#397081
corrigindo o codigo,

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void alterartext(ref string txt)
{
txt= [Ô]teste_1[Ô];

}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(textBox1.Text);
alterartext(ref textBox1.Text);
MessageBox.Show(textBox1.Text);
}

}
}


mensagem de erro:
Error 1 A property, indexer or dynamic member access may not be passed as an out or ref parameter
JALEXM 13/03/2012 15:24:02
#397082
Citação:

:
corrigindo o codigo,

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void alterartext(ref string txt)
{
txt= [Ô]teste_1[Ô];

}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(textBox1.Text);
alterartext(ref textBox1.Text);
MessageBox.Show(textBox1.Text);
}

}
}


mensagem de erro:
Error 1 A property, indexer or dynamic member access may not be passed as an out or ref parameter



VB6 deveria fazer o mesmo. Já que não consegue fazer a tarefa, pelo menos avisar.
LVFIOROT 13/03/2012 15:26:57
#397083
Nisso eu concordo.
Ou faz certo ou alerta que não faz!
MARCELO.TREZE 13/03/2012 23:08:49
#397102
na realidade vc quer que o vb faça o que outro progrma faz, e não é assim

se vc entender a lógica do vb vai conseguir fazer, feio ou bonito, pra mim o que importa é o desempenho, pois no vb ficaria fácil fazer assim

Public Function AlteraTexto(txt As Texbox)
txt.Text = [Ô]abc[Ô]
End Sub


para usar

AlteraTexto Text1


pronto o que vc deseja com a mesma cara

WILLVIDAL 13/03/2012 23:10:36
#397103
Do jeito que vc fez ai está certo, só não vai acontecer nada, se vc fizer assim:

Private Sub Command1_Click()
AlterarTexto Text1.Text
End Sub

Public Sub AlterarTexto(ByRef Txt As String)
Txt = [Ô]abc[Ô]
MsgBox Txt
End Sub

vai mostrar uma mensagem com o conteúdo da varialver Txt, que será sempre abc
JALEXM 14/03/2012 08:21:54
#397113
Citação:

:
na realidade vc quer que o vb faça o que outro progrma faz, e não é assim

se vc entender a lógica do vb vai conseguir fazer, feio ou bonito, pra mim o que importa é o desempenho



Lamento discordar, amigo Marcelo. Não sei se você já usou outras linguagens. Isso ajudaria você a ter uma opinião mais ampla.
Uma das coisas mais importantes ao lado da eficiência é o que se chama de [Ô]elegância do código[Ô]. Muitos chamam de [Ô]frescura[Ô], mas é a diferença entre um código profissional e outro amador. Quem trabalha com grandes projetos sabe do que estou falando. Uma coisa é um código funcionando, outra coisa é ele funcionando e fácil de entender e de dar manutenção.

Quanto ao caso aqui exposto, volto a repetir que um parâmetro passado ByRef é na verdade um endereço de memória. O compilador DEVE poder ler/alterar o que está nesse endereço, independente do que seja (uma variável simples, uma propriedade, etc.). Isso é básico demais. Fico decepcionado que o VB não trabalhe assim. Como disse o amigo LVFIOROT acima, o VB.NET trabalha do jeito que eu falei. Outras linguagens, não.

Porém, se por preguiça ou incompetência dos desenvolvedores do compilador eles resolverem que não querem fazer isso, então o compilador deveria gerar um ERRO, seja de compilação ou de execução. No caso aqui, o compilador do VB6 aceita, executa o código, mas não faz NADA.

Trabalho com VB6 há pouco tempo, mas trabalhei com Delphi durante mais de uma década. Não faço propaganda de nenhum deles, nem sou daqueles xiitas fundamentalistas que se apegam a uma linguagem como se fosse a melhor do Universo. Todas tem sua utilidade.

Mas, o caso aqui mostra, sim, um BUG bem feio do compilador. Não há o que fazer, apenas lamentar e contornar o erro.
Abraços, amigo Marcelo.
JALEXM 14/03/2012 08:30:56
#397115
Citação:

:
Do jeito que vc fez ai está certo, só não vai acontecer nada, se vc fizer assim:

Private Sub Command1_Click()
AlterarTexto Text1.Text
End Sub

Public Sub AlterarTexto(ByRef Txt As String)
Txt = [Ô]abc[Ô]
MsgBox Txt
End Sub

vai mostrar uma mensagem com o conteúdo da varialver Txt, que será sempre abc



Amigo, talvez você não tenha entendido a questão. Faça do jeito a seguir que talvez você possa ter uma ideia melhor:

Private Sub Command1_Click()
Text1.Text = [Ô]xyz[Ô] [ô]<--- atribui o valor inicial [Ô]xyz[Ô] ao textbox Text1.
AlterarTexto Text1.Text [ô]<--- chama AlterarTexto passando a propridade .Text como ByRef para que seja alterada por este Sub
MsgBox Text1.Text [ô]<--- após AlterarTexto executar, a propriedade .Text continua com o valor [Ô]xyz[Ô] e NÃO foi alterada, como era de se esperar.
End Sub

Public Sub AlterarTexto(ByRef Txt As String)
Txt = [Ô]abc[Ô]
End Sub
CARLINHOS.SONEG 14/03/2012 17:52:46
#397149
Pelo que entendi você quer fazer o texto ficar minusculo sem sim

Function AlterarTexto(ByRef Txt As String) As String

Dim rTxt As String
AlterarTexto = ucase(txt)
End Function
PHOENIX209E 15/03/2012 01:42:32
#397172
Li tudo e sempre fiquei na mesma ideia.
Voce quer passar por referencia um valor e receber outro,no caso do textbox,passar um xyz,correto?
E receber um abc,correto(com referencia ao exemplo que voce deu acima)
pois bem,testei o codigo em VB NET e VB 6.
Em vb 6 nao mudou,retornou [ô]xyz[ô] no vb net retornou [ô]abc[ô].,agora se passarmos o Objeto [ô]text1[ô] ao invez do objeto com sua propriedade [ô]text1.text[ô],ele retorna certo,codigo:

[th][/th]
Cabecalho
Private Sub Command1_Click()
Text1.Text = [Ô]xyz[Ô] [ô]<--- atribui o valor inicial [Ô]xyz[Ô] ao textbox Text1.
Call AlterarTexto(Text1) [ô]<--- chama AlterarTexto passando a propridade .Text como ByRef para que seja alterada por este Sub
MsgBox Text1.Text [ô]<--- após AlterarTexto executar, a propriedade .Text continua com o valor [Ô]xyz[Ô] e NÃO foi alterada, como era de se esperar.
End Sub

Public Sub AlterarTexto(ByRef Txt As Object)
Txt = [Ô]abc[Ô]
End Sub


RETORNA ABC

Tanto é que se voce passar Por Valor ele altera da mesma forma,pois ja está alocado num endereço de memoria [ô]conhecido[ô] pelo compilador.

----------------------


[th][/th]
Cabecalho

Private Sub Command1_Click()
Text1.Text = [Ô]xyz[Ô] [ô]<--- atribui o valor inicial [Ô]xyz[Ô] ao textbox Text1.
Call AlterarTexto(Text1.Text) [ô]<--- chama AlterarTexto passando a propridade .Text como ByRef para que seja alterada por este Sub
MsgBox Text1.Text [ô]<--- após AlterarTexto executar, a propriedade .Text continua com o valor [Ô]xyz[Ô] e NÃO foi alterada, como era de se esperar.
End Sub

Public Sub AlterarTexto(ByRef Txt As String)
Txt = [Ô]abc[Ô]
End Sub


RETORNA XYZ

---------------------

Acontece que o VB6 trabalha desta forma,ou seja,voce deve passar o Objeto e nao a propriedade do objeto,ele altera por completo.
Isso não é um BUG e sim a forma que a linguagem trabalha,diferente dele que eu posso falar pois tenho experiencia é o vb net,voce passa o objeto
e a propriedade,e ele altera o valor.
Página 4 de 5 [48 registro(s)]
Tópico encerrado , respostas não são mais permitidas