PDA

Ver la Versión Completa : TExtCalendar - Calendario alternativo a TCalendar


Ñuño Martínez
19-11-2014, 12:43:40
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 (http://forum.lazarus.freepascal.org/index.php/topic,21093.0.html). 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:
http://bitacora.burdjia.com/fotos/TExtCalendar.png

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, 14: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:

http://i60.tinypic.com/2djnv39.png

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

egostar
19-11-2014, 17: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, 17:44:51
^\||/^\||/^\||/

Ñuño Martínez
19-11-2014, 20:33:03
http://i60.tinypic.com/2djnv39.png 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, 20:52:05
Hola Ñuño.

Muchas gracias por compartirlo. ^\||/

Saludos :)

ecfisa
19-11-2014, 21: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:

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:

[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, 02:33:57
Ñuño,

¡Excelente! :) ^\||/

Nelson.

Ñuño Martínez
21-11-2014, 18: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, 20: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 :)