DATEPICKER y ON ENTER

HMG en Español

Moderator: Rathinagiri

Post Reply
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

DATEPICKER y ON ENTER

Post by SALINETAS24 »

Hola a todos.. y muy buenas tardes.
Aquí os paso otro código gracioso, esto ya me cansa :evil:

Tenemos un DATEPIKER que cuando se pulse ENTER activará un TEXTBOX y le pondrá el focus.
Algo que funciona con cualquier otro control, pero con un DATEPIKER ..., no.., se lo salta. No le pone el focus.

Vale que puedo cambiar el orden de la entrada de datos, pero eso no es serio.
Si alguien sabe que puñetas pasa.., agradecido.
Muchas gracias a todos, y vamos con la cerveza.....

Code: Select all


*
 * HMG - Harbour Win32 GUI library Demo
 *
 * Copyright 2002 Roberto Lopez <mail.box.hmg@gmail.com>
 * http://www.hmgforum.com//
 *
 * MODIFICACION PARA VARIOS LOSTFOCU REALIZADA POR SARGANTANA.SOFT
 * José Manuel Carbonell Bernabe
 * SargantanaSoft@Gmail.com
 * Petrer City - Alicante - Spain.
 * ------------------------------------------
 * 30 DE OCTUBRE DEL 2018 - AÑADIMOS COLORES.
 * ------------------------------------------
 * ----------------------------------------------------------
 * PINTA EL FONDO DE LOS TEXTBOX, ANTIGUOS GET
 * PINTA (nOpc,cColor1,cColor2)
 * Forma de llamarla 
 * ON LOSTFOCUS PINTA(1,Colordepedir, Colordesalir)
 * ON GOYFOCUS PINTA(2,Colordepedir, Colordesalir)
 * nOpc -> 1 Pinta cuendo entra 2 Pinta cuando sale
 * Parametros opcionales, Colordepedir, Colordesalir
 * ------------------------------------------------------------
 * ------------------------------------------
 * 02 DE NOVIEMBRE DEL 2018 - AÑADIMOS UN CALENDARIO MES
 * ------------------------------------------
 * Esta función la he realizado al darme cuenta que el funcion MONTHCALENDAR cambia
 * de apariencia dependiendo de la versión de WINDOW que estemos utilizando y teniendo 
 * que ajustar nuestros ".PRG" porque al Billy Puertas le de la gana.
 * ------------------------------------------------------------
 * --> Calendari(Ventana,nFil,ncol,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
 * --> PARAMETROS 
 * --> Ventana 		-> Window propietaria 
 * --> nFil, nCol	-> Fila y Columna donde mostraremos el calendario
 * --> PARAMETROS OPCIONALES
 * --> dFecha 		-> Opcional DATE()
 * --> cColorNoMes	-> Opcional, color del mes pasado o mes siguiente.
 * --> cColorMes		-> Opcional, color del mes de la fecha
 * --> cColorDia		-> Opcional, color del día
 * --> cColorDom		-> Opcional, color del Domingo
 * ----------------------------------------------------------------------------
 * 02 DE NOVIEMBRE DEL 2018 - AÑADIMOS ZEROS A UN NUMERO TRASFORMADO EN CADENA
 * ------------------------------------------
 * --> Transforma un numero en una cadena y rellena con ceros
 * --> cStrZero( <nNum>, [<nLen>] )
 * --> Parametros  <nNum> es el número a transformar en cadena.
 * --> 				<nLen> longitud máxima
 * --> Return  Número a cadena relleno de ceros
*/

#include "hmg.ch"



Function Main

SET NAVIGATION EXTENDED

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 640 HEIGHT 480 ;
		TITLE 'HMG Demo' ;
		MAIN 

		@ 10,10 TEXTBOX Text_1 VALUE 123 TOOLTIP 'Numeric TextBox' ;
			NUMERIC MAXLENGTH 5 RIGHTALIGN ;
			BACKCOLOR GREEN ; 
			 ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2)

		@ 40,10 TEXTBOX Text_2 	VALUE "123" TOOLTIP ' TextBox' ;
			MAXLENGTH 5 RIGHTALIGN READONLY ;
			 ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2)

		@ 70,10 TEXTBOX Text_3 VALUE 123 TOOLTIP 'Numeric TextBox' ;
			NUMERIC MAXLENGTH 5 RIGHTALIGN ;
			 ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2)
			 
//--> Cuando pulse ENTER tiene que activar el TEXT_4 y ponerle el foco...., y una mierda!!
	 
		@ 100,10	DATEPICKER Get03 TOOLTIP "FECHA DEL ALBARAN" VALUE DATE() FORMAT "dd/MM/yyyy" ;
					ON ENTER PONE_TEXT4()	 
			
		@ 130,10 TEXTBOX Text_4  VALUE 123 TOOLTIP 'Numeric TextBox' ;
			NUMERIC MAXLENGTH 5 RIGHTALIGN ;
			 ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2)
			
		@ 10,200 TEXTBOX Text_5 ;
			VALUE ctod('01/01/2004') ;
			TOOLTIP 'Date TextBox 1' ;
			DATE  ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2)
		@ 40,200 TEXTBOX Text_6 ;
			VALUE Date() ;
			TOOLTIP 'Date TextBox 2' ;
			DATE  ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2) 
			
	CALENDARI("Form_1",240,350)		
			
	DEFINE EDITBOX Edit_1
        ROW    10
        COL    350
        WIDTH  120
        HEIGHT 110
        VALUE ""
		ONGOTFOCUS PINTA( 1) 
		ONLOSTFOCUS PINTA( 2)	 
    END EDITBOX

    DEFINE COMBOBOX Combo_1
        ROW    150
        COL    350
        WIDTH  200
        HEIGHT 100
        ITEMS {"Item 1","Item 2","Item 3"}
        VALUE 0
		ONGOTFOCUS PINTA( 1) 
		ONLOSTFOCUS PINTA( 2)	 
      DISPLAYEDIT .T.      // must be .T. for cuebanner
    END COMBOBOX

    DEFINE SPINNER Spinner_1
        ROW    200
        COL    350
        WIDTH  200
        HEIGHT 24
        RANGEMIN 1
        RANGEMAX 10
        VALUE ""             // must be "" for cuebanner
		ONGOTFOCUS PINTA( 1) 
		ONLOSTFOCUS PINTA( 2)	 
    END SPINNER

    DEFINE RICHEDITBOX RichEdit_1
        ROW    330
        COL    175
        WIDTH  120
        HEIGHT 90
        VALUE ""
		ONGOTFOCUS PINTA( 1) 
		ONLOSTFOCUS PINTA( 2)	 
    END RICHEDITBOX	
			
		
		@ 350, 10 BUTTON Button_1 CAPTION "Click" ACTION MsgInfo ("Hello")
		@ 400, 10 BUTTON Button_2 CAPTION "Minimize" ACTION Form_1.Minimize

	END WINDOW
	Form_1.Text_4.Enabled:=.F.
	Form_1.Center
	Form_1.Text_1.Setfocus
	Form_1.Activate

Return Nil

PROC PONE_TEXT4
	MSGBOX("ACTIVO EL CUATRO Y PONGO FOCO")
	Form_1.Text_4.Enabled:=.T.
	Form_1.Text_4.Setfocus
RETURN


//----------------------------------------------------------
//-- PINTA EL FONDO DE LOS TEXTBOX, ANTIGUOS GET
//-- Forma de llamarla
//-- ON LOSTFOCUS PINTA(nOpc,Colordepedir, Colordesalir)
//-- nOpc -> 1 Pinta cuendo entra 2 Pinta cuando sale
//-- Parametros opcionales, Colordepedir, Colordesalir
//------------------------------------------------------------
PROC Pinta(nOpc,Color_P,Color_S)
	LOCAL A  := GetLastActiveFormIndex ()
	LOCAL i  := GetLastActiveControlIndex ()
	LOCAL cWin:=ThisWindow.Name
	DEFAULT Color_p:=COLOR_LightBlue
	DEFAULT Color_s:=WHITE
	IF A > 0
*	cWin:=(_HMG_SYSDATA [66] [A])
*		IF !EMPTY(GetProperty( cWin , 'FocusedControl'))
			if nOpc=1
				SETPROPERTY(cWin,This.focusedControl,"BACKCOLOR", Color_p)
			ELSE
				SETPROPERTY(cWin,_HMG_SYSDATA [2] [i],"BACKCOLOR", Color_s)
			ENDIF
*		ENDIF
	ENDIF
RETURN

//-------------------------------------------------------------
//-------------------------------------------------------------
// --> FUNCION GENERICA PARA MOSTRAR UN CALENDARIO OPERATIVO
//-------------------------------------------------------------
//--> Calendari(Ventana,nFil,ncol,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
//--> PARAMETROS 
//--> Ventana 		-> Window propietaria 
//--> nFil, nCol	-> Fila y Columna donde mostraremos el calendario
//--> PARAMETROS OPCIONALES
//--> dFecha 		-> Opcional DATE()
//--> cColorNoMes	-> Opcional, color del mes pasado o mes siguiente.
//--> cColorMes		-> Opcional, color del mes de la fecha
//--> cColorDia		-> Opcional, color del día
//--> cColorDom		-> Opcional, color del Domingo

PROC Calendari(Ventana,nFil,ncol,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
	LOCAL nWeek,nDay,cTB
	LOCAL aDia:={"Lu","Ma","Mi","Ju","Vi","Sa","Do"}
	DEFAULT nFil:=nCol:=1
	DEFAULT dFecha:=DATE()
	DEFAULT cColorNomes:=GRAY
	DEFAULT cColorMes:=BLUE
	DEFAULT ccolorDia:=BLACK
	DEFAULT cColorDom:=RED

	@ nFil,ncol LABEL LBTras VALUE "<<" WIDTH 30 CENTERALIGN  BOLD;
			ACTION (Restames(@dFecha),	Carga_cal(Ventana,dFEcha,cColorNoMes,cColorMes,cColorDia,cColorDom))
			
	@ nFIL,ncol+50 LABEL Fecha1 VALUE dFecha WIDTH 70 FONTCOLOR BLUE CENTERALIGN 
	
	@ nFil,ncol+140 LABEL LBAdel VALUE ">>" WIDTH 30 CENTERALIGN BOLD ;
			ACTION (dFecha:=Sumames(dFecha),	Carga_cal(Ventana,dFEcha,cColorNoMes,cColorMes,cColorDia,cColorDom))

	nFil += 60
	FOR nWeek = 1 to 6
		FOR nDay = 1 to 7
			// --> Pongo los nombres de los dias de la semana
			IF nWeek=1
				cTb="cTbd_"+cStrZero(nWeek,1)+cStrZero(nDay,1)
				@ nFil-30,nCol+(25*(nDay-1)) LABEL &cTb CENTERALIGN VALUE aDia[nDay] WIDTH 20 
			ENDIF
			// --> Por los dias	del mes
			cTb="cTb_"+cStrZero(nWeek,1)+cStrZero(nDay,1)
			@ nFil+(20*(nWeek-1)) , nCol+(25*(nDay-1)) LABEL &cTb CENTERALIGN TRANSPARENT VALUE " " WIDTH 20 ;
					ACTION Cambia_dia(Ventana,This.Value,@dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
		NEXT
	NEXT

	@ nFil+(20*(nWeek-1)) ,ncol+50 LABEL dhoy VALUE " HOY " WIDTH 70 FONTCOLOR BLUE CENTERALIGN ;
		ACTION (dFecha:=DATE(),	Carga_cal(Ventana,dFEcha,cColorNoMes,cColorMes,cColorDia,cColorDom))
	
	CARGA_CAL(Ventana,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
RETURN

STATIC PROC CARGA_CAL(Ventana,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
	LOCAL cTB
	LOCAL dBoM, dStart
	LOCAL nWeek, nDay
*	LOCAL cWin:=ThisWindow.Name
	DEFAULT dFecha:=DATE()

	dBoM   = dFecha - Day( dFecha ) + 1
	dStart = If( DoW( dBoM ) != 1, dBoM - DoW( dBoM ) + 2, dBoM - 6 )
	
	SETPROPERTY(Ventana,"Fecha1","Value",dFecha)
	
	FOR nWeek = 1 to 6
		FOR nDay = 1 to 7
			cTb="cTb_"+cStrZero(nWeek,1)+cStrZero(nDay,1)
			SETPROPERTY(Ventana,cTb,"Value",cStrZero(Day( dStart ),2) )
			SETPROPERTY(Ventana,cTb,"BACKCOLOR",WHITE)
			SETPROPERTY(Ventana,cTb,"FONTCOLOR",IF( Month( dStart ) == Month( dFecha ),If( dStart == dFecha, cColorDia, cColorMes ), cColorNomes ) )
			IF nDay = 7 .AND. Month( dStart ) == Month( dFecha ) .AND. dStart!=dFecha  //--> DOMINGOOOOL
				SETPROPERTY(Ventana,ctb,"FONTCOLOR",cColorDom)
			ENDIF
			IF dStart!=dFecha 
				SETPROPERTY(Ventana,cTb,"TRANSPARENT",.F.)
				SETPROPERTY(Ventana,cTb,"BACKCOLOR",YELLOW)
			ENDIF
			dStart++
		NEXT
	NEXT    
RETURN
//------------------------------------------------------------------------------------
STATIC PROC Cambia_DIA(Ventana,cDia,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
	local dBoM, dStart, nDif
	LOCAL i  := GetLastActiveControlIndex ()
	LOCAL aColor

	dBoM   = dFecha - Day( dFecha ) + 1
	dStart = If( DoW( dBoM ) != 1, dBoM - DoW( dBoM ) + 2, dBoM - 6 )
	
	// --> Compruebo si he tocado el mes anterior o el siguiente
	aColor:=GETPROPERTY(Ventana,_HMG_SYSDATA [2] [i],"FONTCOLOR")

	IF aColor[1]=cColorNoMes[1] .AND. aColor[2]=cColorNomes[2] .AND. aColor[3]=cColorNomes[3] 
		IF VAL(cDia) > 20  
			dFecha:=RestaMes(dFecha)
		  ELSE
			dFecha:=Sumames(dFecha)
		ENDIF
	ENDIF
	// --> Voy a poner el dia que corresponde
	IF VAL(cDia) > DAY(dFecha)
		nDif=VAL(cDia)-DAY(dFecha)
		dFecha=dFecha+nDif
	   ELSE
	    nDif=DAY(dFecha)-VAL(cDia)
		dFecha=dFecha-nDif
	ENDIF
	
	Carga_cal(Ventana,dFEcha,cColorNoMes,cColorMes,cColorDia,cColorDom)
	
RETURN
// ----------------------------------------------------------------------------
static function SumaMes( dFecha )

   local dTemp  := dFecha
   local nMonth := Month( dFecha )

   while Month( dTemp++ ) == nMonth
   enddo

return --dTemp + Day( dFecha ) - 1
// ----------------------------------------------------------------------------
static function RestaMes( dFecha )

   local nDay := Day( dFecha )

   dFecha -= Day( dFecha )
   dFecha -= Day( dFecha )

return dFecha + nDay
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// --> Transforma un numero en una cadena y rellena con ceros
// --> cStrZero( <nNum>, [<nLen>] )
// --> Parameteros  <nNum> es el número a transformar en cadena.
// --> 				<nLen> longitud máxima
// --> Return  Número a cadena relleno de ceros
FUNCTION cStrZero( nNum, nLen )

   local cSal, nSigno, nDe
   IF nNum < 0
      nSigno = - 1
      nNum = nNum * -1
     ELSE
      nSigno = 1
   ENDIF
   
   nDe=AT(".",STR(nNum))
   IF nDe!=0
      nDe=LEN(STR(nNum))-nDe
   ENDIF
   
   if nLen == nil
      cSal = StrTran( Str( nNum ), " ", "0" )
   else
      cSal = StrTran( Str( nNum, nLen, nDe ), " ", "0" )
   endif
   IF nSigno=-1
      cSal = "-"+SUBSTR(cSal,2)
   ENDIF


return cSal

Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
Leopoldo Blancas
Posts: 388
Joined: Wed Nov 21, 2012 7:14 pm
Location: México

Re: DATEPICKER y ON ENTER

Post by Leopoldo Blancas »

Hola SALINETAS24,

Aquí os paso otro código gracioso, esto ya me cansa :evil:

Si hay algo que todavía no me acostumbro, por ejemplo no puedo compilar en algún directorio en C:, tengo que poner la carpeta en SAMPLES, bueno pero ese no es tu tema. Solo que son cosas "Graciosas" que pasan y no son cómodas.

Saludos.
Last edited by Leopoldo Blancas on Fri Apr 05, 2019 3:32 am, edited 1 time in total.
Leopoldo Blancas
Posts: 388
Joined: Wed Nov 21, 2012 7:14 pm
Location: México

Re: DATEPICKER y ON ENTER

Post by Leopoldo Blancas »

Hola Salinetas24,

Revise otra vez tu ejemplo y efectivamente se salta el control TextBox4... lo corriges usando la propiedad LOSTFOCUS

@ 100,10 DATEPICKER Get03 TOOLTIP "FECHA DEL ALBARAN" VALUE DATE() FORMAT "dd/MM/yyyy" ;
ON LOSTFOCUS PONE_TEXT4()

Es solo de conocer un poco las propiedades de los controles, recuerda que LOSTFOCUS realiza tareas al perder el foco del control. Y ENTER sin salir del foco del control. Y por eso su "mal" comportamiento. ES MEJOR USAR LOSTFOCUS.

RECUERDA QUE ESTO ES ACIERTO Y ERROR.

Saludos.
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: DATEPICKER y ON ENTER

Post by SALINETAS24 »

Hola Leopoldo. Gracias por contestar.
Conozco LOSTFOCUS y creo que realmente lo que tenemos aqui es un problema.. un bug.
Por las características del prg y con el fin de que la entrada de datos sea más rapida cuando se da el OK a la fecha activa otros TEXTBOX. Imaginate que tienes una pantalla con solo el Datepiker, en este caso no sirve el LOSTFOCUS ya que no tenemos ningun otro campo donde ir y que una vez la fecha haya sido introducida se activan el resto de campos. La unica opcion es con On Enter,. Pero si cambias el Datepiker por un TEXTBOX funciona correctamente. Tambien puedo implementar un botón... pero no deja de ser un error.
Lo que se trata es de que la introducción de datos sea lo mas ágil posible.... si empezamos con Botonicos ya vamos mal.
Sl2
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: DATEPICKER y ON ENTER

Post by SALINETAS24 »

Hola, vuelvo a poner el ejemplo para que veais la diferencia, de la clausula ON ENTER, cuando se activa desde un TEXTBOX o desde un DATEPICKER
En ambos casos llamo a la misma función, lo activa un nuevo un TEXTBOX y le doy el FOCUS.
En el tercer TEXTBOX pulsas ENTER y hace lo correcto, pero sin embargo en el DATEPIKER pulsas ENTER y no consigo dejar el FOCUS donde quiero.
Eso que es lo que es...? Pos un bug así de grande....

Code: Select all

/*
 * HMG - Harbour Win32 GUI library Demo
 *
 * Copyright 2002 Roberto Lopez <mail.box.hmg@gmail.com>
 * http://www.hmgforum.com//
 *
 * MODIFICACION PARA VARIOS LOSTFOCU REALIZADA POR SARGANTANA.SOFT
 * José Manuel Carbonell Bernabe
 * SargantanaSoft@Gmail.com
 * Petrer City - Alicante - Spain.
 * ------------------------------------------
 * 30 DE OCTUBRE DEL 2018 - AÑADIMOS COLORES.
 * ------------------------------------------
 * ----------------------------------------------------------
 * PINTA EL FONDO DE LOS TEXTBOX, ANTIGUOS GET
 * PINTA (nOpc,cColor1,cColor2)
 * Forma de llamarla 
 * ON LOSTFOCUS PINTA(1,Colordepedir, Colordesalir)
 * ON GOYFOCUS PINTA(2,Colordepedir, Colordesalir)
 * nOpc -> 1 Pinta cuendo entra 2 Pinta cuando sale
 * Parametros opcionales, Colordepedir, Colordesalir
 * ------------------------------------------------------------
 * ------------------------------------------
 * 02 DE NOVIEMBRE DEL 2018 - AÑADIMOS UN CALENDARIO MES
 * ------------------------------------------
 * Esta función la he realizado al darme cuenta que el funcion MONTHCALENDAR cambia
 * de apariencia dependiendo de la versión de WINDOW que estemos utilizando y teniendo 
 * que ajustar nuestros ".PRG" porque al Billy Puertas le de la gana.
 * ------------------------------------------------------------
 * --> Calendari(Ventana,nFil,ncol,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
 * --> PARAMETROS 
 * --> Ventana 		-> Window propietaria 
 * --> nFil, nCol	-> Fila y Columna donde mostraremos el calendario
 * --> PARAMETROS OPCIONALES
 * --> dFecha 		-> Opcional DATE()
 * --> cColorNoMes	-> Opcional, color del mes pasado o mes siguiente.
 * --> cColorMes		-> Opcional, color del mes de la fecha
 * --> cColorDia		-> Opcional, color del día
 * --> cColorDom		-> Opcional, color del Domingo
 * ----------------------------------------------------------------------------
 * 02 DE NOVIEMBRE DEL 2018 - AÑADIMOS ZEROS A UN NUMERO TRASFORMADO EN CADENA
 * ------------------------------------------
 * --> Transforma un numero en una cadena y rellena con ceros
 * --> cStrZero( <nNum>, [<nLen>] )
 * --> Parametros  <nNum> es el número a transformar en cadena.
 * --> 				<nLen> longitud máxima
 * --> Return  Número a cadena relleno de ceros
*/

#include "hmg.ch"



Function Main

SET NAVIGATION EXTENDED

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 640 HEIGHT 480 ;
		TITLE 'HMG Demo' ;
		MAIN 

		@ 10,10 TEXTBOX Text_1 VALUE 123 TOOLTIP 'Numeric TextBox' ;
			NUMERIC MAXLENGTH 5 RIGHTALIGN ;
			BACKCOLOR GREEN ; 
			 ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2)

		@ 40,10 TEXTBOX Text_2 	VALUE "123" TOOLTIP ' TextBox' ;
			MAXLENGTH 5 RIGHTALIGN READONLY ;
			 ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2)

		@ 70,10 TEXTBOX Text_3 VALUE 123 TOOLTIP 'Numeric TextBox' ;
			NUMERIC MAXLENGTH 5 RIGHTALIGN ;
			 ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2);
			 ON ENTER ( PONE_TEXT4() )
			 
		@ 100,10	DATEPICKER Get03 TOOLTIP "FECHA DEL ALBARAN" VALUE DATE() FORMAT "dd/MM/yyyy" ;
					ON ENTER ( PONE_TEXT4() )
			
		@ 130,10 TEXTBOX Text_4  VALUE 123 TOOLTIP 'Numeric TextBox' ;
			NUMERIC MAXLENGTH 5 RIGHTALIGN ;
			 ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2)
			
		@ 10,200 TEXTBOX Text_5 ;
			VALUE ctod('01/01/2004') ;
			TOOLTIP 'Date TextBox 1' ;
			DATE  ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2)
		@ 40,200 TEXTBOX Text_6 ;
			VALUE Date() ;
			TOOLTIP 'Date TextBox 2' ;
			DATE  ON GOTFOCUS PINTA( 1) ON LOSTFOCUS PINTA( 2) 
			
	CALENDARI("Form_1",240,350)		
			
	DEFINE EDITBOX Edit_1
        ROW    10
        COL    350
        WIDTH  120
        HEIGHT 110
        VALUE ""
		ONGOTFOCUS PINTA( 1) 
		ONLOSTFOCUS PINTA( 2)	 
    END EDITBOX

    DEFINE COMBOBOX Combo_1
        ROW    150
        COL    350
        WIDTH  200
        HEIGHT 100
        ITEMS {"Item 1","Item 2","Item 3"}
        VALUE 0
		ONGOTFOCUS PINTA( 1) 
		ONLOSTFOCUS PINTA( 2)	 
      DISPLAYEDIT .T.      // must be .T. for cuebanner
    END COMBOBOX

    DEFINE SPINNER Spinner_1
        ROW    200
        COL    350
        WIDTH  200
        HEIGHT 24
        RANGEMIN 1
        RANGEMAX 10
        VALUE ""             // must be "" for cuebanner
		ONGOTFOCUS PINTA( 1) 
		ONLOSTFOCUS PINTA( 2)	 
    END SPINNER

    DEFINE RICHEDITBOX RichEdit_1
        ROW    330
        COL    175
        WIDTH  120
        HEIGHT 90
        VALUE ""
		ONGOTFOCUS PINTA( 1) 
		ONLOSTFOCUS PINTA( 2)	 
    END RICHEDITBOX	
			
		
		@ 350, 10 BUTTON Button_1 CAPTION "Click" ACTION MsgInfo ("Hello")
		@ 400, 10 BUTTON Button_2 CAPTION "Minimize" ACTION Form_1.Minimize

	END WINDOW
	Form_1.Text_4.Enabled:=.F.
	Form_1.Center
	Form_1.Text_1.Setfocus
	Form_1.Activate

Return Nil

PROC PONE_TEXT4
	MSGBOX("ACTIVO EL CUATRO Y PONGO FOCO")
	Form_1.Text_4.Enabled:=.T.
	Form_1.Text_4.Setfocus
RETURN


//----------------------------------------------------------
//-- PINTA EL FONDO DE LOS TEXTBOX, ANTIGUOS GET
//-- Forma de llamarla
//-- ON LOSTFOCUS PINTA(nOpc,Colordepedir, Colordesalir)
//-- nOpc -> 1 Pinta cuendo entra 2 Pinta cuando sale
//-- Parametros opcionales, Colordepedir, Colordesalir
//------------------------------------------------------------
PROC Pinta(nOpc,Color_P,Color_S)
	LOCAL A  := GetLastActiveFormIndex ()
	LOCAL i  := GetLastActiveControlIndex ()
	LOCAL cWin:=ThisWindow.Name
	DEFAULT Color_p:=COLOR_LightBlue
	DEFAULT Color_s:=WHITE
	IF A > 0
*	cWin:=(_HMG_SYSDATA [66] [A])
*		IF !EMPTY(GetProperty( cWin , 'FocusedControl'))
			if nOpc=1
				SETPROPERTY(cWin,This.focusedControl,"BACKCOLOR", Color_p)
			ELSE
				SETPROPERTY(cWin,_HMG_SYSDATA [2] [i],"BACKCOLOR", Color_s)
			ENDIF
*		ENDIF
	ENDIF
RETURN

//-------------------------------------------------------------
//-------------------------------------------------------------
// --> FUNCION GENERICA PARA MOSTRAR UN CALENDARIO OPERATIVO
//-------------------------------------------------------------
//--> Calendari(Ventana,nFil,ncol,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
//--> PARAMETROS 
//--> Ventana 		-> Window propietaria 
//--> nFil, nCol	-> Fila y Columna donde mostraremos el calendario
//--> PARAMETROS OPCIONALES
//--> dFecha 		-> Opcional DATE()
//--> cColorNoMes	-> Opcional, color del mes pasado o mes siguiente.
//--> cColorMes		-> Opcional, color del mes de la fecha
//--> cColorDia		-> Opcional, color del día
//--> cColorDom		-> Opcional, color del Domingo

PROC Calendari(Ventana,nFil,ncol,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
	LOCAL nWeek,nDay,cTB
	LOCAL aDia:={"Lu","Ma","Mi","Ju","Vi","Sa","Do"}
	DEFAULT nFil:=nCol:=1
	DEFAULT dFecha:=DATE()
	DEFAULT cColorNomes:=GRAY
	DEFAULT cColorMes:=BLUE
	DEFAULT ccolorDia:=BLACK
	DEFAULT cColorDom:=RED

	@ nFil,ncol LABEL LBTras VALUE "<<" WIDTH 30 CENTERALIGN  BOLD;
			ACTION (Restames(@dFecha),	Carga_cal(Ventana,dFEcha,cColorNoMes,cColorMes,cColorDia,cColorDom))
			
	@ nFIL,ncol+50 LABEL Fecha1 VALUE dFecha WIDTH 70 FONTCOLOR BLUE CENTERALIGN 
	
	@ nFil,ncol+140 LABEL LBAdel VALUE ">>" WIDTH 30 CENTERALIGN BOLD ;
			ACTION (dFecha:=Sumames(dFecha),	Carga_cal(Ventana,dFEcha,cColorNoMes,cColorMes,cColorDia,cColorDom))

	nFil += 60
	FOR nWeek = 1 to 6
		FOR nDay = 1 to 7
			// --> Pongo los nombres de los dias de la semana
			IF nWeek=1
				cTb="cTbd_"+cStrZero(nWeek,1)+cStrZero(nDay,1)
				@ nFil-30,nCol+(25*(nDay-1)) LABEL &cTb CENTERALIGN VALUE aDia[nDay] WIDTH 20 
			ENDIF
			// --> Por los dias	del mes
			cTb="cTb_"+cStrZero(nWeek,1)+cStrZero(nDay,1)
			@ nFil+(20*(nWeek-1)) , nCol+(25*(nDay-1)) LABEL &cTb CENTERALIGN TRANSPARENT VALUE " " WIDTH 20 ;
					ACTION Cambia_dia(Ventana,This.Value,@dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
		NEXT
	NEXT

	@ nFil+(20*(nWeek-1)) ,ncol+50 LABEL dhoy VALUE " HOY " WIDTH 70 FONTCOLOR BLUE CENTERALIGN ;
		ACTION (dFecha:=DATE(),	Carga_cal(Ventana,dFEcha,cColorNoMes,cColorMes,cColorDia,cColorDom))
	
	CARGA_CAL(Ventana,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
RETURN

STATIC PROC CARGA_CAL(Ventana,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
	LOCAL cTB
	LOCAL dBoM, dStart
	LOCAL nWeek, nDay
*	LOCAL cWin:=ThisWindow.Name
	DEFAULT dFecha:=DATE()

	dBoM   = dFecha - Day( dFecha ) + 1
	dStart = If( DoW( dBoM ) != 1, dBoM - DoW( dBoM ) + 2, dBoM - 6 )
	
	SETPROPERTY(Ventana,"Fecha1","Value",dFecha)
	
	FOR nWeek = 1 to 6
		FOR nDay = 1 to 7
			cTb="cTb_"+cStrZero(nWeek,1)+cStrZero(nDay,1)
			SETPROPERTY(Ventana,cTb,"Value",cStrZero(Day( dStart ),2) )
			SETPROPERTY(Ventana,cTb,"BACKCOLOR",WHITE)
			SETPROPERTY(Ventana,cTb,"FONTCOLOR",IF( Month( dStart ) == Month( dFecha ),If( dStart == dFecha, cColorDia, cColorMes ), cColorNomes ) )
			IF nDay = 7 .AND. Month( dStart ) == Month( dFecha ) .AND. dStart!=dFecha  //--> DOMINGOOOOL
				SETPROPERTY(Ventana,ctb,"FONTCOLOR",cColorDom)
			ENDIF
			IF dStart!=dFecha 
				SETPROPERTY(Ventana,cTb,"TRANSPARENT",.F.)
				SETPROPERTY(Ventana,cTb,"BACKCOLOR",YELLOW)
			ENDIF
			dStart++
		NEXT
	NEXT    
RETURN
//------------------------------------------------------------------------------------
STATIC PROC Cambia_DIA(Ventana,cDia,dFecha,cColorNoMes,cColorMes,cColorDia,cColorDom)
	local dBoM, dStart, nDif
	LOCAL i  := GetLastActiveControlIndex ()
	LOCAL aColor

	dBoM   = dFecha - Day( dFecha ) + 1
	dStart = If( DoW( dBoM ) != 1, dBoM - DoW( dBoM ) + 2, dBoM - 6 )
	
	// --> Compruebo si he tocado el mes anterior o el siguiente
	aColor:=GETPROPERTY(Ventana,_HMG_SYSDATA [2] [i],"FONTCOLOR")

	IF aColor[1]=cColorNoMes[1] .AND. aColor[2]=cColorNomes[2] .AND. aColor[3]=cColorNomes[3] 
		IF VAL(cDia) > 20  
			dFecha:=RestaMes(dFecha)
		  ELSE
			dFecha:=Sumames(dFecha)
		ENDIF
	ENDIF
	// --> Voy a poner el dia que corresponde
	IF VAL(cDia) > DAY(dFecha)
		nDif=VAL(cDia)-DAY(dFecha)
		dFecha=dFecha+nDif
	   ELSE
	    nDif=DAY(dFecha)-VAL(cDia)
		dFecha=dFecha-nDif
	ENDIF
	
	Carga_cal(Ventana,dFEcha,cColorNoMes,cColorMes,cColorDia,cColorDom)
	
RETURN
// ----------------------------------------------------------------------------
static function SumaMes( dFecha )

   local dTemp  := dFecha
   local nMonth := Month( dFecha )

   while Month( dTemp++ ) == nMonth
   enddo

return --dTemp + Day( dFecha ) - 1
// ----------------------------------------------------------------------------
static function RestaMes( dFecha )

   local nDay := Day( dFecha )

   dFecha -= Day( dFecha )
   dFecha -= Day( dFecha )

return dFecha + nDay
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// --> Transforma un numero en una cadena y rellena con ceros
// --> cStrZero( <nNum>, [<nLen>] )
// --> Parameteros  <nNum> es el número a transformar en cadena.
// --> 				<nLen> longitud máxima
// --> Return  Número a cadena relleno de ceros
FUNCTION cStrZero( nNum, nLen )

   local cSal, nSigno, nDe
   IF nNum < 0
      nSigno = - 1
      nNum = nNum * -1
     ELSE
      nSigno = 1
   ENDIF
   
   nDe=AT(".",STR(nNum))
   IF nDe!=0
      nDe=LEN(STR(nNum))-nDe
   ENDIF
   
   if nLen == nil
      cSal = StrTran( Str( nNum ), " ", "0" )
   else
      cSal = StrTran( Str( nNum, nLen, nDe ), " ", "0" )
   endif
   IF nSigno=-1
      cSal = "-"+SUBSTR(cSal,2)
   ENDIF


return cSal

Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
gfilatov
Posts: 1067
Joined: Fri Aug 01, 2008 5:42 am
Location: Ukraine
Contact:

Re: DATEPICKER y ON ENTER

Post by gfilatov »

SALINETAS24 wrote: Fri Apr 05, 2019 6:10 am Hola, vuelvo a poner el ejemplo para que veais la diferencia, de la clausula ON ENTER, cuando se activa desde un TEXTBOX o desde un DATEPICKER
En ambos casos llamo a la misma función, lo activa un nuevo un TEXTBOX y le doy el FOCUS.
En el tercer TEXTBOX pulsas ENTER y hace lo correcto, pero sin embargo en el DATEPIKER pulsas ENTER y no consigo dejar el FOCUS donde quiero.
Eso que es lo que es...? Pos un bug así de grande....
Hello,

Thanks for your bug report :!:

I'm confirm an above problem with using of 'SetFocus' method at ON ENTER event and established Navigation Extended in the DATEPICKER and TIMEPICKER controls.

BTW It will be fixed at a next Minigui Extended build. 8-)
Kind Regards,
Grigory Filatov

"Everything should be made as simple as possible, but no simpler." Albert Einstein
Leopoldo Blancas
Posts: 388
Joined: Wed Nov 21, 2012 7:14 pm
Location: México

Re: DATEPICKER y ON ENTER

Post by Leopoldo Blancas »

OK, SALINETAS24

Si tienes razón, yo solo me guié en solucionar el problema y no ver más allá. Ya contesto Gregory Filatov, es un bug, esperemos que también se solucione aquí en HMG.

Saludos y Gracias Gregory Filatov por contestar y tenernos al tanto de los Bugs.
Post Reply