Oct 262023
 

Hola hay un problema con la descarga ya que el hosting cambio a SSL y por falta de experiencia cuando inicie en el blog utilice la url completa y luego copie y pegue del post anterior, asi que los links que comienzan con http:// no funcionan bajo https://, por lo tanto hasta que no los cambie manualmente no funcionaran.

 Posted by at 21:04
Ago 022023
 

ucVideo es un control de usuario que tenia encajonado hace ya unos años, este trabajaba con el IE-WebBrowser , asi que decidí desempolvarlo y migrarlo a WebView2. El fin del usercontrol es poder reproducir videos de YouTube, Dailymotion, MP4 y M3U8, utiliza la interfaz de Webview2-Binding (Edge-Chromium) mediante RC6.dll, tiene algunos arreglos de JavaScript y CSS. He incluido las DLL dependientes en la descarga, ubicadas en la carpeta BIN

ucVideo.png

Jun 302023
 

Este es un control de usuario que utiliza las APIs de Google Maps. Inicialmente, comencé a trabajar con el clásico WebBrowser, pero pensando en el futuro, decidí cambiar a WebView2, que utiliza el mismo motor que el navegador Chrome y sus derivados. Actualmente, estoy ejecutando WebView2 mediante el archivo RC6.dll. He incluido las DLL dependientes en la descarga, ubicadas en la carpeta BIN. En los ejemplos a continuación, también utilicé un OCX para algunos controles, pero no es necesario para utilizar ucMaps. Aunque los ejemplos detallan su uso, es recomendable tener conocimiento de esta API para aprovecharla al máximo. Esta API requiere una clave de API. El control trae una clave por defecto que es la mía, pero recomiendo registrar la suya para evitar el agotamiento de la cuota de uso si hay varios usuarios utilizando el control (existen planes gratuitos).

Esta API es extensa y cuenta con muchas funcionalidades. He incluido algunas de las más importantes, dejando otras para futuras actualizaciones. Sin embargo, dado cómo está diseñado, no es difícil implementar el resto, actualmente cuenta con casi 100 propiedades y funciones, he incluido un archivo de ayuda.

Este control no está a la venta, pero tampoco lo ofreceré como descarga directa. Aquellos que deseen obtener el control deberán realizar una donación primero, y luego se les enviará por correo electrónico. El alojamiento web es costoso, por lo que me veo obligado a hacer esto. De lo contrario, me veré obligado a cerrar el sitio.

ucMaps.png

En esta imagen se muestra como implementar un recorrido de clientes optimizando el ordenamiento de la ruta y también podemos obtener los kilómetros y la duración del recorrido

Para recibir el código de fuente primero debes hacer una donación

Jun 142023
 

Control de usuario para crear Odontograma, este es un trabajo que me habían encargado y voy a poner a la venta por si a alguien más le es de utilidad. Agradezco en este caso a Juan Manuel de Dios Pérez (Linares – España), por su contribución y orientación en el manejo del control.
Este control está orientado para los desarrolladores que estén trabajando en software de clínicas dentales, si aún no tiene su odontograma o desean modernizar el suyo pueden descargar este demo para probar el funcionamiento de dicho control.

El costo del control es de u$s 200 y su pago es mediante PayPal, para residentes en Argentina el costo es la mitad de precio (u$s 100) mediante transferencia bancaria, me envían un correo a leandroascierto@hotmail.com y coordinamos.

ucDentaChart.png

Mar 092023
 

Esta es una actualizacion del post anterior donde no había quedado conforme con la velocidad de el dibujado de dicho control, anteriormente estaba trabajando con GDI+ pero al este no utilizar aceleración por hardware el repintado se hacia muy lento, así que decidí intentarlo con Direct2D y el resultado fue deslumbrante para mi, me consto un poco entender esta nueva tecnología pero con ayuda de The trick , fafalone, baka y Frank Schüler pude lograr migrarlo, también he realizado otros mejoras visuales y funcionales.

Para poder utilizar Direct2D he recurrido a la librería Oleexp.tlb esta ya esta incluida en el .zip de descarga, para lo que no esta familiarizado con los archivos .tlb estos se compilan junto al ejecutable y no es necesario incluirlos en la instalación de la aplicación final, tengan en cuenta si cuando abren los ejemplos no se carga la librería tendrá que hacerlo manualmente desde el menú Proyectos/Referencias y luego dan al botón Examinar y buscan dicha librería junto a la carpeta ya descomprimida.

Para quienes estén trabajando con Windows 7, en los ejemplos utilizo la fuente «Segoe MDL2 Assets» para algunos iconos, dicha fuente no esta instalada por defecto en Windows 7, por lo tanto si quieren verla correctamente deberán descargarla e instalarla.

Feb 092023
 

Es un control de usuario para generar una galería o catálogo de productos donde podemos interactuar con imágenes, textos, links y controles. Para utilizar este control requiere conocimiento en dibujado de imágenes y texto, el control sólo ofrece una superficie donde se puede graficar, no es él quien lo hace, esto lo plantee de esta forma para que pueda ser totalmente personalizable, es necesario que se entienda el concepto antes de ponerlo en marcha, para los más experimentados es algo similar al OwnerDraw de los Listview.

El control ofrece tres tipos de vista:

Vista Galería: es donde se muestra una cuadrilla clásica de ítems.
Vista Deslizante: algo muy similar como podemos ver en Netflix o Prime video, donde los items se desplazan a la derecha o izquierda.
Vista de Lista: donde los ítems se acomodan uno debajo del otro.

He dejado algunos módulos donde facilitan cargas de imágenes y renderizado, como así con el texto y algunos ejemplos de simular controles sobre la lista.

No quedé muy conforme con su rendimiento, cuando el control es muy grande o el DPI es muy alto el control es lento en dibujarse. Hubiera sido mejor utilizar DirectDraw, pero mis conocimientos son muy limitados, así que opté por hacerlo con GDI y GDI+.

Como yapa hay un ocx que es lo último en lo que estuve trabajando, una suite con algunos de los controles aquí publicados, espero poder darme un tiempo en publicarlo con ejemplos.

ucGallery1.png
ucGallery2.png
ucGallery3.png
ucGallery4.png

Atención: Te recomiendo que no usar esta versión, mira esta actualización la cual esta mucho mas optimizada y es la que voy a mantener actualizada.

 Posted by at 0:23
Ene 192023
 

En este caso es un módulo para automatizar el envío de mensajes por WhatsApp con archivos adjuntos, utiliza una técnica de automatización de teclado y mouse, donde realiza el envío utilizando el navegador predeterminado con el uso del api web.whatsapp.com (aclaro esto No es mediante WhatsApp Business API).

Es necesario en el navegador predeterminado tener previamente vinculado web.whatsapp.com al número de teléfono con el que se quiere enviar los mensajes, una vez hecho esto puede probar el ejemplo que les comparto, este método al ser automatizado no da la posibilidad de tener una confirmación si el mensaje fue enviado con éxito, tengamos en cuenta que si internet no está funcionando bien, el mensaje quedaría en cola.

De momento cada mensaje que se envía deja una pestaña abierta en el navegador, si bien se puede cerrar automatizando algunas combinaciones de teclas, esto no es una práctica segura ya que el mensaje aún podría estar en su proceso de envío, especialmente con adjuntos grandes o mala conexión de internet.

Tiene como dependencia únicamente para ide la librería oleexp.tlb, la cual está adjunta en el ejemplo, esta librería no es necesaria distribuirla en la instalación, una vez compilado ya no es necesaria.

Para usuarios de VBA, quizás pueda servirles modificando las apis y algunos ajustes más, no lo he podido testear.

Actualización: Se ha implementado el uso del Desktop WhatsApp, con esta opcion los envíos son muchos mas rápidos, si la aplicación no esta abierta, el tiempo de envío es igual al del navegador pero si la aplicación se encuentra corriendo, el proceso de envío es instantáneo.

Un detalle a tener en cuenta si se tiene el IDE de vb6 elevado con derecho de administrador no funcionara el adjunto de archivos, lo mismo si el ejecutable compilado corre con derecho de administrador, es decir tanto Desktop WhatsApp como nuestra aplicación deben tener los mismos privilegios.

Ultima Actualización 20/09/2023

WhatsApp version: 2.2336.7.0

Nov 102022
 

Este es un control del amigo Javier (más conocido en el ambiente como Eduardo), quien ha compartido con nosotros este hermoso control Tab, con muchas opciones personalizables, les dejo a continuación su descripción:

Transiciones suaves de pestañas.
Iconos de fuentes (gracias Shagratt ).
Pestaña arrastrando a otra posición (ver propiedad CanReorderTabs).
Modo de interfaz de documento con pestañas (consulte la propiedad TDIMode).

Dado que ahora tiene muchas propiedades, es difícil recordar cómo configurar algo específico que nos guste, por lo que presenta la función de «Temas». Los temas son preajustes de propiedades que definen principalmente la apariencia, pero también algo de comportamiento.
Se pueden almacenar como un archivo, opcionalmente en el registro y en las propiedades del control. Ofrece varios temas de forma predeterminada, pero puede agregar los suyos propios.
Hay una propiedad de Temas que expone la colección de Temas y una propiedad de Tema donde puede establecer uno por su nombre.

Documentación en línea .

Descargar desde GitHub

Descargar desde GitHub

Jun 012022
 

En este caso comparto un excelente control DatePicker realizado por el amigo José Liza. Dicho control es un calendario con muchas opciones de personalización y se mantiene en una línea de controles modernos tal como vemos en html.

Dejo aquí la descarga del control y un ejemplo desde su GitHub https://github.com/JoseMLiza/ucJLDatePicker

Cualquier duda o consulta sobre su uso o configuración pueden realizarla en el foro.

Por mi parte voy a compartir un ejemplo utilizando el control combinado con el calendario de eventos.

ucJLDatePicker.png
May 292022
 

Al parecer había un problema en el registro del foro, creo que esto viene de un año atrás, estaba fallando el envió del email de comprobación. Por el momento no pude solucionarlo, pero eliminé dicho requerimiento, así que los que no pudieron registrarse ya pueden hacerlo.

 Posted by at 21:18
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.

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

Abr 182022
 

Para esta ocasión un control de texto personalizable con varias opciones y diseño, también un multifunción ya que tiene distintos tipos de entrada, intenta sobre todo un aspecto al que solemos ver en html5/Bootstrap etc.

ucText1.png

El tipo de entrada lo podemos seleccionar mediante su propiedad «InputType»

[IT_Text] = 0 '// Texto normal
[IT_Numeric] = 1 '// Solo Números
[IT_Date] = 2 '// Solo Fecha
[IT_Time] = 3 '// Solo Hora
[IT_PasswordChar] = 4 '// Entrada de tipo Contraseña
[IT_MultiLine] = 5 '// Entrada de tipo Multilínea
[IT_Desimal] = 6 '// Numero decimales
[IT_LettersOnly] = 7 '// Solo letras
[IT_DropDown] = 8 '//Para que el control sea de lectura y al presionarlo llame el evento "DropDown" y pueda desplegar una lista (simulación de un ComboBox DropList style)

Luego tenemos la propiedad «RightButtonStyle» que es para elegir como queremos que se visualice la parte derecha del control, con las siguientes opciones

[RS_None] = 0 '// Ninguna el control lizo
[RS_Resizable] = 1 '// opcion utilizada en texto multilínea para expandir su tamaño
[RS_Icon] = 2 '// muestra el icono asignado
[RS_SpinButton] = 3 '// en tipos de entrada numéricos/fecha/hora poder cambiar su valor mediantes botoncitos mas/menos
[RS_ClearText] = 4 '// Una cruz a la derecha para borrar el contenido del textbox
[RS_ShowPassword] = 5 '//un icono que al presionarlo muestra la contraseña en el tipo de entrada contraseña
[RS_DropDown] = 6 '// un icono flecha abajo que al presionarlo llama el evento "DropDown" para mostrar una lista.

ucText2.png

Una descripción rápida de sus propiedades:

BackColor: Color de fondo
BackColorOnFocus: Corlo de fondo cuando el control toma el foco
BordeColor: color del borde.
BordeColorOnFocus: color de borde cuando el control toma el foco.
BordeRadius: para ajustar las esquinas redondeadas.
BordeStyle: enumeración; sin borde, borde normal, solo una línea inferior.
BordeWidth: ancho del borde.
ButtonGradient: los botones de los laterales se mostrarán con un pequeño degradado de su color hacia el blanco.
Caption: agrega una etiqueta en la parte superior izquierda (aconsejo usar fuentes escalables).
CueBanner: agrega una descripción en gris cuando el control está vacío.
EditGradient: muestra un degradado en la parte editable o donde tipeamos.
HotBorder: cuando se pasa el control sobre el control, el borde se resalta mezclando el color de borde normal y el del foco.
ImgLeftFillColor: si ImageFillStyle es igual a FS_Solid muestra el color seleccionado.
ImgLeftFillStyle: si se quiere mostrar el color ImageLeftFillColor o dejar el mismo color del backcolor.
ImgLeftShowMouseEvents, si se quiere o no mostrar una animación de botón al pasar el mouse en la parte izquierda.
ImgLeftSize: Tamaños del cuadrado de la imagen seleccionada (la imagen se selecciona mediante click derecho – Propiedades).
ImgRightFillColor: (Lo mismo que ImgLeftFillColor pero a la derecha).
ImgRightFillStyle: (Lo mismo que ImgLeftFillStyle pero a la derecha).
ImgRightShowMouseEvents: (Lo mismo que ImgLeftShowMouseEvents pero a la derecha).
ImgRightSize: (Lo mismo que ImgLeftSize pero a la derecha).
InputType: tipo de entrada (las detalle mas arriba).
MaxValue: para establecer un valor máximo en los tipos de entrada Número/Fecha/Hora (no aplica en tipo decimal).
MinValue: para establecer un valor mínimo en lo los tipo de entrada Número/Fecha/Hora (no aplica en tipo decimal).
OnFocusBigBorder: un borde grueso que se muestra al tomar el foco (no quise usar el shadow clásico).
OnFocusSellAll: se auto selecciona el contenido al tomar foco el control.
OnKeyReturnTabulate: si se presiona Enter tabula hacia el próximo control.
ParentBackColor: es el color del fondo del contendedor, este se asigna automáticamente al agregar el control al formulario pero en caso que éste cambie hay que cambiarlo en el control, es para que en las esquinas redondeadas no se vea ese color.
RightButtonStyle: es la apariencia del botón derecho (las detallé más arriba).
ShortDateFormat: formato de fecha corto, si esta propiedad esta vacía, toma el formato del sistema (recomiendo DD/MM/YYYY).
TextConvert: convierte el texto en; Normal, Minúscula, Mayúscula



Para elegir las imágenes click derecho sobre el control y dentro del menú seleccionar «Propiedades», o bien dentro de la ventana de propiedades en la propiedad, «Personalizado», también dentro de esa página de propiedades se puede poner el texto multilínea y/o texto Unicode.


Funciones:

ShowBalloonTip: muestra un globo de texto sobre el control (requiere manifest).
HideBalloonTip: oculta del globo de texto.
ScrollToBottom: scrolea hacia la última línea de texto (en tipo de entrada multilínea).
SetMinSize: asigna un tamaño mínimo del control, puede ajustarse por el usuario cuando este es RightButtonStyle = RS_Resizable.
SetMaxSize: asigna un tamaño máximo del control, puede ajustarse por el usuario cuando este es RightButtonStyle = RS_Resizable.

Si bien el control lo testee varias veces es muy probable que tenga algunos bugs, sobre todo en la parte de formatos de fecha.

Vale aclarar que algunas funciones y propiedades fueron tomadas del control TextBox de Krool y modificadas a necesidad.

El ucText.ctl debe acompañarse con el mIOleInPlaceActivate.bas y PropertyPage1.pag (este ultimo solo si se quiere usar imágenes en modo de diseño), los demás son opcionales según su uso.

Cualquier error reportarlo aquí en los comentarios.