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.