TAO SIMPLES E NAO FUNCIONA. POR QUE?

JALEXM 15/03/2012 08:36:57
#397182
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.
LVFIOROT 15/03/2012 09:29:25
#397184
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
MARCELO.TREZE 15/03/2012 09:37:03
#397187
nossa ta rendendo, o colega ja sabe que é um provavel BUG do VB6, ou seja a duvida foi sanada, então ja era, favor encerrar o tópico.

FFCOUTO 15/03/2012 10:09:35
#397190
Apenas para encerrar

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.
LUIZCOMINO 15/03/2012 10:25:05
#397194
Concordo com o MARCELO-TREZE...
SACOFRITO 15/03/2012 11:14:29
#397198
Tá, um bug do compilador, pode até ser. Mas totalmente contornavel. Agora que estou entrando tambem na linguagem Delphi, ele tem varias coisas diferentes do vb6, umas facilitam, outras atrasam o trabalho, e fica mais chato fazer coisa simples em uma e outra.

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!




EPISCOPAL 15/03/2012 12:08:38
#397204
Não qero entrar em briga de [Ô]Gigantes[Ô] mas o jeito que o FFCOUTO fez ja resolve o problema sem usar typeoff ...


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 ...
LUIS.HERRERA 15/03/2012 13:04:22
#397209
JALEXM eu só lí os primeiros tópicos, são 5 páginas, então pode ser que alguém já tenha resolvido ou você mesmo, mas veja:

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.
Página 5 de 5 [48 registro(s)]
Tópico encerrado , respostas não são mais permitidas