LASTKEY y ESC... (o cualquier otra)

HMG en Español

Moderator: Rathinagiri

User avatar
SALINETAS24
Posts: 201
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

Re: LASTKEY y ESC... (o cualquier otra)

Post by SALINETAS24 » Sat Aug 18, 2018 6:00 pm

Hola Andrés, muchas gracias. Ya he detectado el problema.
No funciona porque dentro del DO WHILE yo tengo un DO REPORT, y así solo funciona mi opción.
Se que si hiciese el listado a "pedal" no tendría este problema pero de momento todos los listados los hago con la clase DO REPORT,


Code: Select all

FUNCTION Procesa()
	local xEmp:="empresa de prueba"
	LOCAL lOk:=.t.
	GO TOP
	lSalPitando := .T.
	DO WHILE lSalPitando
		GO TOP
		DO REPORT                                       ;
			TITLE 'stock '                ;
			HEADERS  {'',''} , {'referencia','producto'} ;
			FIELDS   {'ref','producto'}                ;
			WIDTHS   {10,30}                            ;
			TOTALS   {.F.,.F.}                          ;
			WORKAREA stock                          ;
			PAPERSIZE DMPAPER_A4 						;
			CPL      80                                 ;
			LMARGIN 1                                   ;
			HEADRGRP	xEmp							;
			MULTIPLE 			        				;
			PREVIEW                     	;
	
		DO EVENTS
	ENDDO
RETURN

User avatar
mustafa
Posts: 704
Joined: Fri Mar 20, 2009 11:38 am
Location: Alicante - Spain
Been thanked: 80 times

Post by mustafa » Mon Aug 20, 2018 8:55 am

Hola amigos:
Me he tomado la osadía de ampliar el Sample
del Maestro Andres para que el amigo Salinetas
pueda seguir experimentando.

Un cordial saludo amigos
Mustafa :idea: :D

Code: Select all

/*________________________________________________________________________________________*/
/*[•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•]*/
/*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*/
/*				BY AndyGlezL  arreglos  Mustafa López                     */
/*________________________________________________________________________________________*/
/*[•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•]*/
/*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*/
#include "hmg.ch"

FUNCTION Main

  REQUEST DBFCDX , DBFFPT ,DBFNTX , DBFDBT
  RDDSETDEFAULT( 'DBFCDX','DBFNTX' )

  SET CODEPAGE TO SPANISH 
  SET CENTURY ON
  SET DATE FRENCH
  SET DATE FORMAT TO 'dd/mm/yyyy'
  SET EPOCH TO 2000

  PRIVATE Hora_1
  PRIVATE Hora_2 
  PRIVATE Hora_1x 
  PRIVATE Hora_2x 
  PRIVATE Hora_To 

  PRIVATE aReg , nValor, Regs 
  PRIVATE Num
  PRIVATE aStruct := { ;
                     { "FACT" , "N", 7, 0 }, ;
                     { "FECH" , "D", 8, 0 }  ; 
                     }

  IF ! FILE("Fact.dbf")
     DbCreate( "Fact", aStruct, .T. )
     Close Databases 
     USE Fact

     Num := 0
     FOR i=1 TO 50000       
         Num := Num + 1  
         APPEND BLANK
         REPLACE FACT  WITH Num    
         REPLACE FECH  WITH DATE()
    NEXT

    Close Databases 

   ENDIF    

  Use Fact New
  IF ! file("Fact.cdx")
      index on STR(FACT) to Fact
  ENDIF 

  Set Index to Fact

*---------------------------------------------------------------------------------------------------------------------*
	
	DEFINE WINDOW Form_1 AT 0 , 0 WIDTH 555 HEIGHT 320 MAIN NOSIZE NOMAXIMIZE BACKCOLOR { 216 , 191 , 216 }
		
	        ON KEY ESCAPE OF Form_1 ACTION Cancela()  

                DEFINE TIMER TimerMemoryTest  OF  Form_1  INTERVAL 5000  ACTION ReleaseMemoryTest()

*-------------------------------------------------------------*
  _HMG_SYSDATA [ 348 ] := { 199,250,225 }    
  _HMG_SYSDATA [ 349 ] := { 007,071,041 }   
  _HMG_SYSDATA [ 350 ] := { 235,237,095 }   
  _HMG_SYSDATA [ 351 ] := { 069,015,135 }  
*-------------------------------------------------------------*
 
      @ 075,310 GRID Grid_1                  ;
                WIDTH 205 HEIGHT 150         ; 
		HEADERS {"FACTURA","FECHA"}  ;
		WIDTHS {80,100}              ;
		ROWSOURCE "fact"             ;  
                ON CHANGE PositionData()     ;   
		COLUMNFIELDS {"FACT","FECH"} ;
                FONTCOLOR  { 005,186,010 }   ;
                BACKCOLOR  { 211,218,236 }    
		
		@ 010, 015 BUTTON BT_1 OF Form_1 CAPTION "Procesa" ACTION Procesa() WIDTH 100 HEIGHT 20 

		@ 043, 015 LABEL  LB_1 OF Form_1 WIDTH 250 HEIGHT 20  VALUE "..."
		@ 043, 345 LABEL  LB_2 OF Form_1 WIDTH 200 HEIGHT 20  VALUE "Oprima ESC para cancelar..." BACKCOLOR { 216 , 191 , 216 }

                @ 080, 015 BUTTON BT_2 OF Form_1 CAPTION "Cancelar" ACTION Cancela()   WIDTH 100 HEIGHT 20 

                @ 120, 015 LABEL  LB_3 OF Form_1 WIDTH 200 HEIGHT 20 VALUE ""  BACKCOLOR { 216 , 191 , 216 }
                @ 140, 015 LABEL  LB_4 OF Form_1 WIDTH 200 HEIGHT 20 VALUE ""  BACKCOLOR { 216 , 191 , 216 }

                @ 170, 015 LABEL  LB_5 OF Form_1 WIDTH 200 HEIGHT 20 VALUE ""  BACKCOLOR { 216 , 191 , 216 }
                @ 240, 378 LABEL  LB_6 OF Form_1 WIDTH 150 HEIGHT 35 VALUE "Registro / Total"  BACKCOLOR { 216 , 191 , 216 }
                @ 259, 382 LABEL  LB_7 OF Form_1 WIDTH 150 HEIGHT 35 VALUE ""  FONT "Arial"  SIZE 10 BOLD  BACKCOLOR { 216 , 191 , 216 }

                @ 220, 015 BUTTON BT_3 OF Form_1 CAPTION "Exit" ACTION Form_1.Release WIDTH 100 HEIGHT 30 
               
          Chane_Style() 

	END WINDOW

      Form_1.Grid_1.Refresh
      Form_1.Grid_1.SetFocus  


    CENTER WINDOW Form_1
    ACTIVATE WINDOW Form_1
	
RETURN
/*[•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•.•]*/
/*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*/
*----------------------------------------------------------------* 
FUNCTION Chane_Style()   // Hace Recuadro en Grid
*----------------------------------------------------------------* 
 HMG_ChangeWindowStyle ( GetControlHandle("Grid_1","Form_1"), LVS_REPORT, NIL, .T. )

Return

*--------------------------------------------------------------* 
 Function PositionData()  // Nº de Registro / Total  
*--------------------------------------------------------------*
  aReg    :=  Form_1.Grid_1.Value  
  nValor  :=  0
  Regs    :=  STR( Form_1.Grid_1.ItemCount )  
 
   Select('FACT')
   nValor := aReg[1] 
   Form_1.LB_7.value := ALLTRIM( STR(nValor) ) + SPACE(1) + "/" + SPACE(1) + ALLTRIM( Regs)  

Return 

*----------------------------------*
FUNCTION Procesa()
*----------------------------------*

        Form_1.LB_5.Value := ""
	GO TOP
	lSalPitando := .T.
                Hora_1 := TIME()     
                Form_1.LB_3.Value :=  "Inicio:  "+ SPACE(13)+ HORA_1  //TIME()
	DO WHILE !EOF() .AND. lSalPitando
                Form_1.LB_1.Value := "Factura: " + STR(FACT->FACT) + "   No. Reg.: " + STR( RecNo(), 9 ) 
                Hora_2 := TIME() 
                Form_1.LB_4.Value := "Proceso: "+ SPACE(08)+ HORA_2   //TIME()
		DBSKIP()
		DO EVENTS
	ENDDO

 Total_Timex()
 Form_1.Grid_1.RecNo := FACT->(RecNo() - 1 ) 
 PositionData()

RETURN

*----------------------------------*
FUNCTION Cancela()
*----------------------------------*
   lSalPitando := .F.
   Total_Timex()
RETURN
*----------------------------------*
FUNCTION Total_Timex()
*----------------------------------*
   Hora_1x := STRTRAN(Hora_1, ':') 
   Hora_2x := STRTRAN(Hora_2, ':') 

   Hora_To := VAL(Hora_2x) - VAL(Hora_1x)  
   Form_1.LB_5.Value := " "   
   Form_1.LB_5.Value :=  "Total Time: "+ SPACE(15) + ALLTRIM(STR(Hora_To)) 

RETURN

*------------------------------------------*
PROCEDURE ReleaseMemoryTest()
*-----------------------------------------*
STATIC IniMem := 0
LOCAL  EndMem
   IF IniMem == 0
      IniMem := GetProcessMemoryInfo()[3]
   ENDIF
   EndMem := GetProcessMemoryInfo()[3]
   #define MEM_LIMIT  3 // for example 3 times the initial amount of memory used
   IF (EndMem / IniMem) > MEM_LIMIT
      RELEASE MEMORY
      IniMem := GetProcessMemoryInfo()[3]
   ENDIF 
RETURN

*---------------------------------------------------------------------------------------------------------*
*---------------------------------------------------------------------------------------------------------*

User avatar
andyglezl
Posts: 1032
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 22 times
Been thanked: 44 times
Contact:

Post by andyglezl » Mon Aug 20, 2018 7:41 pm

Hola Mustafa
Me falta mucho para Maestro, lo que tengo es experiencia.

Gracias y adelante con los cambios que se hagan, ya que todos podemos aprender de todos.
(por ejemplo, yo no me he metido a experimentar con los "_HMG_SYSDATA" )
Andrés González López
Desde Guadalajara, Jalisco. México.

User avatar
SALINETAS24
Posts: 201
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

Post by SALINETAS24 » Tue Aug 21, 2018 7:48 pm

Hola amigos, ya he conseguido que funcione.
con la primera opción no funcionaba,

Code: Select all

     on key escape of FORM_1 ACTION lSalpitando:=.f.
con esta si lo he logrado.

Code: Select all

     ON KEY ESCAPE OF Form_1 ACTION Cancela() 


Pero la cuestión es esta.

¿Que diferencia hay entre usar la forma que indicáis vosotros y la que yo vengo usando y que pongo lineas más abajo.? Más que nada por saberlo, a mi me da la sensación que mi formula está constantemente comprobando que tecla he pulsado, pero ademas la que yo utilizo me sirve para activar una agenda y una calculadora desde cualquier parte del programa y el código solo lo escribo una vez, en mi caso lo tengo en Mantenimiento Principal.
Un saludo y cervezas fresquitas para todos.

Code: Select all



CREATE EVENT PROCNAME MyFuncKey ()




Function MyFuncKey ()
	
LOCAL  nHWnd:=EventHWND ()
LOCAL  nMsg:=EventMSG ()
LOCAL  nWParam:=EventWPARAM ()
LOCAL  nLParam:=EventLPARAM ()
LOCAL i := ASCAN ( _HMG_SYSDATA [3] ,  nHWnd )

	DO CASE
		CASE HMG_GetLastVirtualKeyDown () == VK_F3
			HMG_CleanLastVirtualKeyDown(); _MAINCALC()
		CASE HMG_GetLastVirtualKeyDown () == VK_F2
			HMG_CleanLastVirtualKeyDown(); _AGENDA()
		CASE HMG_GetLastVirtualKeyDown () == VK_ESCAPE
			HMG_CleanLastVirtualKeyDown(); lSalPitando:=.F.
		CASE HMG_GetLastVirtualKeyDown () == VK_UP .AND. i > 0 .AND. ( _HMG_SYSDATA [1] [i] != "GRID")
			HMG_CLEANLASTVIRTUALKEYDOWN() ; HMG_PRESSKEY(VK_SHIFT,VK_TAB)
		CASE HMG_GetLastVirtualKeyDown () == VK_DOWN .AND. i > 0 .AND. ( _HMG_SYSDATA [1] [i] != "GRID")
			HMG_CLEANLASTVIRTUALKEYDOWN() ; HMG_PRESSKEY(VK_TAB)
	ENDCASE
	

	
RETURN

User avatar
SALINETAS24
Posts: 201
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

Post by SALINETAS24 » Thu Aug 23, 2018 3:55 pm

Hola..
Aquí os paso el PRG de Mustafa con la clase T_REPORT modificada y que permite hace un listado muy funcional, con alguna mejora (acumulados, saltos de pagina, previsualización que elige el usuario, etc).

Pero nadie me ha dicho todavía que diferencia hay entre detectar una tecla como yo lo hago o como vosotros indicias. ;)

Venga.. cervezas para todos
Attachments
LASKEY.rar
clase Report - Mejoras
(1.65 MiB) Downloaded 31 times

User avatar
mustafa
Posts: 704
Joined: Fri Mar 20, 2009 11:38 am
Location: Alicante - Spain
Been thanked: 80 times

Post by mustafa » Fri Aug 24, 2018 10:44 am

Muy currado Nanu
Felicidades por la aportación
Saludos
Mustafa

User avatar
SALINETAS24
Posts: 201
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

Post by SALINETAS24 » Mon Aug 27, 2018 10:18 pm

Gracias amigo Mustafa.
Vamos devolviendo conocimientos al grupo..., vamos compartiendo.
Un saludo,

User avatar
andyglezl
Posts: 1032
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 22 times
Been thanked: 44 times
Contact:

Post by andyglezl » Tue Aug 28, 2018 1:00 am

Yo creo que estás programando de más... (o no entiendo que quieres hacer)

Code: Select all

		CASE HMG_GetLastVirtualKeyDown () == VK_UP .AND. i > 0 .AND. ( _HMG_SYSDATA [1] [i] != "GRID")
			HMG_CLEANLASTVIRTUALKEYDOWN() ; HMG_PRESSKEY(VK_SHIFT,VK_TAB)
		CASE HMG_GetLastVirtualKeyDown () == VK_DOWN .AND. i > 0 .AND. ( _HMG_SYSDATA [1] [i] != "GRID")
			HMG_CLEANLASTVIRTUALKEYDOWN() ; HMG_PRESSKEY(VK_TAB)
Para mi no se me hace practico que cuando oprima la tecla hacia arriba, me regrese al control anterior
y cuando oprima la tecla hacia abajo me avance al siguiente control ya que eso me saca del "GRID".
(no se si con "i" estes indicando que es el 1er. y ùltimo reg. ya que en ambos casos estás preguntando por "i > 0")

Por default, oprimiendo las tecla TAB avanza al siguiente control definido y
oprimiendo SHIFT-TAB retrocede en los mismos controles definidos.

Pero "Cada cabeza es un mundo" y si te funciona, pues está bien.
Andrés González López
Desde Guadalajara, Jalisco. México.

User avatar
SALINETAS24
Posts: 201
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 2 times
Been thanked: 5 times

Post by SALINETAS24 » Tue Aug 28, 2018 4:23 pm

Hola Andrés...,

Para mi no es practico usar el TAB y el SHIFT-TAB, para mi es más práctico utilizar las flechas de los cursores.., que digo yo que el invetor de los teclados las puso para algo :lol: Antes estaban para moverse, hasta que llego Bill Puertas :twisted: y dijo que ahora seria con el TAB..., pues a mi no me mola. ;)

Lo de la "i" no tiene nada que ver con el registro, tiene que ver con valor de la matriz SYSDATA para saber si estoy en un GRID, ya que es en ese control donde aplico el "arriba" y "abajo".
Para mi es mas cómodo, y si que me funciona.., y muy bien. Ya pasare un trozo de ".prg" para que lo valores y me des tu VºBº.

Como siempre recibe un abrazo amigo.., y una cerveza fresquita!! :D

Post Reply