FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Valid no get en la version FWH 25.12 não executa
Posts: 7
Joined: Wed Apr 30, 2008 06:38 PM
Valid no get en la version FWH 25.12 não executa
Posted: Thu Mar 12, 2026 05:51 PM

Traductor de Google

Uso la versión fwh 25.12 y hay un problema con o VALID do get, si presiono ENTER directamente no GET, el VALID funciona correctamente, pero si uso un browse de búsqueda (productos, clientes) y hago uno ok, o VALID no se ejecuta.

Uso FiveWin versión 25.12, BCC 7.7, Harbour.

¿Alguien más que use esta versión ha tenido problemas con esto o necesito añadir algo a la compilación?

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Valid no get en la version FWH 25.12 não executa
Posted: Thu Mar 12, 2026 07:30 PM

Puedes mostrar el código PRG para ver como lo haces ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 7
Joined: Wed Apr 30, 2008 06:38 PM
Re: Valid no get en la version FWH 25.12 não executa
Posted: Thu Mar 12, 2026 07:55 PM

Gracias sr Antonio, aqui esta parte do código

REDEFINE GET oGet[3] var oQrycl:codvendedor ID 94 OF oDlgi UPDATE FONT oFontSay;
         PICTURE "999" bitmap 'lupa' ;
         ACTION (SysRefresh(), CodigoVen(oGet[3]) , xsetfocus(oNome));
         VALID {|| CheckVen(oQrycl:codvendedor, oNomeVE) } 

FUNCTION CheckVen(cCodVen, oNomeVe ) 
 LOCAL lRet := .F. 
 LOCAL aVerVen:= oServer:query("Select codigove, vendedor from vendedor WHERE codigove="+ oServer:ValToSQL(cCodVen) +" and ativo limit 1")

IF aVerVen:reccount() > 0 
    oNomeVe:varput( aVerVen:vendedor )
    oNomeVe:Refresh()
    lRet := .T.         
 ELSE
     IF cCodVen=0            
        lRet := .F.
     ELSE 
        msgInfo('Código não localizado.','Atenção')
        lRet := .F.
     ENDIF   
 ENDIF

aVerVen:end()
  

RETURN ( lRet )
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Valid no get en la version FWH 25.12 não executa
Posted: Thu Mar 12, 2026 09:25 PM

Tente assim:
Prueba asi:

   REDEFINE GET oGet[3] var oQrycl:codvendedor ID 94 OF oDlgi UPDATE ;
      FONT oFontSay PICTURE "999" bitmap 'lupa'                      ;
      ACTION( CodigoVen( oGet[3] ), xsetfocus( oNome ) )             ;
      VALID {|| CheckVen(oQrycl:codvendedor, oNomeVE) }

// BUTTON DE SAIDA COM A CLAUSULA ->  CANCEL  - OK?

FUNCTION CheckVen(cCodVen, oNomeVe )
 
   LOCAL lRet := .F.
   LOCAL aVerVen:= oServer:query("Select codigove, vendedor from vendedor WHERE codigove="+ oServer:ValToSQL(cCodVen) +" and ativo limit 1")

   IF aVerVen:reccount() > 0
 
  oNomeVe:varput( aVerVen:vendedor )
  oNomeVe:Refresh()

  // lRet := .T.
  RETURN( .T. )

   ELSE

  IF cCodVen=0

     // lRet := .F.
     RETURN( .F. )

  ELSE

     MsgInfo( 'Código não localizado.', 'Atenção' )

     // lRet := .F.
     RETURN( .F. )

  ENDIF

   ENDIF

   aVerVen:End()  // ??? O que faz isto? Que haces esto?
  

RETURN( .T. ) // ( lRet )

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Valid no get en la version FWH 25.12 não executa
Posted: Thu Mar 12, 2026 09:31 PM

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:

Code (harbour): Select all Collapse
::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

Code (harbour): Select all Collapse
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():

Code (harbour): Select all Collapse
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.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 7
Joined: Wed Apr 30, 2008 06:38 PM
Re: Valid no get en la version FWH 25.12 não executa
Posted: Thu Mar 12, 2026 11:42 PM

Señor Antonio, funcionó. Hice lo que me dijo y usé la opción 1. Muchas gracias por su ayuda.

Continue the discussion