FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Usando la Clase Calendar
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Usando la Clase Calendar
Posted: Tue Dec 09, 2025 06:55 PM

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)

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

Posts: 199
Joined: Wed Jan 02, 2019 08:36 AM
Re: Usando la Clase Calendar
Posted: Tue Dec 09, 2025 07:19 PM

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
deumare@gmail.com
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: Usando la Clase Calendar
Posted: Tue Dec 09, 2025 07:50 PM

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

SAludos

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Usando la Clase Calendar
Posted: Wed Dec 10, 2025 05:19 AM

Prueba a hacer oCal:oWnd:Refresh()

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 199
Joined: Wed Jan 02, 2019 08:36 AM
Re: Usando la Clase Calendar
Posted: Wed Dec 10, 2025 08:23 AM

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

#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
//----------------------------------------------------------------------------//

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
deumare@gmail.com
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: Usando la Clase Calendar
Posted: Wed Dec 10, 2025 01:35 PM

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.

como se puede anular esa opcion de dar click

saludos

Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: Usando la Clase Calendar
Posted: Wed Dec 10, 2025 03:48 PM

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

Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Usando la Clase Calendar
Posted: Wed Dec 10, 2025 05:22 PM

Prueba DTPICKER tambien:

// 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
Posts: 199
Joined: Wed Jan 02, 2019 08:36 AM
Re: Usando la Clase Calendar
Posted: Fri Dec 12, 2025 11:17 AM

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
deumare@gmail.com
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: Usando la Clase Calendar
Posted: Fri Dec 12, 2025 07:43 PM

Hola Jesus.. todabia sigo asiendo pruebas

saludos

Continue the discussion