Problema com Lostfocus no Textbox

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

mmarcondes
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 02 Jul 2021 15:06
Localização: witmarsum

Problema com Lostfocus no Textbox

Mensagem por mmarcondes »

Pessoal, estou tentando validar um campo que tem digitação obrigatória, mas dá bug quando tento sair da janela, ele fica chamando function que uso no on lostfocus umas 6 vezes até sair, isso quando não trava, como resolver
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Problema com Lostfocus no Textbox

Mensagem por ivanil »

Bom dia,

Acredito que só será possível te ajudar com mais precisão se você puder compartilhar o código. A forma como o evento está sendo tratado influencia diretamente no comportamento que você está descrevendo.

Lembrando que o evento onLostFocus é disparado toda vez que o campo perde o foco. Se dentro dessa função você está forçando o foco de volta, isso pode entrar em loop — especialmente se a janela ou outro componente tenta ganhar o foco nesse momento.

Em aplicações gráficas, é comum evitar validação no lostFocus, justamente porque algumas ações podem gerar esse tipo de comportamento inesperado, além de que o usuário pode facilmente saltar o campo com o mouse;

At;

Ivanil
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Problema com Lostfocus no Textbox

Mensagem por JoséQuintas »

Lembro que esse ponto foi problema no DLAUTO, aquele automático.
Se não me engano, dá pra fazer testes no VALID.
Precisa testar

parte do fonte genérico de validação:

Código: Selecionar todos

   nPos := hb_AScan( ::aControlList, { | e | e[ CFG_CTLTYPE ] == TYPE_BUTTON .AND. ;
      e[ CFG_CAPTION ] == "Cancel" } )
   IF nPos != 0
      IF GUI():IsCurrentFocus( ::xDlg, ::aControlList[ nPos, CFG_FCONTROL ] )
         RETURN .T.
      ENDIF
   ENDIF
fonte de testar aonde está o foco

Código: Selecionar todos

STATIC FUNCTION gui_IsCurrentFocus( xDlg, xControl )

   LOCAL lOk

   IF PCount() == 1
      lOk := ( GetActiveWindow() == GetProperty( XDlg, "HANDLE" ) )
   ELSE
      lOk := ( GetProperty( xDlg, "FOCUSEDCONTROL" )  == xControl )
   ENDIF

   RETURN lOk
Simplificando:
Se o foco está no button CANCEL, significa que foi solicitado cancelamento.
Nesse caso o VALID é anulado, retorna verdadeiro sem fazer qualquer teste adicional.

Como eu já disse: faça o teste.
E confirme se já não existe algo relacionado a isso.

Na OOHG existe a cláusula CANCEL ou algo assim, que indica controles que podem anular as validações, como CANCEL e outros.
OOHG é uma das variações de HMG/minigui.
Talvez pedir um recurso igual na HMG Extended, afinal, é só olhar o fonte pra saber como foi feito.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
mmarcondes
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 02 Jul 2021 15:06
Localização: witmarsum

Problema com Lostfocus no Textbox

Mensagem por mmarcondes »

Pessoal, obrigado pelas ajudas, mudei de textbox para getbox, e mais parecido com o Clipper.
Responder