Estas funciones las he hecho para usar junto con el "terminal ese al estilo MS-DOS", lo que hace esta función es devolver un número de caracteres de la cadena que se le pasa, pero sin cortar las palabras.
Imaginate que tienes una cadena de la que sólo quieres mostrar los primeros 50 caracteres, pero no quieres que se corte ninguna palabra, pues usando esta función lo puedes conseguir.
Realmente son cuatro funciones, una genérica y otras tres que llaman a esa función genérica.
Lo que puedes hacer con estas funciones es "mostrar" los caracteres indicados desde la izquierda, es decir que empieza a comprobar desde el principìo de la cadena y también desde el medio y la derecha. En la "versión" actual, las funciones que muestran los datos desde el medio y la derecha hacen lo mismo, pero la intención es que la función "Medio" pueda funcionar de igual forma que lo hace la función "Mid$" del Visual Basic, es decir que se le pueda especificar la posición de inicio y la cantidad de caracteres, pero esto aún no lo he "implementado", aunque no debería ser demasiado complicado.Las funciones están en un módulo de clase, pero se podrían poner en un módulo BAS, con lo cual evitaría tener que declarar una variable del tipo de esa clase... Eso lo dejo a tu gusto.
Aquí está la forma de usarla y las modificaciones que habría que hacer para que el procedimiento ImprimirDOS de la antes mencionada utilidad Terminal al estilo DOS.
Cómo usar las funciones.
La función principal es: PropperWrap(Cadena, númCaracteres, DesdeDóndeMuestrat)
Este es el código para usarla: (y lo que habría que cambiar en el módulo de ImprimirDOS)
Para averiguar el valor de MaxPorLinea, se calcula en el Resize del form:
' 'Número máximo de caracteres por línea (13/Jun/98) MaxPorLinea = Width \ picTW - 2 If MaxPorLinea < 10 Then MaxPorLinea = 10'Declarar una variable del tipo de la clase Dim tPropWrap As New cWrap If Len(sText) > MaxPorLinea Then sCopia = sText Do sTmp = tPropWrap.PropperLeft(sCopia, MaxPorLinea) If Len(sTmp) Then picDOS.Print sTmp sCopia = Mid$(sCopia, Len(sTmp) + 1) If .CurrentY > .Height Then .Height = .Height + Text1.Height .Top = .Top - Text1.Height - picTH End If End If Loop While Len(sTmp) .CurrentY = .CurrentY - picTH Else picDOS.Print sText; End IfEste es el código de la clase cWrap.cls (y las funciones):
VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END Attribute VB_Name = "cWrap" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = False ' '------------------------------------------------------------------ 'cWrap (13/Jun/98) 'Clase para efectuar "cortes" de palabras de forma apropiada ' '©Guillermo 'guille' Som, 1998 ' 'Esta clase tiene los siguientes métodos (funciones) ' PropperWrap(sCadena, nCaracteres [,DesdeDonde]) ' PropperLeft(sCadena, nCaracteres) ' PropperRight(sCadena, nCaracteres) ' PropperMid(sCadena, nCaracteres [,NoUsado)) '------------------------------------------------------------------ Option Explicit 'Alineación para usar con PropperWrap Public Enum ePropperWrapConstants pwLeft = 0 pwMid = 1 pwRight = 2 ' pwIzquierda = 0 ' pwCentro = 1 ' pwDerecha = 2 End Enum Public Function PropperWrap(ByVal sCadena As String, ByVal nCaracteres As Long, _ Optional DesdeDonde As ePropperWrapConstants = pwLeft) As String 'Devuelve la cadena que habría que imprimir para mostrar los 'caracteres indicados, sin cortar una palabra. 'Esto es para los casos en los que se quiera usar: 'Left$(sCadena,nCaracteres) o Mid$/Right$(sCadena,nCaracteres) 'pero sin cortar una palabra Dim i As Long Dim sChar As String Const cSeparadores = " ªº\!|@#$%&/()=?¿'¡[]*+{}<>,.-;:_" Dim sSeparadores As String sSeparadores = cSeparadores & vbCr & vbLf & vbTab & Chr$(34) If nCaracteres > Len(sCadena) Then nCaracteres = Len(sCadena) End If For i = nCaracteres To 1 Step -1 If InStr(sSeparadores, Mid$(sCadena, i, 1)) Then 'Si se especifica desde la izquierda If DesdeDonde = pwLeft Then sCadena = Left$(sCadena, i) Else 'lo mismo da desde el centro que desde la derecha sCadena = Mid$(sCadena, i + 1) End If Exit For End If Next PropperWrap = sCadena End Function Public Function PropperRight(ByVal sCadena As String, ByVal nCaracteres As Long) As String PropperRight = PropperWrap(sCadena, nCaracteres, pwRight) End Function Public Function PropperMid(ByVal sCadena As String, ByVal nCaracteres As Long, _ Optional ByVal RestoNoUsado As Long) As String PropperMid = PropperWrap(sCadena, nCaracteres, pwMid) End Function Public Function PropperLeft(ByVal sCadena As String, ByVal nCaracteres As Long) As String PropperLeft = PropperWrap(sCadena, nCaracteres, pwLeft) End Function