Funciones para "wrapear" texto

O lo que es lo mismo, cortar "adecuadamente" el texto cuando el espacio disponible así lo precise, sin cortar palabras...

 

Revisión del 14/Jun/98
Pulsa aquí para ver la última versión de esta clase


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 If

Este 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

ir al índice