TAO SIMPLES E NAO FUNCIONA. POR QUE?
Citação:Private Sub Command1_Click()
AlterarTexto Text1
End Sub
Public Sub AlterarTexto(Txt As TextBox)
Txt.Text = [Ô]VbMania[Ô]
Txt.Font.Bold = True
Txt.Alignment = 1
Txt.BackColor = vbCyan
Txt.BorderStyle = 1
Txt.Width = 3000
End Sub
Veja esse outro exemplo:
Private Sub Command1_Click()
AlterarTexto Text1, [Ô]Roberto Martins[Ô]
End Sub
Public Sub AlterarTexto(Txt As TextBox, NovoValor As String)
Txt.Text = NovoValor
End Sub
Outro Exemplo:
Private Sub Command1_Click()
MsgBox ValorTxt(Text1)
End Sub
Public Function ValorTxt(Txt As TextBox) As String
ValorTxt = Txt.Text
End Function
segue...........................
Private Sub Command1_Click()
AlterarTexto Text1
End Sub
Public Sub AlterarTexto(ByRef Txt As TextBox)
Txt = [Ô]abc[Ô]
End Sub
Citação::
olha, se olhar o lado logico, uma propriedade e uma função GET, que dentro dessa funcao tem uma variavel.
Olhando dessa forma a referencia fica em cima da função e nao em cima da variavel privada dentro da propriedade.
Por isso que uma referencia nao funciona em cima de uma propriedade, nao sei se em java ou outra linguagem isso e possivel e o compilador consegue interpertar que na verdade vc quer fazer uma referencia a propriedade (funcao get) e ter ao endereço de memoria da variavel privada dentro desta função.
Se isso fosse prossivel, para que usar propriedades se é possivel associar diretamente a variavel dentro da propriedade.
Vejo isso como segurança!
Por isso associamos o objeto como referencia!
Amigo, quando se passa alguma coisa ByRef para um sub, estamos informando ao sub o endereço da área de memória daquilo que estamos passando. O compilador, de posse desse endereço, DEVE poder ler e gravar nessa área. Não importa se é uma variável simples, uma propriedade de um controle, etc.
A prova de que isso que estamos discutindo aqui é um BUG do compilador, é que é possÃvel mostrar que o valor da propriedade do controle FOI passado para dentro do sub. Basta usar um simples Msgbox (eu coloquei um exemplo acima). Existem outras situações em que o compilador avisa que um certo parâmetro só pode ser passado ByRef. No caso aqui, ele não fala nada. Ele aceita, compila e NÃO executa. Imagina esse BUG no meio de milhares de linhas de código. é aà que a coisa pega, não nesses exemplos inocentes que eu coloquei aqui.
Temos que aceitar que os [Ô]autores[Ô] do compilador ERRARAM e esqueceram de implementar ByRef para esse caso e ficaram apenas com ByVal, já que só é possÃvel ler o valor.
Mais um bug prá coleção. E como o VB não tem mais atualizações, será um bug eterno.
Citação::
:
olha, se olhar o lado logico, uma propriedade e uma função GET, que dentro dessa funcao tem uma variavel.
Olhando dessa forma a referencia fica em cima da função e nao em cima da variavel privada dentro da propriedade.
Por isso que uma referencia nao funciona em cima de uma propriedade, nao sei se em java ou outra linguagem isso e possivel e o compilador consegue interpertar que na verdade vc quer fazer uma referencia a propriedade (funcao get) e ter ao endereço de memoria da variavel privada dentro desta função.
Se isso fosse prossivel, para que usar propriedades se é possivel associar diretamente a variavel dentro da propriedade.
Vejo isso como segurança!
Por isso associamos o objeto como referencia!
Amigo, quando se passa alguma coisa ByRef para um sub, estamos informando ao sub o endereço da área de memória daquilo que estamos passando. O compilador, de posse desse endereço, DEVE poder ler e gravar nessa área. Não importa se é uma variável simples, uma propriedade de um controle, etc.
A prova de que isso que estamos discutindo aqui é um BUG do compilador, é que é possÃvel mostrar que o valor da propriedade do controle FOI passado para dentro do sub. Basta usar um simples Msgbox (eu coloquei um exemplo acima). Existem outras situações em que o compilador avisa que um certo parâmetro só pode ser passado ByRef. No caso aqui, ele não fala nada. Ele aceita, compila e NÃO executa. Imagina esse BUG no meio de milhares de linhas de código. é aà que a coisa pega, não nesses exemplos inocentes que eu coloquei aqui.
Temos que aceitar que os [Ô]autores[Ô] do compilador ERRARAM e esqueceram de implementar ByRef para esse caso e ficaram apenas com ByVal, já que só é possÃvel ler o valor.
Mais um bug prá coleção. E como o VB não tem mais atualizações, será um bug eterno.
Concordo em parte, se esse parametro não pode ser passado por referencia o compilador deveria alertar com um erro.
Mas acho que precisamos fazer esse mesmo teste em outra liguagens (vb.net, c#, java, php,....) para assim validar se é um bug ou se é uma falha de compreeção/programação.
Mesmo assim, acho que é questão de entender o conceito de como se acessa uma propriedade.
Citação::
Você analisou a resposta que postei?
Private Sub Command1_Click()
AlterarTexto Text1
End Sub
Public Sub AlterarTexto(Txt As TextBox)
Txt.Text = [Ô]VbMania[Ô]
Txt.Font.Bold = True
Txt.Alignment = 1
Txt.BackColor = vbCyan
Txt.BorderStyle = 1
Txt.Width = 3000
End Sub
Veja esse outro exemplo:Private Sub Command1_Click()
AlterarTexto Text1, [Ô]Roberto Martins[Ô]
End Sub
Public Sub AlterarTexto(Txt As TextBox, NovoValor As String)
Txt.Text = NovoValor
End Sub
Outro Exemplo:Private Sub Command1_Click()
MsgBox ValorTxt(Text1)
End Sub
Public Function ValorTxt(Txt As TextBox) As String
ValorTxt = Txt.Text
End Function
Sim analisei, mas é uma solução ruim. Funciona para um TextBox. Ajeitando mais um pouco funciona para um RichText, mas e se eu quisesse passar um Botão, um Label como seria?
Um TextBox e um RichText tem prop. Text, mas Botões e Labels tem prop. Caption. Percebe como a solução fica restrita? Claro que não estou falando do exemplo que coloquei aqui. Estou tentando mostrar como essas soluções pontuais que deixam todos felizes no momento são, na verdade, armadilhas futuras.
Citação:Mesmo assim, acho que é questão de entender o conceito de como se acessa uma propriedade.
é exatamente o ponto em que está se perdendo. Ao passar [Ô]Text1.Text[Ô] como parâmetro, estou passando a propriedade Text como parâmetro, que por acaso pertence à uma textbox, mas isso não significa que o objeto pai(a textbox) será [Ô]retro-acessÃvel[Ô]. Com o .NET, usando algumas técnicas de Reflection, isso seria possÃvel, mas com o VB6, você deve passar como parâmetro o [Ô]pai[Ô] dos objetos, para que os [Ô]filhos[Ô] seja acessÃveis.
Isso é assim mesmo no VB6, devido à própria estrutura do ActiveX, em que os pontos de memórias são encadeados. Ou seja, passando a propriedade Text, se esta tivesse outras propriedades subordinadas à ela, então estas estariam visÃveis.
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(TextBox1.Text)
alterartexto(TextBox1.Text)
MsgBox(TextBox1.Text)
End Sub
Sub alterartexto(ByRef txt As String)
txt = [Ô]teste[Ô]
End Sub
End Class
Resultado, o valor é alterado sem problema.
Então o Vb.Net se comporta diferente do vb 6.
Citação::
Feito teste no vb.net (visual studio 2010)
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(TextBox1.Text)
alterartexto(TextBox1.Text)
MsgBox(TextBox1.Text)
End Sub
Sub alterartexto(ByRef txt As String)
txt = [Ô]teste[Ô]
End Sub
End Class
Resultado, o valor é alterado sem problema.
Então o Vb.Net se comporta diferente do vb 6.
Creio que agora os amigos entendem o que estou tentando dizer. Só prá citar: Delphi 1.0 já fazia isso em 1995. Foi a primeira linguagem visual que eu aprendi.
Não sou defensor do Delphi e nem de nenhuma outra linguagem (afinal, eles não me pagam prá isso). O que é difÃcil de aceitar é um bug dessa natureza na versão 6 de um compilador.
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);
}
}
}