Jump to content

Recommended Posts

Posted

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
Posted

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

Posted

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!

Posted (edited)

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

______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.
 

Posted

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!

Posted

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!

Posted

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

🙂

______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.
 

Posted (edited)

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
Posted

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 😄

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 😛

Knowledge is free!

Posted

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

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.

Posted

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!

Posted (edited)

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

______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.
 

Posted

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 😄 ):

   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!

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
×
×
  • Create New...

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.