May 142022
 

Este proyecto lo había comenzado un par de años atrás luego lo abandoné, así que me decidí a retomarlo, si tendría que comenzarlo de cero hoy cambiaria muchas cosas ya que no son las más óptimas, pero esto no impide que el calendario funcione bien.

Ahora bien el control se trata de un calendario al cual podemos añadir eventos, esto puede servir para muchas cosas como ser mostrar vacaciones de personal, eventos de cobro, turnos, actividades de tiempo o mostrar de manera gráfica intervalos de fecha.

El control tiene soporte para hacer drag & drop de los eventos, tal como poder modificar con el mouse su rango de fecha, si presionamos la tecla Ctrl y hacemos drag & drop duplica este evento.

Luego la parte de entrada de datos queda a cargo del programador, en los ejemplos agregué unos formularios de muestra, lo que no hice fue crear una series de eventos, pero es posible si se tiene un poco de paciencia, cualquier duda sobre esto último puedo dar una guía de cómo hacerlo.

Dentro de los ejemplos en la carpeta «Advance» encontrarán un ejemplo enlazando el calendario a una base de datos de SQLite, deberán agregar a la referencia a la dll J3cnn.dll

Los eventos del calendario no se manejan por índice sino por keys esto porque internamente éstos son ordenados por fecha y de esta forma se pierde el índice (esto no gustó mucho cómo lo encaré de un principio).

El control no tiene ninguna dependencia, inclusive los iconos son pintados con líneas.

La rueda del scrollbar funciona correctamente cuanto está compilado, esto lo hice así ya que no utilicé Safe subclass, para evitarme dolores de cabeza al programar lo deje así, compilado funciona correctamente lo mismo para el evento MouseLeave. Si a alguien le es necesario que funcione en el ide puede quitar el «If App.LogMode Then».

Para ir cerrando sé que hay muchas cosas que quedaron pendientes, me gustaría que comenten si habría que implementar algo o corregir, también si ven algún error; así de esa manera me es más fácil. En los primeros días de subida seguramente lo esté actualizando frecuentemente a medida que me informen o encuentren detalles.

ucCalendar_Month.png
ucCalendar_Week.png
ucCalendar_Day.png
ucCalendar_Year.png

A continuación un detalle rápido de sus funciones y propiedades:

AddEvents: Función principal para agregar eventos al calendario, parámetros requerido; sujeto (titulo descriptivo), fecha y hora de inicio, fecha y hora de finalización y color del evento, el resto de los parámetros son opcionales, valor de retorno una key del evento.
CenterCalenarInNow: Mueve el scroll a la hora actual.
Clear: Elimina todo los eventos.
DateValue: Asigna o retorna la fecha actual del calendario.
DayHaveEvents: Retorna True/False si hay eventos en un día especifico.
DropDownColor: Cuando hay muchos eventos en un día y en el modo de vista Mes hay más de los que se pueden mostrar, se muestra una barra desplegable la cual podemos cambiar el color con esta propiedad.
EventsCount: Cantidad de eventos agregados.
EventsRoundCorner: Propiedad booleana para mostrar o no esquinas redondeadas en eventos y botones.
FirstDayOfWeek: Aquí podemos asignar que día queremos que se muestre como primer día de la semana, por defecto usa el del sistema.
GetAllEvents: Obtiene una colección de las keys de los eventos agregados.
GetEventData: Obtiene los datos de un evento, su primer parámetro es la key del evento la cual podemos obtenerla con GetAllEvents o por algún evento, el resto de los parámetros son valores de retorno.
GetEventsFromDay: Retorna una colección de keys de los eventos de un día en especifico,
GetSelectionRangeDate: Función para obtener el rango de fechas seleccionada.
HeaderColor: Color de la cabecera y parte de la temática.
HiddeEvent: Oculta el evento, útil para filtrar.
LinesColor: Color de las líneas.
Redraw: Habilita o deshabilita el repintando del calendario, esto sirve para acelerar la carga de eventos.
RemoveEvent: Elimina un evento.
Refresh: Refresca el repintado calendario.
SelectedEvent: Retorna el evento seleccionado.
SelectionColor: Color de la selección.
SetStrLanguage: Aqui podemos pasar la traducción de las palabras utilizadas.
ShowToolTipEvents: Si se quiere mostrar o no la ventana tooltip, esta se puede remplazar por otra personalizada y con informacion más detallada. Véase los eventos EventMouseEnter y EventMouseLeave.
Update: Es más completo que refresh, este vuelve a reordenar por fecha y alfabéticamente los evento, recalcula la posición y por último repinta todo.
UpdateEventData: Función para actualizar los datos de un evento. Debe pasarse la key del evento que queremos modificar.
UserCanChangeDate: Habilita o deshabilita para que el usuario pueda cambiar la pagina actual del calendario.
UserCanChangeEvents: Habilita o deshabilita si el usuario puede cambiar los eventos (mediante estiramiento o arrastre).
UserCanChangeViewMode: Oculta todos los botones en la parte superior de la parte derecha. De esta forma el usuario no puede cambiar el modo de vista o bien el programador toma el control de que vista quiere mostrar.
UserCanScrollMonth: En el modo de vista mes, se puede scrollear infinitamente si necesidad de cambiar de página, esto sólo si se habilita esta opcion.
ViewMode: Cambia por código en el modo de vista (Dia, Semana, Mes, Año)

Eventos:

DateBackColor: Al dispararse este evento podemos elegir según la fecha u hora el color de fondo de la celda, así como también su HatchStyle.
DateChange: Cuando el usuario cambia de página el calendario se dispara este evento.
DragNewEvent: Cuando el usuario tiene la presionada la tecla Control y hace drag & drop el evento se duplica, o sea un nuevo evento es agregado por el usuario, con este evento somos informados y así podremos guardar en la base de datos o como se lo esté manejando.
DropDownViewMore: Evento cuando se presiona el botón de ver más, este botón se encuentra en la vista «Meses», aparece cuando hay muchos eventos en un día y no entran en la celda, al presionar este cambiará a modo de vista = «Día», esto podemos cancelarlo y mostrar una ventana personalizada con los eventos del día, los eventos del día los podemos recuperar con GetEventsFromDay.
EventChangeDate: Este evento se dispara cuando el usuario hace drag & drop o cambia el tamaño del evento con el mouse. es útil para almacenar en la base de datos las nuevas fechas.
EventMouseEnter: Cuando el mouse entra sobre un evento.
EventMouseLeave: Cuando el mouse sale por encima del evento.
EventClick: Click en un evento.
PreDateChange: Antes de que el usuario pagine hacia otra fecha, aquí podemos cancelarlo.
PreEventChangeDate: Antes que el usuario cambie los datos de un evento con del drag & drop o el mouse, este evento es muy útil para impedir arrastrar eventos en ciertas fechas u horas en los que no queremos que se agregue un evento.


Actualización 16/05/2022:

  • En el ejemplo con SQLite se corrigió los tipos de campos de la base de datos
  • se almacenaron las variables booleanas como 1 y 0 para no tener conflictos en idiomas no español.
  • En los campos fechas se convirtió a formato Unix para que el ejemplo corra bien con cualquier configuración regional.

Actualización 13/05/2024:

  • Se añadió la propiedad StartCalendar para indicar el horario de comienzo del calendarito.
  • Se añadió la propiedad EndCalendar para indicar el horario de finalización del calendarito.
  • Se añadió la propiedad CalendarInterval para indicar las divisiones del calendario, por ejemplo cada 10, 15, 20 o 30 minutos, en este punto utilizar intervalos que la suma den 60 minutos

Un usuario @SearchingDataOnly de vbForum sugirió esta versión de RC6 para SQLite si alguien le interesa puede descargarlo aquí (primer post)

  25 Responses to “ucCalendar (Calendario de eventos)”

  1. Excelente control estimado… MUCHAS GRACIAS, voy a checarlo

  2. Hola Leandro muy buen control.
    en el siguiente enlace usan la libreria j3cnn con un modulo sin tener que registrar.

    un saludo sigue asi campeon

    • Thanks yokesee, from that site I used the j3cnn.dll, I don’t understand much what the moudlo was used for, I will ask in privately to elihu (author)

  3. not support persian calendar too (shamsi date )?!!!

    • I’m sorry, I had never heard about the Persian calendar, I am ignorant on the subject, I would not know how to do it.

  4. buen dia.. excelente ocx era lo que buscaba como puedo modificar los bloque de hora gracias

    • con la funcion UpdateEventData, los datos existentes previamente los podes recuperar con GetEventData

      • disculpa mi falta de conocimiento pero no he logrado ver como hacerle esa modificacion. ya le hice que no pueda crear un evento anterior a la fecha actual y si esta en la fecha actual no pueda crear un evento en una hora anterior a la hora actual

        • haber te doy un ejemplo, en este ejemplo cuando le hagas click izquierdo el evento pasara una hora mas tarde cambiara su color y su titulo.

          https://paste.ofcode.org/3bjwdfv8xSeVAHhNsMGZ3cQ

          Nota al margen: acabo de notar que los parámetros de UpdateEventData tienen que ser todos obligatorios no esta funcionando como quería, ya en la próxima update hare algún cambio.

  5. Podrían por favor traducir con base datos mysql o quiza con acces. Esta muy interesante el calendario de eventos

    • Hola Ronald, solo tienes que cambiar la conexión después las sentencias sql son las mismas, yo no soy experto en el tema no manejo MySQL y tampoco acces, sino subiría un ejemplo.

      • Logre modificar el control con base de datos mysql, de todas maneras gracias por el control, ahora programaré un pequeño software para reserva de canchas deportivas.

  6. Primero felicitarte por el ejemplo, es impresionante. La pregunta es… ¿se puede indicar que la agenda empiece y termine en las horas seleccionadas?. Por ejemplo de 09:00 a 21:00 y que no muestre el resto de horas. Gracias

    • Buen control Leandro. La misma pregunta que juanma. ¿donde indicar que la agenda empiece y termine en las horas seleccionadas?. gracias

  7. Buen control Leandro. La misma pregunta que juanma. ¿donde indicar que la agenda empiece y termine en las horas seleccionadas?. gracias

    • Hola por momento no implemente eso, pero si se puede evitar crear fechas horarios no deseados o impedir arrastrar en esos horarios. tambien se puede colorear los horarios que no se puede utilizar. dentro de los ejemplos se puede ver esto.

      • Hola Leandro, una pregunta para tu asesoramiento…. en que parte del codigo se puede indicar que en vez de partir una hora de la agenda en 2 bloques (30 minutos), se pueda hacer en 4 bloques (15 minutos). Gracias por tus ejemplos y dedicación.

  8. Buenos dias, quisera complementar esto en un formulrio que estoy trabajando en visual studio 2017
    Como podria ahcerlo

  9. No descarga el archivo

  10. En windows 11, Pide mscomctl.ocx, cual version es y cuanto pesa, seria de gran ayuda , muchas gracias

  11. Hola Leandro,gracias por el control, en que parte del codigo se puede indicar que en vez de partir una hora de la agenda en 2 bloques (30 minutos), se pueda hacer en 4 bloques (15 minutos), o 6 de 10 cada uno.

    • Hola Vilma vuelve a descargar el control, he actualizado algunos cambios donde puedes cambiar la propiedad CalendarInterval, fijate dentro del ejemplo que esta en Basic2

  12. que hermoso trabajo.
    ¿Hay alguien que pueda convertir o hacer lo mismo en VFP?

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)