LASTKEY y ESC... (o cualquier otra)

HMG en Español

Moderator: Rathinagiri

User avatar
SALINETAS24
Posts: 146
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 1 time
Been thanked: 1 time

LASTKEY y ESC... (o cualquier otra)

Post by SALINETAS24 » Wed Aug 15, 2018 3:01 pm

Hola a todos. Ante la necesidad que tenemos muchos usuario de detener un blucle DO WHILE u otro proceso detectanto la tecla ESC, (lo que en CLIPPER era el LASTKEY() ) y no encontramos solución.., aqui os paso lo que yo he montado.

En el programa MAIN definimos una variable MEMVAR, en mi caso lSalPitando y ponemos las siguientes lineas.
MEMVAR lSalPitando
// -> PROCEDIMIENTO PARA ACTIVAR LAS TECLAS DE FUNCION
CREATE EVENT PROCNAME MyFuncKey ()
Que quedaría una cosa así....

Code: Select all

// --> MENU PRICIPAL PARA LA APLICACIÓN
// ------------------------------------------------------------------------
#include "hmg.ch"
#include "_dbf.ch"    //--> CONTROL DE BASE DE DATOS -> DEFINES
//--> Esta es la variable que utilizo para controlar la tecla ESC
MEMVAR lSalPitando
// -> PROCEDIMIENTO PARA ACTIVAR LAS TECLAS DE FUNCION
CREATE EVENT PROCNAME MyFuncKey ()
	
DEFINE WINDOW Principal ;
		AT 1,1 ;
		WIDTH 640 ;
		HEIGHT 180 ;
                bla/bla/bla y más bla

RETURN

//-----------------------------------------------------------------
//---> FUNCION QUE DISPARA LA TECLA ESC.
//-----------------------------------------------------------------
// --> Esta función la pones en el programa principal, al igual que la MEMVAR y el CREATE EVENT

Function MyFuncKey ()
   IF CASE HMG_GetLastVirtualKeyDown () == VK_ESCAPE   
			lSalPitando:=.F.
   ENDIF
   HMG_CleanLastVirtualKeyDown()
	
RETURN



Después en nuestro blucle DO WHILE

Code: Select all


   lSalPitando:=.T.
   DO WHILE !EOF() .AND. lSalPitando
          // ---> a listar
   ENDDO
Salud y Cervezas para todos.

User avatar
andyglezl
Posts: 981
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 20 times
Been thanked: 41 times
Contact:

Post by andyglezl » Wed Aug 15, 2018 7:28 pm

Creo que sigues pensando en "MODO CLIPPER", pero si te funciona, está bien.


Tal ves te funcione de esta forma:
FUNCTION MAIN
DEFINE WINDOW Principal
ON KEY ESCAPE OF Principal ACTION ( lSalPitando:=.F. )
lSalPitando:=.T.
DO WHILE !EOF() .AND. lSalPitando
// ---> a listar
ENDDO
END WINDOW
RETURN

------------------------------------------------------------------------------------------
ON KEY
Defines a Keyboard Shortcut

ON KEY <Key> [ OF <ParentWindow> ] ACTION <ActionProcedureName> | <bBlock>

<Key> must be one of the following:
Basic Keys
F1...F12
BACK,TAB,RETURN,ESCAPE,END,HOME,LEFT,UP,RIGHT,DOWN,INSERT,DELETE,PRIOR,NEXT

Puedes ver la ayuda en HMG/3.4.4/DOC/data/index.htm
Andrés González López
Desde Guadalajara, Jalisco. México.

User avatar
SALINETAS24
Posts: 146
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 1 time
Been thanked: 1 time

Post by SALINETAS24 » Wed Aug 15, 2018 9:18 pm

Hola Andrés y gracias por contestar.

Te digo .., tu método no funciona. Ya lo probé y no funciona. El mio si y en cualquier PROCEDURE o FUNCTION.

..., y lo de pensar como en Clipper.., pues supongo que si...., al perro viejo no se le ensañan nuevos trucos, jajaja, pero poco a poco, y con vuestra ayuda estamos mejorando.

Pero Andrés, permite que te explique para que veas que en este caso (creo yo) no se trata de mi manera de pensar, de lo que se trata es de que el usuario pueda detener un proceso DO WHILE que recorrera un nº indeterminado de registros (pueden ser desde 1 hasta 1MM) y que lo pueda hacer en cualquier momento, y por cualquier motivo.., se aburre, se tiene que ir a merendar... por lo que sea, sin tener que quitar los automáticos.

Imagínate la situación. Tienes una aplicación con un fichero de artículos de tu almacén y en el tienes un campo EXISTENCIAS para poder inventariar. Este campo es actualizado a traves de ENTRADAS/SALIDAS de mercancía que se registran en otro FICHERO. Así siempre sabes lo que tienes de cada artículo. Por un motivo que desconocemos se han borrado las existencias, y lo único que podemos hacer es recorrer todo el fichero donde tienes las entradas/salidas de mercancía para actualizar correctamente las existencias del Almacen (el de artículos del almacén), y en ese fichero de ENTRADAS/SALIDAS hay unos 300M registros.
¿que haces..? pues eso.., crear un DO WHILE, que leerá las lineas de entrada/salida y dependiendo del valor leido.., o sumara o restara a cada artículo. Ese es el proceso que yo quiero que el usuario final pueda detener y la forma de hacerlo es como yo he puesto.. no falla.

Igual es que hay otra forma de hacerlo en HMG y yo sigo pensado en clipper pero yo más no se.

Lo dicho muchas gracias, un abrazo y cervezas fresquitas.

User avatar
andyglezl
Posts: 981
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 20 times
Been thanked: 41 times
Contact:

Post by andyglezl » Thu Aug 16, 2018 12:34 am

SALINETAS24 wrote:
Wed Aug 15, 2018 9:18 pm
Hola Andrés y gracias por contestar.

Pero Andrés, permite que te explique para que veas que en este caso (creo yo) no se trata de mi manera de pensar, de lo que se trata es de que el usuario pueda detener un proceso DO WHILE que recorrera un nº indeterminado de registros (pueden ser desde 1 hasta 1MM) y que lo pueda hacer en cualquier momento, y por cualquier motivo.., se aburre, se tiene que ir a merendar... por lo que sea, sin tener que quitar los automáticos.

Imagínate la situación. Tienes una aplicación con un fichero de artículos de tu almacén y en el tienes un campo EXISTENCIAS para poder inventariar. Este campo es actualizado a traves de ENTRADAS/SALIDAS de mercancía que se registran en otro FICHERO. Así siempre sabes lo que tienes de cada artículo. Por un motivo que desconocemos se han borrado las existencias, y lo único que podemos hacer es recorrer todo el fichero donde tienes las entradas/salidas de mercancía para actualizar correctamente las existencias del Almacen (el de artículos del almacén), y en ese fichero de ENTRADAS/SALIDAS hay unos 300M registros.
¿que haces..? pues eso.., crear un DO WHILE, que leerá las lineas de entrada/salida y dependiendo del valor leido.., o sumara o restara a cada artículo. Ese es el proceso que yo quiero que el usuario final pueda detener y la forma de hacerlo es como yo he puesto.. no falla.

Igual es que hay otra forma de hacerlo en HMG y yo sigo pensado en clipper pero yo más no se.
Hola Salinetas
Me vuelvo a preguntar, en que computadora trabajas ? Porque no me queda claro.

si con "1MM" te refieres a "1Millon" y si con "300M" te refieres a "300 Mil",
no es la gran cantidad de registros como para que el usuario se "aburra".
Y eso de hacerlo en cualquier momento, estaría bien si es monousuario y no afecte a otros.
Ademas con lo que estas permitiendo al oprimir la tecla ESC, es que no termine de actualizar las existencias
y quedas en las mismas.

Puedes hacer respaldos diarios, cada 3er dia, etc. y restaurar como tu lo necesites.

Y si eso sucediera constantemente, otro sería el problema, indices dañados, errores en el disco, etc.
Andrés González López
Desde Guadalajara, Jalisco. México.

User avatar
andyglezl
Posts: 981
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 20 times
Been thanked: 41 times
Contact:

Post by andyglezl » Thu Aug 16, 2018 2:45 am

Hola
Tienes el ejemplo con el que probaste y no te funciona ?

Porque a mi si me funciona.
Attachments
dowhile.png
dowhile.png (6.03 KiB) Viewed 284 times
Andrés González López
Desde Guadalajara, Jalisco. México.

User avatar
dragancesu
Posts: 560
Joined: Mon Jun 24, 2013 11:53 am
DBs Used: DBF, MySQL, Oracle
Location: Subotica, Serbia
Has thanked: 14 times
Been thanked: 101 times

Post by dragancesu » Thu Aug 16, 2018 6:35 am

If some processing takes a long time then it can irritate the user

There is a ProgressBar control that shows how much is done, and it's not difficult on the window where the button is displayed to put a button that will break the boring function

User avatar
srvet_claudio
Posts: 2030
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Has thanked: 34 times
Been thanked: 143 times
Contact:

Post by srvet_claudio » Thu Aug 16, 2018 4:46 pm

SALINETAS24 wrote:
Wed Aug 15, 2018 9:18 pm
Hola Andrés y gracias por contestar.

Te digo .., tu método no funciona. Ya lo probé y no funciona.
Coloca dentro del lazo Do While un:
DO EVENTS
Para hacer que el sistema procese los mensajes de Windows.
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com

User avatar
SALINETAS24
Posts: 146
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 1 time
Been thanked: 1 time

Post by SALINETAS24 » Thu Aug 16, 2018 8:00 pm

Muchas gracias a todos por contestar.

Andrés.., tengo un Comodore C-64....... nooo! es broma, aunque bien mirado tengo un cacharro de ordenador que esta pidiendo a gritos la jubilación. Un saludo.

Dragancesu, tu si que me entiendes.., no se trata de ordenador, ni potencia.., se trata de tener el control..., probare lo que tu me indicas. Introducir la llamada a una PROCEDURE dentro de una ProgressBar. Me gusta la Idea, y visualmente puede quedar muy chulo.., otra cosa es que lo consiga.Un abrazo.

Claudio, he buscado algo sobre DO EVENTS y apenas encuentro información. He visto su uso en algún programa de ejemplo "Samples\Inputwindow\demo.prg" y la verdad es que no comprendo lo que hace, he eliminado la linea en ese programa y el resultado es el mismo. ?¿
He probado con las lineas que indica Andrés y colocando dentro del "lazo" el DO EVENTS y el resultado es negativo, supongo que será por que mi procedimiento esta en fuera de la definición de la WINDOW. Gracias por tu atención.

Code: Select all

FUNCTION MAIN
DEFINE WINDOW Principal
ON KEY ESCAPE OF Principal ACTION ( lSalPitando:=.F. )

   @ 10,  10 LABEL SAY_1 VALUE 'Cuenta Inicial   
   @ 40,  10 LABEL SAY_1 VALUE 'Cuenta finall 
   @ 10,  90 TEXTBOX ......
   @ 40,  90 TEXTBOX ......

   @ 100,10 BUTTON "CANCELAR"
    @ 100,100 BUTTON "EJECUTAR" ACTION ejecuta()
END WINDOW

//----> PROCEDIMENTO
STATIC PROC ejecuta()
   lSalPitando:=.T.
   DO WHILE !EOF() .AND. lSalPitando
         // ---> a listar
         DO REPORT
         	
   DO EVENTS //--> No me hace ni caso
   ENDDO
RETURN


User avatar
andyglezl
Posts: 981
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 20 times
Been thanked: 41 times
Contact:

Post by andyglezl » Thu Aug 16, 2018 10:42 pm

Tal ves te funcione de esta forma:
FUNCTION MAIN
DEFINE WINDOW Principal
ON KEY ESCAPE OF Principal ACTION ( lSalPitando:=.F. )
lSalPitando:=.T.
DO WHILE !EOF() .AND. lSalPitando
// ---> a listar
ENDDO
END WINDOW
RETURN
???????????????????????

Veo que tomaste "Literal" lo que te puse como ejemplo.
Mi Intención era darte pista de como poder hacerlo. (Disculpas)

Claro que hay que terminar y poner correctamente cada control y sus propiedades
para que funcione.

1.- Me queda la duda, si tu ejemplo no se puede compilar ya que no está completo,
como lo pudiste probar ?
2.- No veo que abras una BD para usar DO WHILE ! EOF()
3.- Para llegar al EOF() hay que avanzar registro por registro y no veo un DBSKIP()
4.- Otra duda es, que esperas que haga el DO WHILE donde tienes DO REPORT ?
Andrés González López
Desde Guadalajara, Jalisco. México.

User avatar
andyglezl
Posts: 981
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 20 times
Been thanked: 41 times
Contact:

Post by andyglezl » Fri Aug 17, 2018 2:26 pm

Te dejo el ejemplo con el yo probe, solo cambia el nombre de la BD y el campo "NOMBRE".

Code: Select all

/*________________________________________________________________________________________*/
/*[•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•]*/
/*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*/
/*				BY AndyGlezL		 					 						 */
/*________________________________________________________________________________________*/
/*[•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•]*/
/*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*/
#include "hmg.ch"

FUNCTION Main
	
	USE ClientesFake
	
	DEFINE WINDOW Form_1 AT 0 , 0 WIDTH 640 HEIGHT 320 NOSIZE NOMAXIMIZE BACKCOLOR { 216 , 191 , 216 }
		
		ON KEY ESCAPE OF Form_1 ACTION lSalPitando := .F.
		
		@ 010, 010 BUTTON BT_1 OF Form_1 CAPTION "Procesa" ACTION Procesa() WIDTH 100 HEIGHT 20 
		@ 040, 010 LABEL  LB_1 OF Form_1 WIDTH 300 HEIGHT 20  VALUE "..."
		@ 040, 350 LABEL  LB_2 OF Form_1 WIDTH 200 HEIGHT 20  VALUE "Oprima ESC para cancelar..."

	END WINDOW
    CENTER WINDOW Form_1
    ACTIVATE WINDOW Form_1
	
RETURN
/*[•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•]*/
/*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*/
FUNCTION Procesa()
	GO TOP
	lSalPitando := .T.
	DO WHILE !EOF() .AND. lSalPitando
		Form_1.LB_1.Value := "Nombre: " + NOMBRE + "   No. Reg.: " + STR( RecNo(), 9 )
		DBSKIP()
		DO EVENTS
	ENDDO
RETURN
Andrés González López
Desde Guadalajara, Jalisco. México.

Post Reply