Función que permite cortar un texto añadiendo al final puntos suspensivos. La gracia de la misma es que utiliza clases.NET
Una de las cosas que hace tiempo quería hacer es escribir un código que pusiera en un [TextBox] unos puntos suspensivos al final del texto para indicar que había más texto del que cabe en el cuadro de texto. Para mi sorpresa he visto que el control [Label] ya lo tiene incluido pero el control [TextBox] no.
Nunca me venía bien hasta que no he tenido más remedio que escribirlo, por lo que antes de escribir una sola línea de código y para no reinventar la rueda he mirado a ver qué es lo que habían hecho otros programadores.
Como se puede suponer he encontrado varios códigos que hacen este trabajo, algunos de ellos muy interesantes, pero que más me ha gustado es el que figura en
Use the .NET framework to shorten a path string with an ellipsis
Al final, esta es la función que he escrito y he guardado en mi repositorio de funciones :-)
'--------------------------------------------------------------- ' Esta es la función que realmente hace el trabajo de de poner los puntos suspensivos al texto '--------------------------------------------------------------- ''' <summary> ''' Trunca una cadena de texto añadiendo el carácter puntos suspensivos (...), ''' si el tamaño de la cadena de texto excede el tamaño máximo permitido ''' </summary> ''' <param name="cadenaOriginal"> ''' <para> Tipo:<see cref="System.String">String</see> </para> ''' <para> La cadena que se va a tratar</para> ''' </param> ''' <param name="anchuraMaxima"> ''' <para> Tipo:<see cref="System.Integer">Integer</see> </para> ''' <para> Ancho del control, en píxeles. </para> ''' <para> La anchura máxima que puede tener la cadena (en píxeles) </para> ''' </param> ''' <param name="fuenteDelTexto"> ''' <para> Tipo.: <see cref="System.Drawing.Font">Drawing.Font</see> </para> ''' <para> La fuente con la que se ha escrito el texto. </para> ''' <para> Segun el tamaño de la fuente caben más o menos caracteres en un espacio determinado </para> ''' </param> ''' <param name="formatoAplicado"> ''' <para> Tipo:<see cref="System.Windows.Forms.TextFormatFlags"> ''' Windows.Forms.TextFormatFlags</see></para> ''' <para> Especifica la información de diseño y de presentación de las cadenas de texto. </para> ''' <para> Esta enumeración tiene un atributo FlagsAttribute que ''' permite una combinación bit a bit de los valores de miembro. </para> ''' </param> ''' <returns> ''' <para> Tipo:<see cref="System.String">String</see> </para> ''' <para> Una cadena con el formato [AutoEllipsis] aplicado </para> ''' </returns> ''' <remarks> ''' <para> Trunca una cadena de texto añadiendo el carácter puntos suspensivos (...), ''' si el tamaño de la cadena de texto excede el tamaño máximo permitido ''' </para> ''' <para> Tunca una cadena de texto Funciona de forma parecida a la ''' propiedad [Label.AutoEllipsis] añadiendo el carácter de puntos suspensivos (...) ''' normalmente a la derecha del texto, para indicar que el texto original ''' excede del tamaño máximo marcado ''' </para> ''' <para> La situación de los puntos suspensivos (...) está indicado por el valor ''' de la enumeración [Windows.Forms.TextFormatFlags] ''' </para> ''' <example> Para saber más ''' <code> http://www.codeproject.com/KB/vb/NewPathCompactPath.aspx </code> ''' <code> http://msdn.microsoft.com/es-es/library/system.windows.forms.textformatflags.aspx </code> ''' <code> http://msdn.microsoft.com/es-es/library/7sy6awsb.aspx </code> ''' <code> http://msdn.microsoft.com/es-es/library/system.windows.forms.label.autoellipsis.aspx </code> ''' </example> ''' <example> ''' --------------------------------------------------- ''' Ejemplo de uso ''' --------------------------------------------------- ''' 'Escuchador del evento [TextChanged] de un TextBox ''' '-------------- ''' Private Sub TextBox1_TextChanged( _ ''' sender As System.Object, e As System.EventArgs) _ ''' Handles TextBox1.TextChanged ''' ''' TextBox1.Text = AutoElipsisTextBox.CompactString( _ ''' TextBox1.Text, _ ''' TextBox1.Width, _ ''' TextBox1.Font, _ ''' TextFormatFlags.EndEllipsis) ''' End Sub ''' --------------------------------------------------- ''' </example> ''' <Historial> ''' <para> Creado el : 2011-12-03-17:11</para> ''' <para> Autor.: Joaquín Medina Serrano </para> ''' <para> Licencia.: Acogido a la licencia de The Code Project Open License (CPOL) ''' <code>http://www.codeproject.com/info/cpol10.aspx </code> ''' </para> ''' </Historial> ''' </remarks> Private Shared Function CompactString( _ ByVal cadenaOriginal As String, _ ByVal anchuraMaxima As Integer, ByVal fuenteDelTexto As Drawing.Font, ByVal formatoAplicado As Windows.Forms.TextFormatFlags) _ As String Dim cadenaCompactada As String = String.Copy(cadenaOriginal) Call TextRenderer.MeasureText( _ cadenaCompactada, _ fuenteDelTexto, _ New Drawing.Size(anchuraMaxima, 0), _ formatoAplicado Or TextFormatFlags.ModifyString) ' Return cadenaCompactada End Function
He usado ese código porque me parece muy sencillo y además estoy de acuerdo con las ideas que expone el autor en su artículo
Al final he escrito un control[TextBox] que dispone de la propiedad [AutoElipsis] y que funciona como se espera que funcione.
Enlace para descargarte un fichero (comprimido ZIP) con el control
En este documento hay un pequeño FAQ sobre MD5
' ' ----------------------------------------------- ' HerramientaHash ' Fecha del cálculo: 2011-12-04T12:12:16 ' ----------------------------------------------- ' Tipo .....: Fichero ' Nombre ...:TextBoxAutoElipsis.zip ' Tamaño ...: 0,00 Mb [4 533 Bytes] ' ---Fechas interesantes del fichero ---- ' Creación .........: 2011-12-04 13:11:58Z ' ----------------------------------------------- ' Md5 Checksum: EB0DF4BFEE777E4475E9163D544108D0 ' SHA1 Checksum: A135A99D355224350392A70E8607DC388F2948DB ' SHA256 Checksum: 1EB75EE14F1C09383A3D57C8A6FC45C62538F1A7554B8C56E6FB4D422BA32F77 ' SHA384 Checksum: 11375F248B18543C1881D2C98A6B6B0FDF183A372B46D27BB6F057BB2BF3816DF6974388EEF486AA447AB30FF6767C55 ' SHA512 Checksum: 089AC68A9C29A708087FA74E979F9086F9ED05C23BA1A0139186CA79B2E4FE4C69D49DE9860FE5922AD5B26D9B3F1DE4756AD8C1F9DB3D9055CFDE7A454551F1 ' ----------------------------------------------- ' /eof '
Si se te da el caso de que el checksum del fichero no coincide con el que obtengas, puede ser por varias razones, la más probable es que por algún despiste haya puesto mal el valor Hash. Otra posibilidad, mucho más peligrosa, es que alguien haya cambiado el contenido del fichero y estés descargando cualquier cosa innombrable
En cualquier caso: