Usando la Clase Calendar

Post Reply
jbrita
Posts: 539
Joined: Mon Jan 16, 2006 3:42 pm

Usando la Clase Calendar

Post by jbrita »

Buenas Tardes..
he logrado correr la clase calendar le he modificado colores y bloqueado dias para atras, pero me tengo problema que no puedo desaparecer otros calendario.. ahi le envio una imagen y el codigo.

STATIC oDlg,oFecha,oCal

function Main()

LOCAL oWnd

DEFINE WINDOW oWnd TITLE "ISOVER.PRG - Si hacemos click fuera del diálogo"

@2,2 BUTTON "Crear Diálogo" OF oWnd SIZE 150,40 ACTION MiDialogo()

oWnd:bGotFocus := {|| IsOver() }

ACTIVATE WINDOW oWnd MAXIMIZED

RETURN(NIL)

//-----------------------------------------------------------------------------
FUNCTION MiDialogo()

LOCAL dFecha:=Date()
local oFntCal

DEFINE FONT oFntCal NAME "Segoe UI" SIZE 0, -16

DEFINE DIALOG oDlg FROM 200,300 TO 450,590 PIXEL STYLE WS_DLGFRAME

@ 0, 0 CALENDAR oCal VAR dFecha SIZE 280,230 DAYSTATE of oDlg FONT oFntCal

ACTIVATE DIALOG oDlg ON INIT InitState(oCal) NOWAIT
RETURN NIL

//-----------------------------------------------------------------------------
FUNCTION IsOver()

IF VALTYPE(oDlg)="O"
oDlg:End()
oDlg:=NIL
ENDIF

RETURN NIL

FUNCTION InitState(oCal)

Code: Select all | Expand

oCal:SetNoTodayCircle( .t. )
oCal:SetNoToday( .t. )
oCal:SetWeekNumbers( .f. )
oCal:SetMinRange( Date() )
oCal:SetColor( 5, CLR_NADA )
oCal:bGotFocus  := {|| oCal:SetTitleBk( RGB(95, 179, 35  ) ) }
oCal:bLDblClick := {|| ( oFecha:=oCal:GetDate(), oDlg:End() ) }

RETURN NIL

esta es la imagen, me aparecen cierta parte a la derecha y abajo

Image

JESUS MARIN
Posts: 199
Joined: Wed Jan 02, 2019 8:36 am

Re: Usando la Clase Calendar

Post by JESUS MARIN »

Buenas tardes
Si lo pones en una ventana en vez de en un dialogo te sale solo uno.
Pruébalo y me cuentas.
Saludos

Jesús Marín
[email protected]
jbrita
Posts: 539
Joined: Mon Jan 16, 2006 3:42 pm

Re: Usando la Clase Calendar

Post by jbrita »

hola Jesus, si lo he provado con define window y funciona
pero tiene que ser dialogo

SAludos

User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Usando la Clase Calendar

Post by Antonio Linares »

Prueba a hacer oCal:oWnd:Refresh()

regards, saludos

Antonio Linares
www.fivetechsoft.com
JESUS MARIN
Posts: 199
Joined: Wed Jan 02, 2019 8:36 am

Re: Usando la Clase Calendar

Post by JESUS MARIN »

Buenos dias Jose.
He podido revisar lo que me has pedido. Lo publico aquí por si ayuda a mas personas.

1) Ya puedes cerrar el dialogo al pulsar fuera del propio diálogo. Con dialogo y no con ventanas, como pedias.

2) Para que solo te aparezca un mes, dimensiona el tamaño de oCal. El methodo ::paint() no se encarga del pintado. Mira el ejemplo que te copio mas abajo. El tamaño es de 100,100 y solo aparece un mes. Antes lo definias mas grande y cabian mas meses. Nota: He simplificado al máximo el ejemplo, para que se entienda mejor.

3) bLDblClick no funcionaba. Es cierto. Ahora si funciona. Te cuento : En el metodo ::LButtonUp (que es donde controla si hay o no doble click), no se actualizaban las variables ::nRowDbl ni tampoco ::nColDbl, con lo que no se podia saber si el doble click estaba dentro del rango. Por lo tanto, en la segunda opcion del IF no se cumplía la primera condicion que era que ::nRowDbl fuera de tipo numerico y por tanto no se ejecutaba el Eval( ::bLDblClick, nRow, nCol )
Te copio tambien ese metodo modificado, debes cambiarlo en tcalenda.prg y compilarlo y lincarlo en tus pruebas.
Nota: Falta revisar ".and. IsOverDay( ::hWnd, nRow, nCol )" que esta desactivado, para terminar de pulir el doble click. Siempre devuelve .f. (falso). No conozco esta función, pero ¿no deberia comparar dos fechas?, Veo que compara dos posiciones x,y pero ya digo siempre devuelve falso.

La "sensibilidad" del doble click se define en tiempo con la variable ::nDelay (por defecto vale 500) y en la posición por las constantes HEIGHTDBLCLICK y WIDTHDBLCLICK

Code: Select all | Expand

#include "fivewin.ch"
#include "calendar.ch"

STATIC oDlg

function Main()

LOCAL oWnd

SET DATE FORMAT "dd/mm/yyyy"

   DEFINE WINDOW oWnd TITLE "ISOVER.PRG - Si hacemos click fuera del diálogo"

  @2,2 BUTTON "Crear Diálogo" OF oWnd SIZE 150,40 ACTION MiDialogo()

     oWnd:bGotFocus := { ||  IF( VALTYPE(oDlg)="O", ( oDlg:End(), oDlg:=nil ), ) }

   ACTIVATE WINDOW oWnd MAXIMIZED

RETURN(NIL)

//-----------------------------------------------------------------------------
FUNCTION MiDialogo()

LOCAL dFecha:=Date(), oCal

   DEFINE DIALOG oDlg FROM 200,300 TO 420,500 PIXEL STYLE WS_DLGFRAME

  @1,1 CALENDAR oCal VAR dFecha SIZE 100,100 OF oDlg PIXEL

     oCal:bLDblClick := { || MsgInfo("Hemos hecho doble click, en la fecha "+DTOC(dFecha)) }

   ACTIVATE DIALOG oDlg NOWAIT

RETURN NIL

Code: Select all | Expand

//----------------------------------------------------------------------------//

METHOD LButtonUp( nRow, nCol, nFlags ) CLASS TCalendar


   if ::lDrag
      return ::Super:LButtonUp( nRow, nCol, nFlags )
   endif

   if ::lCaptured

  ::lCaptured = .f.
  ReleaseCapture()

  ::lBtnUp := .T.

  IF ! ::lDblClick
     ::lDblClick = .T.
     ::oTimerDbl:Activate()
     ::nRowDbl := nRow			// Modificado 10/12/2025 JMV
     ::nColDbl := nCol                      //     " "
  ELSE
     IF ValType( ::nRowDbl ) == "N" /*.and. IsOverDay( ::hWnd, nRow, nCol )*/ .AND. ;
        Abs( ::nRowDbl - nRow  ) <= HEIGHTDBLCLICK .AND. Abs( ::nColDbl - nCol ) <= WIDTHDBLCLICK
        IF ::bLDblClick != NIL
           ::oTimerDbl:Deactivate()
           Eval( ::bLDblClick, nRow, nCol )
        ENDIF
     ENDIF
     ::lDblClick = .F.
  ENDIF

   endif

   ::Super:LButtonUp( nRow, nCol, nFlags )

return NIL

Por favor, cuentanos que tal para que otros puedan leer tus resultados.
Gracias

p.d.: actualizo un poco el tema del IsOverDay()

¿Qué hace realmente IsOverDay()?

Internamente revisa si las coordenadas del click (o del mouse move) caen dentro del rectángulo que representa el día sobre el que el calendario está dibujando.

Por eso siempre te da .F. (FALSE) si:
Las coordenadas no están dentro del área calculada.
El calendario no se ha inicializado completamente.
El control tiene un offset o desplazamiento.
Se está llamando fuera del método donde se actualizan las posiciones.
Estás usando DPI altos o un skin que cambia el tamaño interno.

Entonces, la única solución que se me ocurre, es guardar en una variable de la clase la fecha del click pulsado y si coincide con la fecha del segundo click (dentro del timer), entonces que se cumpla la condición. ( es solo una idea por si alguien quiere, debe y puede modificar la clase).

Jesús Marín
[email protected]
jbrita
Posts: 539
Joined: Mon Jan 16, 2006 3:42 pm

Re: Usando la Clase Calendar

Post by jbrita »

Buenos dias, ahora anda bastante bien, en la imagen del calendario y el doble click, pero tengo una duda al hacer click en la parte de arriba del calendario aparece esto.

Image

como se puede anular esa opcion de dar click

saludos

User avatar
sysctrl2
Posts: 1144
Joined: Mon Feb 05, 2007 7:15 pm
Contact:

Re: Usando la Clase Calendar

Post by sysctrl2 »

Interesante y que bonito ,
gracias por compartir los avances :roll:

Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
karinha
Posts: 8720
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Contact:

Re: Usando la Clase Calendar

Post by karinha »

Prueba DTPICKER tambien:

Code: Select all | Expand

// C:\FWH\SAMPLES\ISOVER5.PRG/RC

#include "Fivewin.ch"
#include "Dtpicker.ch"

FUNCTION Main()

   SET CENTURY ON
   SET DATE BRITISH
   SET EPOCH TO YEAR( DATE() ) - 30
   SETCANCEL( .F. )
   SET DATE FORMAT "dd/mm/yyyy"

   Recursos()

   Codigo()

RETURN NIL

FUNCTION Recursos()

   LOCAL oDlg, oGet, lChg := .F.
   LOCAL aRec, dDate := Date()

   DEFINE DIALOG oDlg RESOURCE "SET_DATE"  TITLE "DTPicker desde Recursos"

   oDlg:lHelpIcon := .F.

   REDEFINE  DTPICKER  oGet VAR dDate ID 10 OF oDlg ON CHANGE oGet:Refresh()

   REDEFINE BUTTON ID 20 OF oDlg ACTION ( lChg := .T., oDlg:End() )

   REDEFINE BUTTON ID 30 OF oDlg ACTION ( lChg := .F., oDlg:End() ) CANCEL

   ACTIVATE DIALOG oDlg CENTERED

   IF lChg

  // SetDate(Day(dDate),Month(dDate),Year(dDate))

  MsgAlert( dDate )

   ENDIF

RETURN NIL

FUNCTION Codigo()

   LOCAL oWnd, oSay
   LOCAL dDate := Date()

   SET DATE TO FRENCH
   SET CENTURY ON
   SET EPOCH TO 1960

   DEFINE WINDOW oWnd TITLE "DTPicker desde Código..."

   @ 3, 30 SAY oSay PROMPT "Fecha: " + DToC( dDate ) OF oWnd SIZE 200, 20

   @ 2, 2 DTPICKER dDate OF oWnd ON CHANGE oSay:Refresh()

   ACTIVATE WINDOW oWnd

RETURN NIL

/*
//El archivo .rc: ISOVER5.RC
//---------------
#ifndef __64__
  1 24 "WinXP/WindowsXP.Manifest" 
#endif

#ifdef __64__
  1 24 "WinXP/WindowsXP.Manifest64"
#endif

SET_DATE DIALOG 18, 37, 201, 108
STYLE DS_MODALFRAME | WS_BORDER | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
FONT 8, "MS Sans Serif"
CAPTION "Datos:"
BEGIN
 PUSHBUTTON "&Aceptar", 20, 42, 69, 48, 13
 PUSHBUTTON "&Cancelar", 30, 112, 69, 46, 13
 CONTROL "", 10, "SysDateTimePick32", 0 | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 60, 27, 81, 14
END
*/

// FIN / END

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
JESUS MARIN
Posts: 199
Joined: Wed Jan 02, 2019 8:36 am

Re: Usando la Clase Calendar

Post by JESUS MARIN »

Buenas Jose
Nos puedes contar si has solucionado lo que necesitabas y si has podido modificar el comportamiento (menu desplegable de los meses) de la clase tCalendar?

Gracias

Jesús Marín
[email protected]
jbrita
Posts: 539
Joined: Mon Jan 16, 2006 3:42 pm

Re: Usando la Clase Calendar

Post by jbrita »

Hola Jesus..
todabia sigo asiendo pruebas

saludos

Post Reply