Page 1 of 1

VENTA MAIN - SETFOCUS

Posted: Sat Jan 14, 2023 6:00 pm
by edufloriv
Saludos amigos,

Tengo un problema de enfoque con este código:

Code: Select all

aArtiDatos := Proforma_ArtiList(SIS_LOCAL)
IF IsWindowDefined('Win_Proforma')
   IF LEN(aArtiDatos) > 0
      IF aArtiDatos[4]+aArtiDatos[5] > 0
         IF ! Proforma_ItemExiste( aArtiDatos[1] )
            nRecnoNew := Proforma_ItemGet( 'Agregar' , aArtiDatos[1] )
            IF nRecnoNew > 0
               Win_Proforma.TxtRecno.Value := nRecnoNew
               Proforma_GridItemAdd( nRecnoNew )
               Proforma_CalculaTotal()
               Win_Proforma.Setfocus
               Win_Proforma.GrdArticulos.Value := nRecnoNew
               Win_Proforma.GrdArticulos.Setfocus
               HMG_PRESSKEY(VK_INSERT)
            ENDIF
         ELSE
            msginfo('El producto ya fue agregado.')
            Win_Proforma.BotAgregar.Setfocus
         ENDIF
      ELSE
         msginfo('El producto elegido no tiene stock.')
      ENDIF
   ELSE // Sección con el problema de enfoque
      Win_Proforma.Setfocus
      Win_Proforma.GrdArticulos.Value := Win_Proforma.TxtRecno.Value
      Win_Proforma.GrdArticulos.Setfocus
   ENDIF
ENDIF
En este código la función Proforma_ArtiList() abre una ventana modal en donde el usuario elige un producto y al aceptar llena la variable aArtiDatos con los datos del producto, si el usuario pulsa la tecla ESCAPE esta ventana se cierra y devuelve la matriz vacia.
Cuando el usuario elige un producto, todo funciona normal. El problema es cuando el usuario pulsa la tecla ESCAPE y entonces se ejecuta el código que está en el ELSE que evalua la longitud de la variable aArtiDatos:

Code: Select all

   ELSE
      Win_Proforma.Setfocus
      Win_Proforma.GrdArticulos.Value := Win_Proforma.TxtRecno.Value
      Win_Proforma.GrdArticulos.Setfocus
   ENDIF
Supuestamente este código debería devolver el enfoque a la ventana MAIN pero no lo hace:
setfocus-1.png
setfocus-1.png (147.6 KiB) Viewed 3737 times
Como ven el GRID si queda enfocado, pero la ventana MAIN ha perdido el enfoque, y la ventana no responde a ninguna pulsación del teclado. Probe muchas cosas sin resultado alguno hasta que se me ocurrió agregar un MSGINFO:

Code: Select all

   ELSE
      Win_Proforma.Setfocus
      Win_Proforma.GrdArticulos.Value := Win_Proforma.TxtRecno.Value
      Win_Proforma.GrdArticulos.Setfocus
      msginfo( 'Total items: '+INTSTR(Win_Proforma.GrdArticulos.Itemcount) )
   ENDIF
Y extrañamente, luego de dar Aceptar a esta ventana el enfoque se devuelve a la ventana MAIN y responde perfectamente al teclado:
setfocus-2.png
setfocus-2.png (158.48 KiB) Viewed 3737 times
setfocus-3.png
setfocus-3.png (146.31 KiB) Viewed 3737 times
Aclaro que este tema de enfoque es importante porque este cliente en particular NO USA MOUSE en sus puntos de venta, solo usan el teclado. ¿ Abrá alguna instrucción que fuerce el enfoque sobre la ventana MAIN ? al parecer el MSGINFO(), al ser parte de las APIs del mismo windows recupera o fuerza el enfoque sobre la ventana anterior.

Si alguien tiene alguna solución sin tener que usar el MSGINFO() les agradeceré su ayuda.

Re: VENTA MAIN - SETFOCUS

Posted: Sat Jan 14, 2023 7:19 pm
by edk
Tratar de usar SetForeGroundWindow ( Win_Proforma.Handle ) en lugar de Win_Proforma.SetFocus

Re: VENTA MAIN - SETFOCUS

Posted: Sun Jan 15, 2023 2:37 pm
by edufloriv
Edk,

Mil gracias amigo. Funcionó perfecto. Saludos.

Re: VENTA MAIN - SETFOCUS

Posted: Sun Jan 15, 2023 7:58 pm
by Claudio Ricardo
Hola Eduardo, cuando a mi no me funciona en modo oop: Form.SetFocus o Form.Control.SetFocus
cambio por: DoMethod ("Form","SetFocus") o DoMethod ("Form","Control","SetFocus")
Aunque la solución de Edward (no la conocía) es más elegante y avanzada !