veaoum Posted February 10, 2013 at 11:14 AM Report #494781 Posted February 10, 2013 at 11:14 AM 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
NunoDinis Posted February 10, 2013 at 12:25 PM Report #494785 Posted February 10, 2013 at 12:25 PM 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
veaoum Posted February 10, 2013 at 12:37 PM Author Report #494786 Posted February 10, 2013 at 12:37 PM 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.
NunoDinis Posted February 10, 2013 at 12:43 PM Report #494788 Posted February 10, 2013 at 12:43 PM 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
thoga31 Posted February 10, 2013 at 04:33 PM Report #494798 Posted February 10, 2013 at 04:33 PM 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!
veaoum Posted February 10, 2013 at 06:09 PM Author Report #494807 Posted February 10, 2013 at 06:09 PM 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
thoga31 Posted February 10, 2013 at 06:11 PM Report #494808 Posted February 10, 2013 at 06:11 PM 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!
programadorvb6 Posted February 10, 2013 at 07:07 PM Report #494809 Posted February 10, 2013 at 07:07 PM (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 February 10, 2013 at 07:08 PM by programadorvb6 ______________________________________________________________________________ Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.
thoga31 Posted February 10, 2013 at 07:24 PM Report #494811 Posted February 10, 2013 at 07:24 PM 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!
programadorvb6 Posted February 10, 2013 at 08:26 PM Report #494813 Posted February 10, 2013 at 08:26 PM Não funciona? Ou queres dizer que foi mal escrito? ______________________________________________________________________________ Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.
thoga31 Posted February 10, 2013 at 08:30 PM Report #494814 Posted February 10, 2013 at 08:30 PM 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!
programadorvb6 Posted February 10, 2013 at 08:44 PM Report #494817 Posted February 10, 2013 at 08:44 PM 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é.
thoga31 Posted February 10, 2013 at 09:04 PM Report #494818 Posted February 10, 2013 at 09:04 PM Deixa o "= True", é redundante 😄 If BoasPraticas Then Knowledge is free!
veaoum Posted February 11, 2013 at 03:26 AM Author Report #494839 Posted February 11, 2013 at 03:26 AM (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 February 11, 2013 at 03:34 AM by veaoum
thoga31 Posted February 11, 2013 at 07:38 PM Report #494912 Posted February 11, 2013 at 07:38 PM 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!
veaoum Posted February 12, 2013 at 04:22 AM Author Report #494959 Posted February 12, 2013 at 04:22 AM 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.
thoga31 Posted February 12, 2013 at 11:44 AM Report #494971 Posted February 12, 2013 at 11:44 AM 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!
programadorvb6 Posted February 12, 2013 at 11:49 AM Report #494972 Posted February 12, 2013 at 11:49 AM (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 February 12, 2013 at 12:14 PM by programadorvb6 ______________________________________________________________________________ Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.
thoga31 Posted February 12, 2013 at 11:58 AM Report #494973 Posted February 12, 2013 at 11:58 AM 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!
veaoum Posted February 12, 2013 at 03:55 PM Author Report #495004 Posted February 12, 2013 at 03:55 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now