{"id":1158,"date":"2022-05-14T12:30:42","date_gmt":"2022-05-14T15:30:42","guid":{"rendered":"http:\/\/leandroascierto.com\/blog\/?p=1158"},"modified":"2024-05-13T18:55:17","modified_gmt":"2024-05-13T21:55:17","slug":"uccalendar-calendario-de-eventos","status":"publish","type":"post","link":"https:\/\/leandroascierto.com\/blog\/uccalendar-calendario-de-eventos\/","title":{"rendered":"ucCalendar (Calendario de eventos)"},"content":{"rendered":"\n<p>Este proyecto lo hab\u00eda comenzado un par de a\u00f1os atr\u00e1s luego lo abandon\u00e9, as\u00ed que me decid\u00ed a retomarlo, si tendr\u00eda que comenzarlo de cero hoy cambiaria muchas cosas ya que no son las m\u00e1s \u00f3ptimas, pero esto no impide que el calendario funcione bien.<\/p>\n\n\n\n<p>Ahora bien el control se trata de un calendario al cual podemos a\u00f1adir 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\u00e1fica intervalos de fecha.<\/p>\n\n\n\n<p>El control tiene soporte para hacer drag &amp; drop de los eventos, tal como poder modificar con el mouse su rango de fecha, si presionamos la tecla Ctrl y hacemos drag &amp; drop duplica este evento.<\/p>\n\n\n\n<p>Luego la parte de entrada de datos queda a cargo del programador, en los ejemplos agregu\u00e9 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 \u00faltimo puedo dar una gu\u00eda de c\u00f3mo hacerlo.<\/p>\n\n\n\n<p>Dentro de los ejemplos en la carpeta \u00abAdvance\u00bb encontrar\u00e1n un ejemplo enlazando el calendario a una base de datos de SQLite, deber\u00e1n agregar a la referencia a la dll J3cnn.dll<\/p>\n\n\n\n<p>Los eventos del calendario no se manejan por \u00edndice sino por keys esto porque internamente \u00e9stos son ordenados por fecha y de esta forma se pierde el \u00edndice (esto no gust\u00f3 mucho c\u00f3mo lo encar\u00e9 de un principio).<\/p>\n\n\n\n<p>El control no tiene ninguna dependencia, inclusive los iconos son pintados con l\u00edneas.<\/p>\n\n\n\n<p>La rueda del scrollbar funciona correctamente cuanto est\u00e1 compilado, esto lo hice as\u00ed ya que no utilic\u00e9  Safe subclass, para evitarme dolores de cabeza al programar lo deje as\u00ed, compilado funciona correctamente lo mismo para el evento MouseLeave. Si a alguien le es necesario que funcione en el ide puede quitar el \u00abIf App.LogMode Then\u00bb. <\/p>\n\n\n\n<p>Para ir cerrando s\u00e9 que hay muchas cosas que quedaron pendientes, me gustar\u00eda que comenten si habr\u00eda que implementar algo o corregir, tambi\u00e9n si ven alg\u00fan error; as\u00ed de esa manera me es m\u00e1s f\u00e1cil. En los primeros d\u00edas de subida seguramente lo est\u00e9 actualizando frecuentemente a medida que me informen o encuentren detalles.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/blog\/imagenes\/ucCalendar_Month.png\" alt=\"ucCalendar_Month.png\"><\/figure>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/blog\/imagenes\/ucCalendar_Week.png\" alt=\"ucCalendar_Week.png\"><\/figure>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/blog\/imagenes\/ucCalendar_Day.png\" alt=\"ucCalendar_Day.png\"><\/figure>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/blog\/imagenes\/ucCalendar_Year.png\" alt=\"ucCalendar_Year.png\"><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"ucCalendar (control de usuario de un calendario con eventos en vb6)\" width=\"695\" height=\"391\" src=\"https:\/\/www.youtube.com\/embed\/ZGe9XODwueA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>A continuaci\u00f3n un detalle r\u00e1pido de sus funciones y propiedades:<\/p>\n\n\n\n<p><strong>AddEvents<\/strong>: Funci\u00f3n principal para agregar eventos al calendario, par\u00e1metros requerido; sujeto (titulo descriptivo), fecha y hora de inicio, fecha y hora de finalizaci\u00f3n y color del evento, el resto de los par\u00e1metros son opcionales, valor de retorno una key del evento.<br><strong>CenterCalenarInNow<\/strong>: Mueve el scroll a la hora actual.<br><strong>Clear<\/strong>: Elimina todo los eventos.<br><strong>DateValue<\/strong>: Asigna o retorna la fecha actual del calendario.<br><strong>DayHaveEvents<\/strong>: Retorna True\/False si hay eventos en un d\u00eda especifico.<br><strong>DropDownColor<\/strong>: Cuando hay muchos eventos en un d\u00eda y en el modo de vista Mes hay m\u00e1s de los que se pueden mostrar, se muestra una barra desplegable la cual podemos cambiar el color con esta propiedad.<br><strong>EventsCount<\/strong>: Cantidad de eventos agregados.<br><strong>EventsRoundCorner<\/strong>: Propiedad booleana para mostrar o no esquinas redondeadas en eventos y botones.<br><strong>FirstDayOfWeek<\/strong>: Aqu\u00ed podemos asignar que d\u00eda queremos que se muestre como primer d\u00eda de la semana, por defecto usa el del sistema.<br><strong>GetAllEvents<\/strong>: Obtiene una colecci\u00f3n de las keys de los eventos agregados.<br><strong>GetEventData<\/strong>: Obtiene los datos de un evento, su primer par\u00e1metro es la key del evento la cual podemos obtenerla con GetAllEvents o por alg\u00fan evento, el resto de los par\u00e1metros son valores de retorno.<br><strong>GetEventsFromDay<\/strong>: Retorna una colecci\u00f3n de keys de los eventos de un d\u00eda en especifico,<br><strong>GetSelectionRangeDate<\/strong>: Funci\u00f3n para obtener el rango de fechas seleccionada.<br><strong>HeaderColor<\/strong>: Color de la cabecera y parte de la tem\u00e1tica.<br><strong>HiddeEvent<\/strong>: Oculta el evento, \u00fatil para filtrar.<br><strong>LinesColor<\/strong>: Color de las l\u00edneas.<br><strong>Redraw<\/strong>: Habilita o deshabilita el repintando del calendario, esto sirve para acelerar la carga de eventos.<br><strong>RemoveEvent<\/strong>: Elimina un evento.<br><strong>Refresh<\/strong>: Refresca el repintado calendario.<br><strong>SelectedEvent<\/strong>: Retorna el evento seleccionado.<br><strong>SelectionColor<\/strong>: Color de la selecci\u00f3n.<br><strong>SetStrLanguage<\/strong>: Aqui podemos pasar la traducci\u00f3n de las palabras utilizadas.<br><strong>ShowToolTipEvents<\/strong>: Si se quiere mostrar o no la ventana tooltip, esta se puede remplazar por otra personalizada y con informacion m\u00e1s detallada.  V\u00e9ase los eventos EventMouseEnter y EventMouseLeave.<br><strong>Update<\/strong>: Es m\u00e1s completo que refresh, este vuelve a reordenar por fecha y alfab\u00e9ticamente los evento, recalcula la posici\u00f3n y por \u00faltimo repinta todo.<br><strong>UpdateEventData<\/strong>: Funci\u00f3n para actualizar los datos de un evento. Debe pasarse la key del evento que queremos modificar.<br><strong>UserCanChangeDate<\/strong>: Habilita o deshabilita para que el usuario pueda cambiar la pagina actual del calendario.<br><strong>UserCanChangeEvents<\/strong>: Habilita o deshabilita si el usuario puede cambiar los eventos (mediante estiramiento o arrastre).<br><strong>UserCanChangeViewMode<\/strong>: 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.<br><strong>UserCanScrollMonth<\/strong>: En el modo de vista mes, se puede scrollear infinitamente si necesidad de cambiar de p\u00e1gina, esto s\u00f3lo si se habilita esta opcion.<br><strong>ViewMode<\/strong>: Cambia por c\u00f3digo en el modo de vista (Dia, Semana, Mes, A\u00f1o)<\/p>\n\n\n\n<p><strong>Eventos:<\/strong><\/p>\n\n\n\n<p><strong>DateBackColor<\/strong>: Al dispararse este evento podemos elegir seg\u00fan la fecha u hora el color de fondo de la celda, as\u00ed como tambi\u00e9n su HatchStyle.<br><strong>DateChange<\/strong>: Cuando el usuario cambia de p\u00e1gina el calendario se dispara este evento.<br><strong>DragNewEvent<\/strong>: Cuando el usuario tiene la presionada la tecla Control y hace drag &amp; drop el evento se duplica, o sea un nuevo evento es agregado por el usuario, con este evento somos informados y as\u00ed podremos guardar en la base de datos o como se lo est\u00e9 manejando.<br><strong>DropDownViewMore<\/strong>: Evento cuando se presiona el bot\u00f3n de ver m\u00e1s, este bot\u00f3n se encuentra en la vista \u00abMeses\u00bb, aparece cuando hay muchos eventos en un d\u00eda y no entran en la celda, al presionar este cambiar\u00e1 a modo de vista = \u00abD\u00eda\u00bb, esto podemos cancelarlo y mostrar una ventana personalizada con los eventos del d\u00eda, los eventos del d\u00eda los podemos recuperar con GetEventsFromDay.<br><strong>EventChangeDate<\/strong>: Este evento se dispara cuando el usuario hace drag &amp; drop o cambia el tama\u00f1o del evento con el mouse. es \u00fatil para almacenar en la base de datos las nuevas fechas.<br><strong>EventMouseEnter<\/strong>: Cuando el mouse entra sobre un evento.<br><strong>EventMouseLeave<\/strong>: Cuando el mouse sale por encima del evento.<br><strong>EventClick<\/strong>: Click en un evento.<br><strong>PreDateChange<\/strong>: Antes de que el usuario pagine hacia otra fecha, aqu\u00ed podemos cancelarlo.<br><strong>PreEventChangeDate<\/strong>: Antes que el usuario cambie los datos de un evento con del drag &amp; drop o el mouse, este evento es muy \u00fatil para impedir arrastrar eventos en ciertas fechas u horas en los que no queremos que se agregue un evento.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p><strong>Actualizaci\u00f3n 16\/05\/2022: <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>En el ejemplo con SQLite se corrigi\u00f3 los tipos de campos de la base de datos<\/li>\n\n\n\n<li>se almacenaron las variables booleanas como 1 y 0 para no tener conflictos en idiomas no espa\u00f1ol.<\/li>\n\n\n\n<li>En los campos fechas se convirti\u00f3 a formato Unix para que el ejemplo corra bien con cualquier configuraci\u00f3n regional.<\/li>\n<\/ul>\n\n\n\n<p><strong>Actualizaci\u00f3n 13\/05\/2024: <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se a\u00f1adi\u00f3 la propiedad <strong>StartCalendar<\/strong>  para indicar el horario de comienzo del calendarito.<\/li>\n\n\n\n<li>Se a\u00f1adi\u00f3 la propiedad <strong>EndCalendar  <\/strong>para indicar el horario de finalizaci\u00f3n del calendarito.<\/li>\n\n\n\n<li>Se a\u00f1adi\u00f3 la propiedad <strong>CalendarInterval <\/strong>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 <\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\">\n<a href=\"https:\/\/leandroascierto.com\/blog\/descarga.php?url=ucControlCalendar.zip\"><img decoding=\"async\" src=\"https:\/\/leandroascierto.com\/blog\/descarga.php?file=ucControlCalendar.zip\" alt=\"\"><\/a>\n<\/figure>\n<\/div>\n\n\n\n<p>Un usuario @<a href=\"https:\/\/www.vbforums.com\/member.php?302223-SearchingDataOnly\"><strong>SearchingDataOnly<\/strong><\/a> de vbForum sugiri\u00f3 esta versi\u00f3n de RC6 para SQLite si alguien le interesa puede descargarlo <a href=\"https:\/\/www.vbforums.com\/showthread.php?896357-ucCalendar-(Events-calendar)\" data-type=\"URL\" data-id=\"https:\/\/www.vbforums.com\/showthread.php?896357-ucCalendar-(Events-calendar)\">aqu\u00ed (primer post)<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este proyecto lo hab\u00eda comenzado un par de a\u00f1os atr\u00e1s luego lo abandon\u00e9, as\u00ed que me decid\u00ed a retomarlo, si tendr\u00eda que comenzarlo de cero hoy cambiaria muchas cosas ya que no son las m\u00e1s \u00f3ptimas, pero esto no impide que el calendario funcione bien. Ahora bien el control se trata de un calendario al <a href='https:\/\/leandroascierto.com\/blog\/uccalendar-calendario-de-eventos\/' class='excerpt-more'>[&#8230;]<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,116],"tags":[208,205,207,206,167,69,18],"class_list":["post-1158","post","type-post","status-publish","format-standard","hentry","category-controles-de-usuarios","category-ocx","tag-calendario","tag-eventcalendar","tag-free","tag-gratis","tag-usercontrol","tag-vb6","tag-visual-basic","category-26-id","category-116-id","post-seq-1","post-parity-odd","meta-position-corners","fix"],"_links":{"self":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts\/1158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/comments?post=1158"}],"version-history":[{"count":12,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts\/1158\/revisions"}],"predecessor-version":[{"id":1371,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/posts\/1158\/revisions\/1371"}],"wp:attachment":[{"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/media?parent=1158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/categories?post=1158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/leandroascierto.com\/blog\/wp-json\/wp\/v2\/tags?post=1158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}