Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Bibliotecas de código fuente (https://www.clubdelphi.com/foros/forumdisplay.php?f=53)
-   -   TExtCalendar - Calendario alternativo a TCalendar (https://www.clubdelphi.com/foros/showthread.php?t=87138)

Ñuño Martínez 19-11-2014 13:43:40

TExtCalendar - Calendario alternativo a TCalendar
 
1 Archivos Adjunto(s)
Os pongo en antecedentes:

Necesitaba un calendario para mi próximo proyecto (un gestor de actividades). El problema es que TCalendar, el que viene por defecto con Lazarus, no permite marcar fechas de ninguna forma, y como depende del sistema operativo no hay forma de menterle mano. Me puse a buscar y encontré TCalendarLite en un hilo del foro de FreePascal/Lazarus. Me gustó, pero tampoco permite marcar varias fechas, así que me puse a mirarlo para añadirle yo esa eventualidad, pero me encontré con un desaguisado de aúpa: Tres clases, una de las cuales no hace lo que se supone que debe hacer, y un código enrevesado y más complejo de lo que, en mi opinión, debería ser. Total, que me puse a re-escribirlo. La intención primera era mejorar TCalendarLite, pero al final he creado mi propio componente, mucho más simple y creo que mejor, Acabo de terminar hace unos minutos su funcionalidad básica y he decidido compartirlo con todos.

Funciona con Lazarus/FreePascal en Fedora, pero no creo que de problemas en Windows. Lo que me pregunto es si funcionaría en Delphi (a ver si puedo probarlo en mi viejo Delphi6 esta tarde). Permite cambiar muchas cosas del aspecto gráfico, también diferencia entre la fecha actual (o definida por el programador) y la fecha seleccionada por el usuario, y tiene casi todos los eventos de TCalendar y alguno más; todo ello en un código fuente elegante y magníficamente comentado. El "pero" es que le falta alguna cosilla todavía.

En fin, aquí tenéis el invento, según se ve con el programa de demostración (para Lazarus) adjunto:


Estoy pensando en modificarlo ligeramente, de forma que se comporte de forma similar a como lo hace TDrawGrid, para que el programador pueda dibujar cada casilla como le plazca. ¿Quizá extendiéndola a una TDrawExtCalendar? ¿O al revés, que TExtCalendar descienda de TDrawExtCalendar?

También estoy pensando en cómo podría extender una clase TDBExtCalendar que pudiera obtener información de una base de datos para marcar diferentes fechas. Esto último no sé muy bien cómo hacerlo, todavía. Me refiero, más que nada, a cómo indicar los campos a tener en cuenta (¿por defecto? ¿Propiedades? ...).

dec 19-11-2014 15:47:39

Hola,

Gracias Ñuño por compartirlo. He intentado probarlo en Delphi XE2, pero, hay algunos problemillas. Iba a copiar la lista aquí debajo, pero, Delphi me echa una mano como se ve en la siguiente imagen:



No creo que te sirva de mucho, pero, en fin, algo es algo. :rolleyes:

egostar 19-11-2014 18:06:40

Gracias Ñuño

Me parece muy interesante probar tu componente en delphi, también lo probaré en mi XE2 y en XE7.

Saludos

Casimiro Notevi 19-11-2014 18:44:51

^\||/^\||/^\||/

Ñuño Martínez 19-11-2014 21:33:03

Cita:

Empezado por dec (Mensaje 485087)

Caramba. Veo que entre la VCL y la LCL hay muchas más diferencias de lo que pensaba. ¡Incluso en la RTL! :eek: Se me hace extrañísimo que las funciones LeftStr y RightStr no estén definidas en SysUtils, o que TCanvas no tenga propiedades de ancho y alto (Width, Height).

Gracias por el informe. No sé si se podrá hacer compatible con Delphi.

ecfisa 19-11-2014 21:52:05

Hola Ñuño.

Muchas gracias por compartirlo. ^\||/

Saludos :)

ecfisa 19-11-2014 22:17:28

Hola de nuevo Ñuño.

Probando en Delphi 7...

En principio, hay que declarar los tipos TTextLayout y TTextStyle previo a la declaración de la clase ya que no existe:
Código Delphi [-]
type
  TTextLayout = (tlTop, tlCenter, tlBottom);
    
  TTextStyle = packed record      
    Alignment: TAlignment;
    Layout: TTextLayout;
    SingleLine: Boolean;
    Clipping: Boolean;
    ExpandTabs: Boolean;
    ShowPrefix: Boolean;
    Wordbreak: Boolean;
    Opaque: Boolean;
    SystemFont: Boolean;
    RightToLeft: Boolean;
    EndEllipsis: Boolean;
  end;
  ...
  TCustomExtCalendar = CLASS (TGraphicControl)
  ...
Luego de eso me aparece:
Cita:

[Error] extcalendar.pas(122): Method 'GetControlClassDefaultSize' not found in base class
[Error] extcalendar.pas(266): Property 'OnMouseEnter' does not exist in base class
[Error] extcalendar.pas(269): Property 'OnMouseLeave' does not exist in base class
[Fatal Error] extcalendar.pas(310): File not found: 'LazUTF8.dcu'
Estoy acostumbrado a lidiar con los enventos OnMouseEnter y OnMouseLeave en Delphi 7 y no vas a tener problemas con eso, versiones posteriores ya los incluyen. Si encuentro algo mas lo pongo aquí .

Saludos :)

nlsgarcia 20-11-2014 03:33:57

Ñuño,

¡Excelente! :) ^\||/

Nelson.

Ñuño Martínez 21-11-2014 19:42:47

Gracias por los ánimos.

ecfisa: Gracias por la información. Aunque no sé si definir los tipos TTextLayout y TTextStyle, porque más adelante se utilizan como parámetro de un método de TCanvas (método que creo que no existe en la VCL).

ecfisa 21-11-2014 21:17:08

Hola Ñuño.

Si, algo de eso ví... También me tuve que crear una función function IsFontEqual(f1, f2: TFont): boolean en reemplazo del método Font.IsEqual que no existe en Delphi. Al final hice varios cambios logrando que compile en Delphi 7 y hasta muestre el componente, pero no funciona para nada... :(

No he tenido mucho tiempo para dedicarle, pero si logro algo que valga la pena te adjunto el archivo.

Saludos :)


La franja horaria es GMT +2. Ahora son las 15:30:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi