Este es un problema conocido relacionado con cómo el botón ACTION del GET maneja el foco después de ejecutar la acción. Voy a explicar la causa raíz y las soluciones.
Causa del problema
En TGet:CreateButton(), el botón de acción del GET siempre devuelve el foco al GET después de ejecutar la ACTION:
::oBtn:bAction := {|| Eval( oThis:bAction, oThis ), oThis:SetFocus() }
``` [0-cite-0](#0-cite-0)
Esto significa que después de que su `CodigoVen()` ejecuta y `xsetfocus(oNome)` mueve el foco, el `oThis:SetFocus()` lo devuelve al GET. Como el foco nunca "sale" del GET, el método `FWLostFocus()` nunca se dispara, y por lo tanto `lValid()` nunca se ejecuta. [0-cite-1](#0-cite-1)
El VALID del GET (`TGet:lValid()`) solo se ejecuta cuando el control pierde el foco: [0-cite-2](#0-cite-2)
Cuando presiona ENTER, funciona porque `TControl:KeyChar(VK_RETURN)` mueve el foco al siguiente control, lo que dispara `FWLostFocus()` → `lValid()`. [0-cite-3](#0-cite-3)
**Nota:** En versiones anteriores (antes de FWH 1801), existía la propiedad `lKeepFocus` que controlaba este comportamiento, pero en el código actual se ignora: [0-cite-4](#0-cite-4)
En el código antiguo (`OLDCODE_1712`) sí se respetaba:
```harbour
ACTION ( Eval( oThis:bAction, oThis ), if( ::lKeepFocus, oThis:SetFocus(), nil ) )
``` [0-cite-5](#0-cite-5)
## Soluciones (Workarounds)
### Opción 1: Llamar la validación explícitamente en el ACTION
```harbour
REDEFINE GET oGet[3] var oQrycl:codvendedor ID 94 OF oDlgi UPDATE FONT oFontSay ;
PICTURE "999" bitmap 'lupa' ;
ACTION (SysRefresh(), CodigoVen(oGet[3]), ;
CheckVen(oQrycl:codvendedor, oNomeVE), ;
xsetfocus(oNome)) ;
VALID {|| CheckVen(oQrycl:codvendedor, oNomeVE) }
Opción 2: Forzar la ejecución de lValid() en el ACTION
ACTION (SysRefresh(), CodigoVen(oGet[3]), ;
oGet[3]:lValid(), xsetfocus(oNome))
Opción 3: Sobrescribir el bAction del botón después de crear el GET
Después de definir el GET, sobrescriba el bAction del botón interno para que no llame SetFocus():
oGet[3]:oBtn:bAction := {|| Eval( oGet[3]:bAction, oGet[3] ) }
Esto permite que xsetfocus(oNome) funcione correctamente y el foco salga del GET, disparando el VALID.
Recomendación
La Opción 1 es la más segura y compatible. Simplemente llame CheckVen() dentro del ACTION después de CodigoVen(). El VALID seguirá funcionando normalmente cuando el usuario presione ENTER, y también se ejecutará después de usar el browse de búsqueda.