TAO SIMPLES E NAO FUNCIONA. POR QUE?

ROBIU 13/03/2012 12:35:08
#397061
Você analisou a resposta que postei?

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
LUIZCOMINO 13/03/2012 13:40:30
#397065
amigão a referencia que você deve passar é o objeto caixa de texto
segue...........................



Private Sub Command1_Click()
AlterarTexto Text1
End Sub

Public Sub AlterarTexto(ByRef Txt As TextBox)
Txt = [Ô]abc[Ô]
End Sub
KERPLUNK 13/03/2012 14:00:25
#397066
Você não pode fazer o que você quer no VB6, passar uma propriedade e por referência, ter seu respectivo objeto correspondente. Você precisa passar o objeto todo.
JALEXM 13/03/2012 14:40:49
#397069
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.
LVFIOROT 13/03/2012 14:47:30
#397071
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.



JALEXM 13/03/2012 14:53:28
#397073
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.
KERPLUNK 13/03/2012 14:55:34
#397074
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.
LVFIOROT 13/03/2012 14:55:52
#397075
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.

JALEXM 13/03/2012 15:07:03
#397076
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.
LVFIOROT 13/03/2012 15:10:29
#397077
ja o c# nao aceita e da 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);
}

}
}
Página 3 de 5 [48 registro(s)]
Tópico encerrado , respostas não são mais permitidas