TAO SIMPLES E NAO FUNCIONA. POR QUE?
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.
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
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.
Ou faz certo ou alerta que não faz!
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
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
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.
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
Function AlterarTexto(ByRef Txt As String) As String
Dim rTxt As String
AlterarTexto = ucase(txt)
End Function
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:
Cabecalho | [/th]
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.
----------------------
Cabecalho | [/th]
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.