VENTA MAIN - SETFOCUS

HMG en Español

Moderator: Rathinagiri

Post Reply
User avatar
edufloriv
Posts: 247
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

VENTA MAIN - SETFOCUS

Post 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 3733 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 3733 times
setfocus-3.png
setfocus-3.png (146.31 KiB) Viewed 3733 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.

Eduardo Flores Rivas


LIMA - PERU
edk
Posts: 999
Joined: Thu Oct 16, 2014 11:35 am
Location: Poland

Re: VENTA MAIN - SETFOCUS

Post by edk »

Tratar de usar SetForeGroundWindow ( Win_Proforma.Handle ) en lugar de Win_Proforma.SetFocus
User avatar
edufloriv
Posts: 247
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

Re: VENTA MAIN - SETFOCUS

Post by edufloriv »

Edk,

Mil gracias amigo. Funcionó perfecto. Saludos.

Eduardo Flores Rivas


LIMA - PERU
User avatar
Claudio Ricardo
Posts: 367
Joined: Tue Oct 27, 2020 3:38 am
DBs Used: DBF, MySQL, MariaDB
Location: Bs. As. - Argentina

Re: VENTA MAIN - SETFOCUS

Post 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 !
Corrige al sabio y lo harás más sabio, Corrige al necio y lo harás tu enemigo.
WhatsApp / Telegram: +54 911-63016162
Post Reply