Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

veaoum

Saber se o texto foi alterado

Recommended Posts

veaoum

Boa tarde! A minha duvida é a seguinte: no evento lostfocux existe alguma forma de saber se uma textbox foi alterada, sem ser desta forma:

Dim aux As String
Private Sub numerotxt2_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles numerotxt2.GotFocus
	aux = numerotxt2.Text
End Sub
Private Sub numerotxt2_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles numerotxt2.LostFocus
	If aux <> numerotxt2.Text Then
		' faz qualquer coisa
	End If
End Sub

Share this post


Link to post
Share on other sites
NunoDinis

Penso que não. Mas se quisesse verificar se houveram alterações, faria dessa forma...


Estranha forma de vida que tem a capacidade de transformar comandos em mensagens de erro.

ndsotware.org

Share this post


Link to post
Share on other sites
veaoum

Ok.. Esse metodo já o uso a bastante tempo apenas lembrei-me de ver se alguém conhecia outra forma mais directa de o fazer.

Share this post


Link to post
Share on other sites
NunoDinis

Ok.. Esse metodo já o uso a bastante tempo apenas lembrei-me de ver se alguém conhecia outra forma mais directa de o fazer.

Isso é uma forma direta.. pelo menos para mim :)


Estranha forma de vida que tem a capacidade de transformar comandos em mensagens de erro.

ndsotware.org

Share this post


Link to post
Share on other sites
thoga31

Tu queres saber se o conteúdo da TextBox foi alterado apenas quando perde foco ou em qualquer altura, mesmo com foco?


Knowledge is free!

Share this post


Link to post
Share on other sites
veaoum

Apenas interessa-me saber quando ele perde o foco, Porque nesta altura o utilizador ja não pode voltar atrás. Agora também queria evitar a função no gotfocus

Share this post


Link to post
Share on other sites
thoga31

Já não estou a entender nada. Então se quando perde o foco já não pode voltar atrás, para que serve o GotFocus? Há algum texto no início?

Ou a que te referes o "não pode voltar atrás"? A mim parece-me que vais colocar a TextBox.Enabled a False.


Knowledge is free!

Share this post


Link to post
Share on other sites
programadorvb6

Olá.

Veja se é o que pretende:

Public Class Form1
Dim Texto_Modificado As Boolean
Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
	Texto_Modificado = True
End Sub
Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus
	If Texto_Modificado = True Then
		MsgBox("Texto Modificado!")
		Texto_Modificado = False
	Else
		MsgBox("Texto Não Modificado!")
		Texto_Modificado = False
	End If
End Sub

End Class

Edited by programadorvb6

Share this post


Link to post
Share on other sites
thoga31

O código apresentado inicialmente é mais eficiente que esse.

Anyway...

Public Class Form1
       Dim Texto_Modificado As Boolean = False  ' inicializar a variável

       Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
       ' Aqui está a ineficiência - este código é sempre executado quando se faz algo na TextBox
               If Not Texto_Modificado Then Texto_Modificado = True  ' Só atribui se ainda não tiver havido alteração
       End Sub

       Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus
               If Texto_Modificado Then  ' não é preciso o "= True"
                       MsgBox("Texto Modificado!")
                       Texto_Modificado = False
               Else
                       MsgBox("Texto Não Modificado!")
                       ' Já é False, não é preciso reatribuir.
               End If
       End Sub
End Class


Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

Não funciona?

Ou queres dizer que foi mal escrito?

Funciona e foi bem escrito. Mas há ligeiras diferenças que eu introduzi. São pequenas coisas que eu acho que são boas práticas e pequenas optimizações. :)

Por exemplo, If Texto_Modificado = True Then é uma redundância, no Else evitas atribuir o valor False - se foi Else, então é porque o valor da variável Text_Modificado já era False - é outra redundância -, e no TextChanged só se muda o valor da variável para True caso esta seja False - evita-se estar constantemente a atribuir True a uma variável que já é True.


Knowledge is free!

Share this post


Link to post
Share on other sites
programadorvb6

Olá thoga31.

Obrigado pela explicação, de facto são boas práticas e pequenas optimizações, que no meio de tantas linhas de código muitas das vezes fazem a diferença, para que se torne em uma aplicação rápida; para mim ainda é um pouco dificil deixar de lado o velho VB6. LOL.

if Boas_Praticas=true andalso Boas_Praticas=true then
Msgbox("Boas práticas")
Else
Msgbox("Más práticas")
end if

:)

Share this post


Link to post
Share on other sites
veaoum

Já não estou a entender nada. Então se quando perde o foco já não pode voltar atrás, para que serve o GotFocus? Há algum texto no início?

Ou a que te referes o "não pode voltar atrás"? A mim parece-me que vais colocar a TextBox.Enabled a False.

Não, não vou alterar o textbox.Enabled. a expressão voltar atrás não foi lá muito feliz. Mas quando alteras a informação na textbox preciso alterar dados e colocar o readonly a outros e queria evitar fazer isso sempre. Queria fazer apenas quando necessário. A tua solução:

O código apresentado inicialmente é mais eficiente que esse.

Anyway...

Public Class Form1
	Dim Texto_Modificado As Boolean = False  ' inicializar a variável

	Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
	' Aqui está a ineficiência - este código é sempre executado quando se faz algo na TextBox
			If Not Texto_Modificado Then Texto_Modificado = True  ' Só atribui se ainda não tiver havido alteração
	End Sub

	Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus
			If Texto_Modificado Then  ' não é preciso o "= True"
					MsgBox("Texto Modificado!")
					Texto_Modificado = False
			Else
					MsgBox("Texto Não Modificado!")
					' Já é False, não é preciso reatribuir.
			End If
	End Sub
End Class

Vem de encontro com a minha feliz expressão voltar atrás, imagina:

tens na textbox = "Portugal-a-Programar"

depois pensas em colocar apenas em siglas mas a meio ainda sem saíres da textbox resolves deixar como estava. Neste caso o Texto_modificado é igual a True e na realidade não houve alteração. Consegui explicar aquilo que quero evitar?

Mudando de assunto ao nivel de programação fazer uma verificação não tem o mesmo custo que fazer uma atribuição directa?

Edited by veaoum

Share this post


Link to post
Share on other sites
thoga31

A tua solução:

[...]

Vem de encontro com a minha feliz expressão voltar atrás, imagina:

tens na textbox = "Portugal-a-Programar"

depois pensas em colocar apenas em siglas mas a meio ainda sem saíres da textbox resolves deixar como estava. Neste caso o Texto_modificado é igual a True e na realidade não houve alteração. Consegui explicar aquilo que quero evitar?

A solução não foi minha, foi do @programadorvb6, eu apenas fiz umas ligeiras alterações :D

Agora que já entendi bem o que pretendes, a tua solução é melhor, e até mais eficiente, que esta que foi mais recentemente apresentada.

Mudando de assunto ao nivel de programação fazer uma verificação não tem o mesmo custo que fazer uma atribuição directa?

Referes-te ao facto de ter mudado para If Not Texto_Modificado Then Texto_Modificado = True?

Isso é discutível, já que o mais importante nesse ponto não é tanto o "custo" mas sim a lógica da coisa, além de que ali está a ser avaliado directamente um Booleano, o que é mais eficiente que uma comparação com o operador de igualdade entre variáveis de outros tipos.

Faz sentido eu estar sempre a atribuir a uma variável o mesmo valor? Não acho. Só o alteramos se ele for diferente do pretendido. Ainda para mais um Booleano: se não é False, é True, e vice-versa. Para quê estar sempre a obrigar à atribuição (o programa não reconhece que o valor que lhe estás a meter é o mesmo que já lá está, pelo que o vai reescrever na mesma) se a variável já tem em si o valor pretendido?

É uma debate interessante, mas nestas situações acho que entra mais a lógica do algoritmo que a sua eficiência - ambos são, tecnicamente, ineficientes neste caso concreto :P


Knowledge is free!

Share this post


Link to post
Share on other sites
veaoum

A solução não foi minha, foi do @programadorvb6, eu apenas fiz umas ligeiras alterações :D

Agora que já entendi bem o que pretendes, a tua solução é melhor, e até mais eficiente, que esta que foi mais recentemente apresentada.

Peço desculpas ao @programadorvb6 pois não me apercebi e pensei que ambas as soluções fossem tuas. Agora voltando a questão principal achas que existe alguma forma de fugir ao evento gotfocus? Não haverá outra forma de fazer?

voltando para o off-topic, concordo contigo quando dizes que não existe necessidade de atribuir um valor a uma variável quando ela já tem esse valor. Apenas estava a falar porque se fizeres n alterações na textbox pelo método do @programadorvb6 ele faz n operações no teu faz n+1. Contudo volto a dizer que o teu método tem mais logica.

Share this post


Link to post
Share on other sites
thoga31

Peço desculpas ao @programadorvb6 pois não me apercebi e pensei que ambas as soluções fossem tuas. Agora voltando a questão principal achas que existe alguma forma de fugir ao evento gotfocus? Não haverá outra forma de fazer?

Que eu me lembre, não.

voltando para o off-topic, concordo contigo quando dizes que não existe necessidade de atribuir um valor a uma variável quando ela já tem esse valor. Apenas estava a falar porque se fizeres n alterações na textbox pelo método do @programadorvb6 ele faz n operações no teu faz n+1. Contudo volto a dizer que o teu método tem mais logica.

Como faz n+1 operações?


Knowledge is free!

Share this post


Link to post
Share on other sites
programadorvb6

Olá Thoga31.

Não sei se é isto que ele quer, mas que teste e diga alguma coisa.

Public Class Form1
Dim Texto_Modificado As Boolean = False
Dim Identicos As String
Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
	If Not Texto_Modificado Then Texto_Modificado = True
End Sub
Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus
	If Texto_Modificado Then
		If Me.TextBox1.Text.Equals(Identicos) Then
			MsgBox("Texto Não Modificado!")
		Else
			MsgBox("Texto Modificado!")
		End If
		Texto_Modificado = False
		Identicos = Me.TextBox1.Text
	Else
		MsgBox("Texto Não Modificado!")
	End If
End Sub
End Class

Vem de encontro com a minha feliz expressão voltar atrás, imagina:

tens na textbox = "Portugal-a-Programar"

depois pensas em colocar apenas em siglas mas a meio ainda sem saíres da textbox resolves deixar como estava. Neste caso o Texto_modificado é igual a True e na realidade não houve alteração. Consegui explicar aquilo que quero evitar?

- Segundo o que entendi : Ele quer que não só detecte quando há uma modificação na TextBox ; bem como caso se verifique; a modificação efectuada condiz com o que lá se encontrava anteriormente ,caso True informa o utilizador de que não foi feita qualquer alteração.

Edited by programadorvb6

Share this post


Link to post
Share on other sites
thoga31

Olá Thoga31.

Não sei se é isto que ele quer, mas que teste e diga alguma coisa.

[...]

Também é uma boa solução. Parece-me que funciona ;)

Uma outra forma possível de escrever esse código do LostFocus é esta (não é nenhum reparo nem nada disso, é só uma outra forma possível de o fazer :D ):

   Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus
       If Texto_Modificado AndAlso Not Me.TextBox1.Text.Equals(Identicos) Then
           MsgBox("Texto Modificado!")
           Texto_Modificado = False
           Identicos = Me.TextBox1.Text
       Else
           MsgBox("Texto Não Modificado!")
           If Texto_Modificado Then Texto_Modificado = False
       End If
   End Sub


Knowledge is free!

Share this post


Link to post
Share on other sites
veaoum

Como faz n+1 operações?

Então ele vê sempre se o Texto_modificado é true ou seja vai ver isto n vezes e na primeira vez vai passa-lo para true.

Share this post


Link to post
Share on other sites
veaoum

Também é uma boa solução. Parece-me que funciona ;)

Uma outra forma possível de escrever esse código do LostFocus é esta (não é nenhum reparo nem nada disso, é só uma outra forma possível de o fazer :D ):

Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus
	If Texto_Modificado AndAlso Not Me.TextBox1.Text.Equals(Identicos) Then
		MsgBox("Texto Modificado!")
		Texto_Modificado = False
		Identicos = Me.TextBox1.Text
	Else
		MsgBox("Texto Não Modificado!")
		If Texto_Modificado Then Texto_Modificado = False
	End If
End Sub

Bem o não era apenas necessário confirmar o identico? Mas lembrei-me que estou a ser estúpido porque estou a criar um tipo de dados para ter esses valores guardados em vez de estar a usar sempre a textbox. posso usar essa informação para o identico assim não tenho que usar o gotfocus.

Edited by veaoum

Share this post


Link to post
Share on other sites
programadorvb6
Bem o não era apenas necessário confirmar o identico? Mas lembrei-me que estou a ser estúpido porque estou a criar um tipo de dados para ter esses valores guardados em vez de estar a usar sempre a textbox. posso usar essa informação para o identico assim não tenho que usar o gotfocus.

Então ele vê sempre se o Texto_modificado é true ou seja vai ver isto n vezes e na primeira vez vai passa-lo para true.

Agora já é a minha vez de estar á nora!! :/

Coloca aqui o código que tens feito, não querendo ser um pouco indelicado pensa também um pouco no assunto, porque quanto eu como thoga, já te demos algumas ideias.

-> Por default, é False ; sempre que pressionas uma tecla , passa a True , e é sobre essa condição + o conteúdo guardado anteriormente na TextBox se vai reger a decisão.

Nota : Modifica o meu exemplo pelo último código que ele escreveu (está + optimizado a meu ver)

Até+

Edited by programadorvb6

Share this post


Link to post
Share on other sites
veaoum

Agora já é a minha vez de estar á nora!! :/

Coloca aqui o código que tens feito, não querendo ser um pouco indelicado pensa também um pouco no assunto, porque quanto eu como thoga, já te demos algumas ideias.

-> Por default, é False ; sempre que pressionas uma tecla , passa a True , e é sobre essa condição + o conteúdo guardado anteriormente na TextBox se vai reger a decisão.

Nota : Modifica o meu exemplo pelo último código que ele escreveu (está + optimizado a meu ver)

Até+

Ao contrario daquilo que possa parecer eu estou a pensar no assunto.

Public Class Form1
	Dim Texto_Modificado As Boolean = False
	Dim Identicos As String
	Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
			If Not Texto_Modificado Then Texto_Modificado = True
	End Sub
	Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus 
					If exto_Modificado and not Me.TextBox1.Text.Equals(Identicos) Then ' A verificação do Texto_Modificado não é desnecessário? Não basta confirmar o identicos?
							MsgBox("Texto Modificado!")
					Else
							MsgBox("Texto não Modificado!")
					End If
					Texto_Modificado = False
					Identicos = Me.TextBox1.Text
	End Sub
End Class

Share this post


Link to post
Share on other sites
thoga31

Entre n+1 e n, a diferença é praticamente nula, ainda para mais quando 1) com um código estás sempre a fazer atribuição, e mais importante 2) o código que apresentaste inicialmente é muito mais eficiente que o que eu e o @programadorvb6 temos debatido ;)

Ao contrario daquilo que possa parecer eu estou a pensar no assunto.

Public Class Form1
       Dim Texto_Modificado As Boolean = False
       Dim Identicos As String
       Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
               If Not Texto_Modificado Then Texto_Modificado = True
       End Sub
       Private Sub TextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.LostFocus 
                       If exto_Modificado and not Me.TextBox1.Text.Equals(Identicos) Then ' A verificação do Texto_Modificado não é desnecessário? Não basta confirmar o identicos?
                               MsgBox("Texto Modificado!")
                       Else
                               MsgBox("Texto não Modificado!")
                       End If
                       Texto_Modificado = False
                       Identicos = Me.TextBox1.Text
       End Sub
End Class

Sim, a variável Texto_Modificado é até desnecessária em todo o caso.


Knowledge is free!

Share this post


Link to post
Share on other sites
veaoum

Bem agora não vou ter tempo para explicar em concreto o que quero fazer mas quando voltar do trabalho tempo explicar o meu objectivo em concreto. Só peço a vossa compreensão pois sou péssimo a explicar-me.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.