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.

  39 Responses to “ucText (custom TexBox Unicode)”

  1. Scrolling scrollbar will appear ghosting

    • If you are referring to the scrollbar of the textbox, it is possible to replace it with the ucScrollbar and have it look like Google’s, you can also make it appear when you enter the mouse and hide when you remove the mouse from the control, is that your question? If so, I can upload an example.

      https://www.youtube.com/watch?v=_smnOKDn9nk

  2. I mean fast scrolling scrollbar. The drawn text is ghosted.

    When I changed a computer, it worked fine again

    Gaining focus shows the scrollbar, losing focus hides the scrollbar, which is a good idea.

    thanks.

  3. HAI..LEANDRO MOHON BUAT PROJECT REPORT PDF

  4. HAI LEANDRO SAYA SELALU MENGIKUTI PROJECT BARU ANDA…SAYA DARI INDONESIA…SAYA SEKARANG LAGI BUAT PROJECT YANG REPORT NYA PDF DENGAN VB6 TETAPI SAYA TIDAK MENEMUKAN DI INTERNET SOURCODE YANG BAGUS…SAYA MOHON BANTUAN NYA DAPAT DI BUATKAN CONTOH NYA..TERIMA KASIH LEANDRO

  5. Excelente control Lea, muchas gracias por el y por todos los demás controles que vienes publicando

  6. Excelente control but not realy textbox unicode.
    Same problem like LabelPlus…
    I cannot type unicode text direct in ucText (switch language-keyboard layout to ROU and type unicode – not work) but when i copy unicode text in clipboard and then paste work very well….

    OS: Windows 10 Pro Version 21H2 – x64, language 1: english, keyboard: english(US keyboard), language 2: romanian, romanian(standard keyboard).

  7. Thanks, It works perfectly.
    By the way, I read on vbforums.com that someone can’t access the site http://leandroascierto.com.
    I have the same problem, I can only access it using TOR…but very, very slow
    Maybe it’s a DNS problem here in Europe…google find you but cant access site using Chrome,Firefox…

  8. …Can you modify LabelPlus (same problem, putting a unicode text at design time in IDE using properties page not work)
    Thank you again

  9. …error when compare date ShortDateFormat=dd.mm.yyyy
    see picture:
    https://www21.zippyshare.com/v/PIeYiprk/file.html

  10. Error in frmCalendar

    Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ...
    If m_Index = -2 Or m_Index = -3 Then 'Flecha abajo
    'xDate = DateAdd(IIF(Mode = 0, "m", "yyyy"), IIF(Mode = 3, 10, 1) * IIF(m_Index = 3, -1, 1), xDate) 'WRONG
    xDate = DateAdd(IIF(Mode = 0, "m", "yyyy"), IIF(Mode = 3, 10, 1) * IIF(m_Index = -3, -1, 1), xDate) 'CORRECT

    ...

    • Hi Cliv, as I understand your date separator is the point, in our case it is the «/»or in some cases «-» but if I use the «.» I have an error, and I really don’t know how to solve it

      this is a error 13 in my case
      PrivateSubForm_Load()
      MsgBox CDate(«12.06.2022»)
      End Sub
      I assume that with your local configuration this is not an error, is it?

    • Creo que el problema al que se referia es que al pulsar flecha abajo al no tener m_index=-3 el calendario avanzaba hacia adelante y no hacia a tras.

      Por cierto, magnifico control, como todos.

  11. Hola Leandro! Me parece magnifica tu aportación una vez más. El control funciona a las mil maravillas pero el .pag nos da problemas al intentar cargarlo en una aplicación ya existente.
    Haz hjacer clic en propiedades en un uctext cualquiera nos reporta que no encuentra los metodos del control, por ejmplo .setminsize .setmaxsize etc…

    El control en si funciona correctamente cuando cargamos además del .ctl el .ctx pero no podemos agregar imágenes.
    Si iniciamos un proyecto nuevo el .pag funciona correctamente.

    si tienes tiempo y pudieras orientarnos te lo agradeceríamos. Tus aportes dan un valor enorme a Vb6
    ¿Quién quiere Python? Jajaj

    • Hola Carlos, no entiendo cual es el problema, por las dudas descarga el control nuevamente, quizás sea alguna versión mas vieja que la actual. pero bueno si vas a iniciar un nuevo proyecto o vas a agregar el control a un proyecto existente debes agregar estos tres archivos en este orden, primero el ucText.ctl y el mIOleInPlaceActivate.bas por ultimo el PropPagUcText.pag ya con eso no debería haber ningún problema.

      Me avisas si tienes problemas.

      • Gracias por la ayuda. No hay forma.
        Copio los tres ficheros que comentas y los pego en la carpeta de nuestor protecto.
        Añado .ctl correctamente.
        Añado .bas correctamente.
        Añado .pag y da errores de carga concretamente esto:
        Línea 101: la clase Proyecto1.ucText del control ucText1 no era una clase de control cargada.
        Línea 126: la clase Proyecto1.ucText del control TxtCaption no era una clase de control cargada.
        Línea 151: la clase Proyecto1.ucText del control TxtCuebanner no era una clase de control cargada.
        Línea 107: el nombre de la propiedad _ExtentX de ucText1 no es válido.
        Línea 108: el nombre de la propiedad _ExtentY de ucText1 no es válido.
        Línea 119: el nombre de la propiedad ImgLeft de ucText1 no es válido.
        Línea 120: el nombre de la propiedad ImgRight de ucText1 no es válido.
        Línea 121: el nombre de la propiedad ImgLeftSize de ucText1 no es válido.
        Línea 122: el nombre de la propiedad ImgRightSize de ucText1 no es válido.
        Línea 123: el nombre de la propiedad RightButtonStyle de ucText1 no es válido.
        Línea 124: el nombre de la propiedad Caption de ucText1 no es válido.
        Línea 132: el nombre de la propiedad _ExtentX de TxtCaption no es válido.
        Línea 133: el nombre de la propiedad _ExtentY de TxtCaption no es válido.
        Línea 144: el nombre de la propiedad ImgLeft de TxtCaption no es válido.
        Línea 145: el nombre de la propiedad ImgRight de TxtCaption no es válido.
        Línea 146: el nombre de la propiedad ImgLeftSize de TxtCaption no es válido.
        Línea 147: el nombre de la propiedad ImgRightSize de TxtCaption no es válido.
        Línea 148: el nombre de la propiedad RightButtonStyle de TxtCaption no es válido.
        Línea 149: el nombre de la propiedad Caption de TxtCaption no es válido.
        Línea 157: el nombre de la propiedad _ExtentX de TxtCuebanner no es válido.
        Línea 158: el nombre de la propiedad _ExtentY de TxtCuebanner no es válido.
        Línea 169: el nombre de la propiedad ImgLeft de TxtCuebanner no es válido.
        Línea 170: el nombre de la propiedad ImgRight de TxtCuebanner no es válido.
        Línea 171: el nombre de la propiedad ImgLeftSize de TxtCuebanner no es válido.
        Línea 172: el nombre de la propiedad ImgRightSize de TxtCuebanner no es válido.
        Línea 173: el nombre de la propiedad RightButtonStyle de TxtCuebanner no es válido.
        Línea 174: el nombre de la propiedad Caption de TxtCuebanner no es válido.

        Nuestro proyecto NO se llama proyecto1

        • Y al hacer clic en uctext.ctl se genera el siguiente log

          Línea 23: la propiedad PropertyPages de ucText tenía una referencia a archivo no válida.
          Línea 27: la propiedad ToolboxBitmap de ucText tenía una referencia a archivo no válida.

          Me parece que debe ser algún problema de rutas o ubicaciones.

          Por cierto tenemos la ultima version del control. 429 Kb.

          • Hola Carlos ya veo cual es el error, algo que se me pasó mencionar, y también me pasa en otros proyectos, generalmente cuando hago estos usercontrol lo hago bajo el nombre de Proyecto1 al tener otro nombre el proyecto se pierde la referencia, solucion: tenes que abrir el archivo del .pag con el block de notas (Notepad) y remplazar la palabra «Proyecto1» por el nombre de de tu proyecto, quizás tu vb6 está en Inglés y el nombre del proyecto por defecto nuevo sea Project1, pero bueno sea cual sea el nombre remplazado por ese, una vez que guardes los cambios lo agregas al proyecto.
            Después contame si con eso está solucionado.

          • Perfecto, ha sido la solución, gracias. Ahora funciona perfecto.

    • Buenísimo entonces.

  12. Leando muy buen aporte, gracias por compartir.
    La consulta es como lo genero como OCX, no se puede hacer asi.

    Gracias.

  13. Hi, after using the method «SetFocus» , it will fail shift current textbox to another one,Can you please adivse how to fix it ? thks

  14. Hola Leandro. Primero del todo: Enhorabuena por este gran trabajo!!!!

    He visto un error en el dropdown (list), cuando usas 2 monitores y el formulario esté en la pantalla de la derecha. El dropdown se queda en la pantalla de la izquierda, y no debajo pegado al control. Con el dropdown del calendario no pasa. Sólo con el dropdown normal.

    Gracias!!!

    • Hola Marcel, me había informado de este problema pero no tuve forma de testearlo porque no tengo dos monitores, creo que ya tendría la solución, pero no se como probarlo, si puede escribirme a mi correo te agradecería para hacer algunas pruebas. leandroascierto @ hotmail.com (todo junto, quita los espacios)

      • Buenso días Leando.
        Gracias por tu contestación. Estaré encantado haciendo las pruebas. Te escribo a tu email.
        Gracias de nuevo

  15. Buenas tardes Leandro:
    Gracias por todos tus aporte.
    Solo un apunte, el ucText en modo númeric y desimal no admite números negativos ,por lo que tenemos que ponerlo en modo Text teniendo que programar aparte el control para que solo admita números y también los negativos.

    ¿Hay alguna propiedad que se nos pase o esos modos son así?

    • disculpa me contesto yo mismo. uctext como numeric y minvalue<0 y la propiedad rightbuttonstyle en spinbutton.

      Gracias de todas formas

      • Gracias Carlos perdón por no responder antes, entonces ya esta solucionado?

        • Si, todo correcto en ese sentido pero ya que nos brindas esta magnífica herramienta perdona que te haga una pregunta.

          Usamos ucText (Dropdown) + ucList para crear combos muy elegantes y útiles como bien indicas en tu herramienta, pero normalmente al cargar un ucList por ejemplo de clientes , guardamos además del nombre del cliente el código del mismo de la tabla Mysql de la que proviene.

          Ej: antonio perez gomez 23

          siendo 23 el código del cliente con el que después operamos para hacer varias cosas.
          Ahora mismo hacemos un .recordset(«nombre_cliente») & space(100) & recodset («cod_cliente») y lo metemos en el .Additem del ucList y lo extraemos con un len(right(text1.text,5)) pero lo veo poco elegante.

          ¿Hay alguna propiedad del ucList donde pueda guardar el código y después recuperarlo del ucText asociado?

          Espero haberme explicado bien

          Muchas gracias de antemano.

          • hola prueba con la propiedad ItemData del ucList
            por ejemplo

            c_cuentas_efectivo.Clear
            p_Criteria = «SELECT * FROM bancos ORDER BY ba_banco»
            p_rs.Open p_Criteria, cn, adOpenForwardOnly
            Do Until p_rs.EOF
            ‘ No vacío
            c_cuentas_efectivo.AddItem Format(p_rs!ba_codigo, «0000») & » – » & p_rs!ba_banco & » – Nº Cuenta: » & p_rs!ba_cuenta
            c_cuentas_efectivo.ItemData(c_cuentas_efectivo.ListCount – 1) = p_rs!ba_codigo
            p_rs.MoveNext
            Loop
            ‘ cierra tabla
            p_rs.Close

            t_cuentas_efectivo.ListPlus = c_cuentas_efectivo

            y recuperas el codigo con

            c_cuentas_efectivo.ItemData(c_cuentas_efectivo.ListIndex))

          • Genial Leandro, no conocía la propiedad, ya estamos aplicándola al resto del proyecto funciona Genial.

            Muchas gracias.

 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)