TAO SIMPLES E NAO FUNCIONA. POR QUE?
Citação: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.
Sim, amigo, entendi a sua versão. O que eu chamo de BUG é o fato do compilador aceitar, compilar, executar e não fazer NADA. Se não pode fazer tal coisa, então TEM que alertar. Esse é o BUG. Um comportamento desses no meio de milhares de linhas pode levar um tempo enorme para ser descoberto.
Além disso, o problema é que sua solução me obriga a passar o objeto inteiro. Vai funcionar para esse exemplo simples de alterar a prop. Text de um TextBox.
Agora, imagine que eu quisesse também alterar o valor do Caption de um Frame e de um Label. Então, terÃamos o seguinte:
Private Sub Command1_Click()
AlterarTexto Text1.Text
AlterarTexto Label1.Caption
AlterarTexto Frame1.Caption
End Sub
Public Sub AlterarTexto(ByRef Txt As String)
Txt = [Ô]abc[Ô]
End Sub
Se as coisas funcionassem como eu falei, seria simples assim. Acredito que VB.NET faça isso (não tenho certeza pois não trabalho com VB.NET).
Mas se eu passar o objeto como parâmetro em AlterarTexto, eu teria que testar dentro de AlterarTexto QUAL o tipo de objeto que está sendo passado para poder saber se ele tem a prop. Caption ou Text. Perceba que o código vai se complicando.
Por favor, entenda que isso é apenas um exemplo para mostrar o problema, pois existiriam muitas outras formas de fazer isso. Não estou preocupado em alterar o Text de um TextBox. Minha preocupação é com situações muito mais complexas.
Citação::
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.
Sim, amigo, entendi a sua versão. O que eu chamo de BUG é o fato do compilador aceitar, compilar, executar e não fazer NADA. Se não pode fazer tal coisa, então TEM que alertar. Esse é o BUG. Um comportamento desses no meio de milhares de linhas pode levar um tempo enorme para ser descoberto.
Além disso, o problema é que sua solução me obriga a passar o objeto inteiro. Vai funcionar para esse exemplo simples de alterar a prop. Text de um TextBox.
Agora, imagine que eu quisesse também alterar o valor do Caption de um Frame e de um Label. Então, terÃamos o seguinte:
Private Sub Command1_Click()
AlterarTexto Text1.Text
AlterarTexto Label1.Caption
AlterarTexto Frame1.Caption
End Sub
Public Sub AlterarTexto(ByRef Txt As String)
Txt = [Ô]abc[Ô]
End Sub
Se as coisas funcionassem como eu falei, seria simples assim. Acredito que VB.NET faça isso (não tenho certeza pois não trabalho com VB.NET).
Mas se eu passar o objeto como parâmetro em AlterarTexto, eu teria que testar dentro de AlterarTexto QUAL o tipo de objeto que está sendo passado para poder saber se ele tem a prop. Caption ou Text. Perceba que o código vai se complicando.
Por favor, entenda que isso é apenas um exemplo para mostrar o problema, pois existiriam muitas outras formas de fazer isso. Não estou preocupado em alterar o Text de um TextBox. Minha preocupação é com situações muito mais complexas.
em cima desse exemplo, podemos usar varias contornos, um deles...
Private Sub Command1_Click()
AlterarTexto Text1
AlterarTexto Label1
AlterarTexto Frame1
End Sub
Public Sub AlterarTexto(ByRef Txt As Object)
If TypeOf Txt Is TextBox Then
Txt.Text = [Ô]abc[Ô]
ElseIf TypeOf Txt Is Frame Then
Txt.Caption = [Ô]abc[Ô]
ElseIf TypeOf Txt Is Label Then
Txt.Caption = [Ô]abc[Ô]
End If
End Sub
No VB.NET tudo é tratado como objeto (novo conceito OOP), por isso seja uma propriedade, uma variável, uma classe será considerado um objeto por isso funciona.
No VB6 realmente não muda o valor, porém todos devem ter ciência que cada controle (TextBox, Label, etc) tem uma propriedade chamada Default (Padrão). Então se a sub for implementada da seguinte forma:
Sub AlterarTexto(ByRef Txt As Object)
O comportamento será igual ao do .NET pois ele vai usar a propriedade padrão pois nenhuma foi passada. Portanto vai funcionar do jeito que o amigo precisa, sem a necessidade de fazer um IF com TypeOf, ficando dessa forma, veja o exemplo abaixo:
Sub AlterarTexto(ByRef Txt As Object)
Txt = [Ô]Texto novo[Ô]
End Sub
Private Sub Command1_Click()
AlterarTexto Text1
End Sub
Private Sub Command2_Click()
AlterarTexto Label1
End Sub
Espero ter ajudado.
Enfim, acho que ter dado 5 paginas de discussao foi um pouco de mais, pois o problema foi resolvido e o topico continuou apenas para xingar/defender o compilador. Foi até divertido ver isso.
hehe.
Mas fazer oque, cada linguagem é de um jeito. Garanto que voce encontrara coisas facilimas de fazer no vb6 que em outras linguagens nao é tao fácil assim, ou como voce colocou: correto, codigo com excelencia etc.
Abraços!
agora comparando vb6 com delphi, eu vi uma materia falando que as ID do vb6 e melhor que do delphi ... a vantagem do delphi e que nao precisa fazerdeclarações de APIs ... tipo declare functions Sendmessage e bla bla bla.
agora em relação a compiladores, codigos, e outros ... como ja disseram, cada lionguagem tem as suas prticularidades ...
me falaram que pra abrir um arquivo e ler seu conteudo em Clipper, so utiliza poucas linhas de codigo, ja em Cobol tem que ser inseridos umas linhas bem a mais do que o clipper ....... e assim vai
CADA MACACO NO SEU GALHO ....... E NINGUEM é PERFEITO, ASSIM COMO ERARAM NO COMPILADOR DO VB6, NOS ERRAMOS TAMBEM NOS NOSSOS SISTEMAS ..... .... E ISSO AI ...
Acredito que seu código está equivocado e possui duas (02) incoerências:
Incoerência 1: Você não pode passar um objeto textbox como parâmetro e receber uma referência como variável string para manipular. Ela tem que ser o mesmo objeto ou então uma variant.
Citação:
Private Sub Command1_Click()
AlterarTexto [txt-color=#e80000]Text1.Text[/txt-color]
End Sub
Public Sub AlterarTexto([txt-color=#e80000]ByRef Txt As String[/txt-color])
Txt = [Ô]abc[Ô]
End Sub
Incoerência 2:
Além disso você está usando uma SUB para devolver um valor, então teria de ser uma Function e ter um valor de retorno da função, então resolveria, porém na chamada seria diferente:
Textbox.Text = AlterarTexto(Textbox.text)
Public Function AlterarTexto(ByVal Txt As String) As String
AlterarTexto = [Ô]abc[Ô]
End Sub
Isso vai funcionar.