admin

Sep 282021
 

Un nuevo UserControl u ocx (para quienes quieran compilarlo), tal como su nombre lo indica es una Grilla. Si bien ya hay algunas dando vuelta y muy buenas por cierto, en este caso intenté buscarle un lado más moderno, nunca había utilzado este control así que me fui basando en las diferentes opciones que hay por la web, tanto las de vb6 (LynxGrid, IGrid, VBFlexGrid) como las de uso web por ejemplo ComponentOne y DevExpress. Este control me llevó mucho tiempo ya que son muchas líneas de código, como siempre no he realizado ningún archivo de ayuda, pero dentro de los ejemplos encontrarán algunos ejemplos muy funcionales en tiempo real. Al ser un control con muchas opciones seguramente se me habrán escapado muchas cosas, las cuales podré ir agregando o corrigiendo si me lo hacen saber, algo que no pude hacer en esta grilla fue implementar la funcionalidad MergedCell (celdas combinadas), pero el resto creo está casi todo.

Un problema que encontré tarde fue que por cuestiones estéticas utilicé otro use sercontrol «ucScrollBar» tal como ya lo había hecho en el ucList, pero no había notado que si se cambia el nombre del proyecto el ucScrollBar pierde la referencia y se convierte en un PictureBox, para que esto no pase es necesario abrir el ucGridPlus con el notepad y cambiar «Proyecto1» por el nombre del proyecto en que lo vayan a emplear, de momento no encontré una mejor solución.

El control puede cargar imágenes de muchas formas y formatos tanto ColImgListAddImage y HeaderImgListAddImage pueden cargar la imagen desde array de bits, archivo, url, url base64, hbitmap, hIcon y stream; las imágenes pueden tratarse como vectores donde podemos asignarle el color según el forecolor de la celda o podemos poner imágenes comunes, también cuenta con dar una propiedad «radio» para dar forma circular o con puntas redondeadas.

En el primer ejemplo encontrarán algunos gráficos, Progresos y ranking que se muestran en cada fila, en esos ejemplos utilicé un módulo externo para usar un CustomDraw, esto con el conocimiento adecuando se pueden hacer infinitas cosas. No es parte de la grilla en si, de este modo es más fácil para hacer cosas a necesidad de cada uno.

En el caso de los controles, es lo mismo, no son parte de la grilla, el ucGridPlus es un contendor, donde podemos poner Combobox, Datepiker entre otros y con algunas propiedades de este podemos ubicar dichos controles sobre la celda simulando que forman parte de ella.

La grilla cuenta con la posibilidad de agregar eventos a las imágenes y texto de la celda, de esta forma se pueden lograr algunos lindos efectos como verán en los ejemplos.

Es necesario tener instalada la fuente «Segoe MDL2 Assets» en windows 10 ya está por defecto, esta se utilizo para algunos iconos.

Para la vercion compilada (OCX) utilice el control de usuario UniTextBox para que acepte caracteres unicodes en modo de edición.

Para cerrar quiero aclarar que esto por momento es algo así como una beta y hasta que no se use y se encuentren errores no los podré detectar, sé que muchas cosas me quedaron en el tintero pero por ahora se me agotó la energía.

A continuación una tabla de propiedades, Rutinas y funciones del ucGridPlus

ucGridPlus0.png ucGridPlus2.png ucGridPlus3.png ucGridPlus5.png ucGridPlus6.png ucGridPlus9.png ucGridPlus11.png ucGridPlus12.png

A continuación una tabla de sus propiedades.

AllowColumnDrag ColLabelsEvents HeaderLinesVerticalWidth
AllowColumnSort ColLeft HeaderTextAlign
AllowEdit ColMinWidth InsertRow
AutoHeightAllRows ColMoveTo LastRowIsFooter
AutoHeightRow ColRef LinesHorizontalColor
AutoWidthAllColumns ColsCount LinesHorizontalWidth
AutoWidthColumn ColSort LinesVerticalColor
BackColor ColSortOrder LinesVerticalWidth
BackColorAlt ColTag ParentBackColor
BorderColor ColTextHidde Redraw
BorderRadius ColumnsAutoFit RowAlign
BorderVisible ColumnText RowBackColor
CellAlign ColUserResizeLocked RowChecked
CellBackColor ColWidth RowDelete
CellEditionLocked ColWordBreak RowFont
CellFont CurCol RowForeColor
CellForeColor CurRow RowHeight
CellImageIndex EnsureCellVisible RowHidden
CellStartEdit FillFromRS RowIdent
CellTag FixedColumns RowIsFullRow
CellValue FixedRows RowIsGroup
CellWordBreak Font RowMoveTo
CheckStyle GetCellRect RowRef
ChrW2 GetHotCell RowsBackColor
Clear GetSelectionRange RowsBackColorAlt
ColFont GetWindowsDPI RowsCount
ColForeColor GroupByColumn RowSelectorBkColor
ColFormat GroupColapse RowSelectorWidth
ColHeaderForeColor GroupExpand RowTag
ColHeaderImgIndex HeaderBackColor RowWordBreak
ColHidden HeaderFont ScrollBarStyle
ColImageListCount HeaderHeight SelectionColor
ColImagesEvents HeaderImageAlign SelectionMode
ColImgAlign HeaderImgListAddImage SetCurCell
ColImgListAddImage HeaderImgListClear SetMargin
ColImgListClear HeaderImgListCount SetSelectionRange
ColImgListHeight HeaderImgListHeight ShowHotRow
ColImgListRemoveImage HeaderImgListRemoveImage Sort
ColImgListWidth HeaderImgListWidth SwapCol
ColImgMonocrome HeaderInitImgList SwapRow
ColInitImgList HeaderLinesHorizontalWidth UnGroup

Descargar UserControl y Ejemplos

Descargar OCX


Historial de cambios

29/09/21 V:1.0.1
Solucionado ordenamiento de columna, solo se realizara con el botón izquierdo, no se ordenará cuando la columna es arrastrada.
Solucionado cuando se cambiaba el tamaña de una fila, el scrollbar no mostraba las ultimas filas.
Solucionado error al ordenar columna con la grilla no sin filas.

01/10/21 V:1.0.2 ‘Gracias Elihu!!
Solucionado Error visual si el valor del scroll era mayor al Máximo, también se agrego una llamada directa dentro del Scroll que causaba un un retardo a causa del timerVB
La selección ahora se puede realizar con el botón derecho, si se hace click derecho dentro del rango selecionado la selección no se pierde, especial para un PopUpMenu.
Se agrego parámetros ‘Button’, ‘Shift’ en los eventos CellClick, LabelMouseDown, LabelMouseUp, ImgMouseDown, ImgMouseUp
se agrego la propiedad BorderWidth y se quito la propiedad BorderVisible, también se corrigió un error en el color del borde.
Se añadió la propiedad ShowHotColumn (para resaltar las columna debajo del cursor)
En la versión OCX en el uniTextBox se corrigió detección de las flechas del teclado (NO IPAO)

11/10/2021 V:1.0.3
Se añadieron varios cambios y arreglos, no recuerdos todos
Se añadieron todas las propiedades y eventos referido a Drag & Drop
Se mejoro la lectura de imágenes para iconos y bitmaps de 32bits con canal alpha
Se mejoro la función AutoWidthColumn
Se añadieron las propiedades ColSort y ColSortOrder, para quienes tengan que ordenar las columnas por consultas SQL

15/11/2021 V:1.0.4
Cambios añadido por jpbro, comportamiento en el cuadro de texto al mover las flechas del teclado, y agregado evento BeforeEdit (Gracias)

Jul 072021
 

UserControl multi función el cual cumple con las funcionalidades de los controles ListBox, ComboBox, Lista Desplegable, Menú y Autocomplete de un TextBox. La novedad es que adiciona varios extras y cambios estéticos, como ser bordes redondeados, sombras, ítems personalizados, soporte para imágenes Png y estándares, a las imágenes se le puede aplicar esquinas redondeadas y cambios de colores para el caso de imágenes vectoriales (PNG), grupos de ítems, barras separadora, filtro y subtexto.

Para el caso del estilo ListBox los cambios de propiedades y adición de ítem no refrescan automáticamente, es necesario llamar a Update; esto es con la intención ganar la velocidad (aunque me quedó la duda si fue lo correcto haberlo hecho así)

Quizás hay muchas cosas que me gustaría aclarar pero por el momento sólo voy a dejar unos cuantos ejemplos donde podrán aprender a emplearlo fácilmente.

ucListPlus1.png ucListPlus2.png ucListPlus3.png ucListPlus4.png ucListPlus5.png

Actualizado: 05/08/2021 (corrección en algunas fallas de la sombra en ventanas padres)

Jun 212021
 

Como su nombre en inglés lo indica clase para sombras, un módulo que nos servirá para implementar sombras a nuestro formulario y controles, esta clase fue realizada con fines para otro control que compartiré más adelante, pero decidí publicarlos por separado para que sea más fácil de entender el uso de cada uno. Como verán en la imagen, además de la sombra da una forma redondeada a los controles y formularios, esto coincide justamente con la nueva interfaz de Windows 11, pero en realidad la idea es copiar a los diseños que vemos en HTML y CSS con Bootstrap, si bien a primera vista parece lo que se hizo con el LabelPlus, esto es algo diferente y mucho más rápido para este propósito.

Técnicamente su funcionamiento se divide en dos: para ventanas hijas y ventanas padres. En el caso de las ventanas hijas crea otra ventana que copia el color de fondo de la ventana contenedora, dibuja la sombra, borde y la misma se sitúa debajo del control que queremos aplicar dicho estilo. Si tuviéramos un fondo degradado o con una imagen el efecto quedaría mal ya que esta ventana no es transparente, sólo simula serlo (si bien es posible hacerla transparente, es más costoso en memoria, por lo cual decidí dejarlo así). En el caso de las ventas padres también se crea una ventana con el estilo WS_EX_LAYERED y contiene un DIB con la imagen de la sombra, bordes y se sitúa por detrás de la ventana en cuestión. En este último caso la ventana tiene transparencia.

La función principal que inicia todo es «ShowBorders», su primer parámetro es el hwnd de la ventana a aplicar los bordes y sombras, el segundo parámetro boolean es si esta ventana es hija (control) o Padre(Formulario) .

Traté de subclasificar lo menos posible, sólo WM_PAINT en ventanas hijas y WM_MOVE en ventanas padres por lo que si se ocultara el control queda en mano del programador llamar a la función «HideBorders» para ocultar la sombra, lo mismo cuando se cambie el tamaño del control u otras, es necesario llamar a «Refresh». Mirando los ejemplos se podrá entender mejor su funcionamiento, por el momento funcionará así, más adelante de ser necesario haré algunos cambios.

ClsShadow1.png ClsShadow2.png

Actualizado: 05/08/2021 (corrección en algunas fallas de la sombra en ventanas padres)

May 262021
 

Dos juegos realizados en Excel. El primero es juego que lo vi realizado con tablitas de madera y me dio ganas de hacerlo en Excel, la verdad si bien me dio trabajo programarlo es más difícil lograr el objetivo del juego, en YouTube hay un par de tutoriales pero eso seria como ir derecho a la trampa, así que les dejo este desafío para pasar el rato (yo no logré resolverlo)

El objetivo del juego es bajar la ficha naranja en la parte inferior tal como muestra el cuadro de solución, las piezas se mueven con el mouse.

TRABADO2.png

El segundo lo copie de un juego del móvil, no esta completo, tiene solo algunos niveles, pero fue mas que nada para sacarme las ganas de hacerlo.

En este el objetivo es armar el bloque superior con las partes inferiores, un rompecabezas por así decirlo.

Triangle.png
May 082021
 

Otro proyecto del baúl de los recuerdos, con muchas actualizaciones. Se trata de un módulo para obtener las contraseñas guardadas por los navegadores web, si bien hay un rejunte de código de diferentes autores el que más puedo citar es «Cobein» quien fue el creador de la base de este módulo. Ahora bien esto fue mucho tiempo atrás y muchos métodos de encriptación han cambiado desde entonces, por lo que hubo que actualizar gran parte para que siga funcionando. Tiene soporte para los 5 navegadores mas utilizados en el mercado:

  • Google Crome
  • Microsoft Edge
  • Firefox
  • Opera
  • Internet Explorer

Además también puede obtener el historial de navegación, ahora si preguntan que utilidad tiene esto, pues puede ser útil para exportar contraseñas a un pendrive, para alguna auditoria de navegación mediante su historial (naa mentira es para hacking), yo lo tomo como un juego a encontrar el como descifrar el acertijo.

En cuanto a lo técnico, utiliza sqlite3.dll. Todos menos Internet Explorer almacenan sus contraseñas en esas bases de datos, Firefox con el paso de los tiempos migró a JSON, un dato curioso que al menos a mi me sorprendió tanto Chrome, Ms Edge y Opera utilizan Blink por lo que me vale decir son los tres iguales, todos almacenan sus contraseñas de la misma forma y con la misma encriptación, misma estructura, mismo historial, sólo cambian las ubicaciones y nombres de las BD pero es la misma metodología.

La mayor bronca que me quedó es que no pude encontrar la forma posta de descifrar cómo lo hace Firefox realmente, el método que se utilizó en este caso es haciendo una llamada a una dll del mismo FF pero el problema es que en sistemas de x64 bits no funciona debido a que nuestro querido VB6 es de x32, pero bien hay mucha información de cómo descifrar mediante los métodos de encriptación que utiliza, sólo que ya no me da el cuero para tanto, si les interesa aquí está toda la información.

Para Internet Explorer puse un módulo aparte y el módulo del historial ni lo incluí en el proyecto ya que hoy en día el historial se borra ni bien se cierran IE y bien como ya es de conocimiento público este ha pasado a mejor vida.

Agradecimiento especial a wqweto

Password Revealer1.png Password Revealer2.png
Abr 242021
 

En este caso se trata de una aplicación que hace tiempo venía trabajando y quedó en el baúl de los proyectos olvidados. Es un descargador de videos de varias plataformas como:

  • YouTube
  • Facebook
  • Instagram
  • Dailymotion
  • Vimeo
  • Tiktok (por el momento no funciona)

Además de descargar el video, también podemos convertirlo a audio (.MP3) donde según el titulo del video, si este es una canción busca automáticamente las etiquetas Titulo, Autor, etc etc y las inserta dentro del mp3 como así también su imagen de portada, sólo que ésta es la que vemos en la previa del video.

En el caso de los videos también se pueden descargar o insertar dentro del video los subtítulos, si es que los tiene. La aplicación está pensada especialmente para descargar «listas de reproducción» de YouTube, donde podemos descargar muchos videos simultáneos.

Su funcionamiento es sencillo, sólo tienen que copiar el link del video, puede ser la url que está en la barra de navegación o en alguna parte del menú según la plataforma puede decir «copiar link», «compartir» etc etc. y luego lo pegan en la aplicación.

En cuanto a la programación lo voy a dejar con muchas cosas pendientes, por el momento perdí interés en este proyecto, aclaro que es muy muy complicado de entender o depurar ya que al ser asíncrono es una telaraña que va y viene. Si bien traté de utilizar Apis documentadas y Apis indocumentadas, en algunos casos YouTube especialmente en lo que es música, codifica sus link de video y no logré decodificar este algoritmo, por lo que recurrí al uso del control webbrowser para que haga el trabajo y mediante JavaScript obtener este link decodificado. Ahora bien como el webbrowser tiene algunos cuelgues y no quería que interfiriera con el UI de la aplicación después de varios intentos lo mejor que conseguí es ponerlo en otro ejecutable «YTBrowser.exe» y manejarlo como una aplicación de consola para que no ralentice la app principal, además en el caso de Instagram es necesario loguearse para poder obtener los link así que se muestra el webbrowser con la página de login de Instagram. También se utilizó otra aplicación de consola «FFMPEG» para la conversión de mp4 a mp3 e inserción de subtítulos a los videos.

No sé cuánto pueda durar funcionando esta app sin actualizaciones ya que todas las plataformas cambian constantemente, como ser el caso de TikTok que mientras lo programaba ya había cambiado sus link y paso a codificarlos, pero esta vez de una forma mucho más compleja que por momento no supe cómo resolver.

Así que espero que la disfruten mientras dura.

VideoDownloader.png VideoDownloader2.png
Mar 222021
 

Este es el reproductor musical que había mencionando en el post anterior
donde se mostraba cómo implementar el diseño Neomorfismo (Neumorphism Design) en vb6, en este proyecto se aplicó un ejemplo funcional del mismo. El diseño en si esta copiado de esta imágen.

Para el motor de reproducción se utilizó bass.dll y uno de sus complementos bass_fx.dll muy recomendable echarle una mirada a toda esta suite de librerías que cuentan con ejemplos para vb6.

Si bien al principio iba a hacer algo sencillo después se me dió por hacer algo bien completo donde se implementaron algunas características como: leer desde una lista de reproducción, líneas de comando, arrastrar y soltar, editor de etiquetas, ecualizador, display animado, vista previa en la barra de tareas, manejo con teclado y bueno seguramente muchas muchas cosas me estarán faltando, lo cual algunas podré agregar más adelante si me las sugieren.

En cuanto a la lista de reproducción no recomiendo cargar más de 300 canciones ya que la forma en que armé el control de lista es muy limitado porque utiliza controles en vez de métodos gráficos, pero bien creo que con 300 canciones es un número respetable.

La aplicación es 100% portable con soporte a Unicode

neumoplayer1.png neumoplayer2.png neumoplayer3.png neumoplayer4.png
Descargar Proyecto
Descargar Binario + un Mp3 de mi banda «Viento Rojo»