Autor Tema: Funcion para 'JUSTIFICAR' texto  (Leído 7123 veces)

0 Usuarios y 1 Visitante están viendo este tema.

erbuson

  • Kilobyte
  • **
  • Mensajes: 75
  • Reputación: +11/-1
    • Ver Perfil
Funcion para 'JUSTIFICAR' texto
« en: Marzo 28, 2013, 12:44:58 pm »
He tenido necesidad de implementar un AJUSTE de texto en unos documentos y aunque no llega a la perfección del Word y similares (ni se les acerca siquiera), he conseguido desarrollar esta función que cumple gran parte de su cometido.

Como es muy simple y no es mucho código, a fin de no tener que adjuntar un archivo copia aqui la funcion con un ejemplo de uso de la misma.

Código: (VB) [Seleccionar]
Public Function JustificaTexto(ByVal Texto As String, Ancho As Integer, Hacia As Object) As String
  ' Justifica (mas o menos) el texto indicado. No es el de Office ni hace milagros pero puede servir.
  ' Recibe....: Texto a Autoajustar, Ancho deseado, Objeto que recibirá el texto
  ' Devuelve..: Lineas separadas por CrLf y ajustada al ancho deseado
  Dim Todo As String, Desde As Integer, Hasta As Integer, Previo As Integer, Linea As String, Parte As String
  Dim Posicion As Integer, Insertar As Boolean, HayBlancos As Boolean, Intro As Integer
  Dim Objeto As Object
  Set Objeto = Hacia
  Todo = RTrim$(Texto) & Chr$(32)  ' Añade al final un caracter en blanco
 
TieneIntros:
  ' Comprueba si es un texto Multi-Párrafo
  Intro = InStr(Todo, vbCrLf)
  If Intro > 0 Then
    Parte = Left$(Todo, Intro - 1)
    Todo = Mid$(Todo, Intro + 2)
    JustificaTexto = JustificaTexto & JustificaTexto(Parte, Ancho, Hacia)
    GoTo TieneIntros
  End If
 
  Do
    If InStr(Todo, Chr$(32)) = 0 Then
      JustificaTexto = JustificaTexto & Todo & vbCrLf
      Exit Do
    End If
    Desde = 1
MasAun:
    Hasta = InStr(Desde, Todo, Chr$(32))
    If Objeto.TextWidth(Left$(Todo, Hasta - 1)) < Ancho Then
      Previo = Hasta  'El último corte que encaja en el ancho
      Desde = Hasta + 1
      If Hasta < Len(Todo) Then GoTo MasAun
    End If
    Linea = RTrim$(Left$(Todo, Previo - 1))
    Todo = LTrim$(Mid$(Todo, Previo + 1))
    ' Ajusta con blancos la linea para igualar al máximo
Ajustar:
    Posicion = 1
    If InStr(Linea, Chr$(32)) > 0 Then HayBlancos = True Else HayBlancos = False
    Insertar = False
    Do
      If Not HayBlancos Then Exit Do
      If Mid$(Linea, Posicion, 1) <> Chr$(32) Then
        Insertar = True
      Else
        If Insertar Then
          Linea = Left$(Linea, Posicion) & Chr$(32) & Mid$(Linea, Posicion + 1)
          Insertar = False
          If Objeto.TextWidth(Linea) >= Ancho Then Exit Do
        End If
      End If
      If Posicion = Len(Linea) Then Exit Do
      Posicion = Posicion + 1
    Loop
    If Objeto.TextWidth(Linea) < Ancho And HayBlancos And Todo <> "" Then GoTo Ajustar
    JustificaTexto = JustificaTexto & Linea & vbCrLf
  Loop
  Set Objeto = Nothing
End Function

Aqui código del ejemplo Pic es un PictureBox, txtTexto es un TexBox multilinea y Ajustar es un Slider para probar diversos Anchos

Código: (VB) [Seleccionar]
Option Explicit

Private Sub Form_Load()
  txtTexto = vbTab & "Esta texto es la prueba para comprobar esta función de Justificacion de Texto, no pretende sustituir"
  txtTexto = txtTexto & " la función de los editores profesionales, ya que no controla los cambios de Fuente, Tamaño,"
  txtTexto = txtTexto & " negrita dentro del mismo texto, pero en algunas circunstancias creo que puede valer, por lo"
  txtTexto = txtTexto & " menos a mi me vale. Puede no estar exento de errores, de hecho estoy seguro que tiene alguno,"
  txtTexto = txtTexto & " por lo que se aceptan mejoras al mismo. Un saludo a todos."
  txtTexto = txtTexto & vbCrLf
  txtTexto = txtTexto & vbTab & "Para probar su funcionamiento basta con ir desplazando la barra con el fin de determinar el ancho."
  txtTexto = txtTexto & vbCrLf
  txtTexto = txtTexto & vbTab & "Se ha modificado porque había un error si incluíamos CrLf en el texto. Antes sólo editaba bien"
  txtTexto = txtTexto & "un párrafo y sin embargo con esta modificacion ajusta bien un texto en el que se pueden indicar"
  txtTexto = txtTexto & "diferentes párrafos con el CrLf para separarlos. Tambien se ha comprobado su funcionamiento si lleva"
  txtTexto = txtTexto & "insertado entre el texto Tabulaciones vbTab, espero que no haya mas cambios"
  txtTexto = txtTexto & vbCrLf & vbCrLf
  txtTexto = txtTexto & vbTab & "En la linea anterior se ha incluido un doble Intro CrLf para probar su funcionamiento"
 
  Ajustar.Max = Pic.Width
  Ajustar.Min = 1000
  Ajustar.Value = Pic.Width \ 3
End Sub

Private Sub Ajustar_Click()
  Pic.Cls
  Pic.Print JustificaTexto(txtTexto, Ajustar.Value, Pic)
End Sub

Saludos y ojalá le sirva a alguien.

pd: He tenido que aplicar una modificación porque de la manera anterior sólo justificaba correctamente el primer párrafo de un texto. De este modo justifica todos los párrafos considerando los mismos si estan separados por CrLF. Asi mismo he verificado el correcto funcionamiento de vbTab en el Texto.
« última modificación: Marzo 28, 2013, 04:04:17 pm por erbuson »