Vou apresentar um probleminha (mas que pode ser um problemão quando tenho forms com muitos controles)
( 1 ) O objetivo : Quando uso o evento OnLostFocus para tratar dados em um Text, as vezes existe um erro no valor (CPF incorreto, por exemplo) e o controle não deve perder o foco. Devo, então, evitar que o controle Text perca o foco para que o usuário faça as devidas correções.
Até aà tudo blz. No exemplo abaixo o campo Text_1 tem a Procedure Text01 associada ao seu evento OnLostFocus.
PROCEDURE Text01
MsgInfo("Faz de conta que aqui tem um erro")
doMethod( "Main" , "Text_1" , "SetFocus" ) // Foco no campo
RETURN
(2) Agora, o problema. Vamos supor que, após o próximo campo (vou chamar Text_2) TAMBÉM tenha um evento OnLostFocus associado a uma procedure
que chamei de Text02
Aqui ocorre um fato desagradável, porque, supondo que o valor de Text_1 tenha um erro (CPF incorreto), o próximo controle (Text_2) irá receber o foco, independente do valor de Text_1 estar incorreto ou não. Ou seja, Text_2 vai ganhar o foco, e quando eu for sair devolver o Foco para Text_1 (SetFocus) a procedure Text02() será executada.
PROCEDURE Text01 // Chamada por OnLostFocus de Text_1
MsgInfo("Faz de conta que aqui tem um erro")
doMethod( "Main" , "Text_1" , "SetFocus" ) // Foco no campo
RETURN
PROCEDURE Text02 // Chamada por OnLostFocus de Text_2
MsgInfo("Eu não deveria ser executado")
RETURN
(3) Agora a solução que eu encontrei : Coloco TABSTOP de Text_2 como .F. para evitar que Text_2 receba o foco. Mas isso, a meu ver, não resolverá o problema satisfatoriamente (pelo menos para mim).
(4) Pergunto aos senhores: como vocês resolvem esse problema ? Teria como eu evitar sair de Text_1 quando existir um erro dentro da procedure Text01 chamada por OnLostFocus ?
Obs.: eu anexei o fonte para quem quiser testar.
Valeu pessoal