Ir para o conteúdo
veaoum

Saber se o texto foi alterado

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por programadorvb6

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

:)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Editado por veaoum

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por programadorvb6

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por veaoum

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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é+

Editado por programadorvb6

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.