Un simple algoritmo de separación de sílabas (syllabicates palabras en español)
separación de sílabas
a Veces necesitamos mostrar o imprimir un texto, y nos gustaría separar en sílabas las palabras largas que no se ajustan al final de una línea, para evitar que caigan completamente en la línea siguiente, dejando demasiado espacio no utilizado.
El principal problema que surge es cómo dividir una palabra en sílabas. Bueno, yo realmente no sé cómo syllabicate en inglés, así que deje esa parte, pero espero que usted encuentre el ejemplo en español sílabas útil:
procedimiento Syllabify(Sílabas: TStringList s: string)
& nbsp & nbsp const
& nbsp & nbsp & nbsp & nbsp Consonantes = ['b','b','c','C','d','D','f','F','g','G',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'h','H','j','J','k','K','l','L','m','M','n','N',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ' -',' -','p','P','p','Q','r','R','s','S','t','T',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'v','V','w','W','x','X','y','Y','z','Z']
& nbsp & nbsp & nbsp & nbsp StrongVowels = ['a','A','á','Á','e','E','é','É',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'í','Í','o','ó','O','Ó','ú','Ú']
& nbsp & nbsp & nbsp & nbsp WeakVowels = ['i','I','u','U','ü','Ü']
& nbsp & nbsp & nbsp & nbsp Vocales = StrongVowels WeakVowels
& nbsp & nbsp & nbsp & nbsp Letras = Vocales Consonantes
& nbsp & nbsp var
& nbsp & nbsp & nbsp & nbsp i, j, n, m, guión: integer
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp j := 2
& nbsp & nbsp & nbsp & nbsp s := #0 #0
& nbsp & nbsp & nbsp & nbsp n := Length(s) - 1
& nbsp & nbsp & nbsp & nbsp i := 2
& nbsp & nbsp & nbsp & nbsp Sílabas.Claro
& nbsp & nbsp & nbsp & nbsp mientras i <= n do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp guión := 0 // no separar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i] en las Consonantes, a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i 1] en las Vocales, a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i-1] en las Vocales, a continuación, guión := 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if (s[i 1] en Consonantes) y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp (s[i-1] en las Vocales), a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i 1] en ['r','R'] a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i] en ['b','b','c','C','d','D','f','F','g',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'G','k','K','p','P','r','R','t','T','v','V']
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp luego guión := 1 else guión := 2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final por el contrario, si s[i 1] en ['l','L'] a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i] en ['b','b','c','C','d','D','f','F','g',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'G','k','K','l','L','p','P','t','T','v','V']
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp luego guión := 1 else guión := 2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final por el contrario, si s[i 1] en ['h', 'H'] a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i] en ['c', 'C', 's', 'S', 'p', 'P']
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp luego guión := 1 else guión := 2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp guión := 2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final por el contrario, si s[i] en StrongVowels, a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp if (s[i-1] en StrongVowels), a continuación, guión := 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final por el contrario, si s[i] =' -', a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Sílabas.Agregar(Copia(s, j, i - j))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Sílabas.Add('-')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := i
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp guión si = 1, a continuación, empezar // Separar aquí
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Sílabas.Agregar(Copia(s, j, i - j))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := i
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if guión = 2 then begin // Separar después de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Sílabas.Agregar(Copia(s, j, i - j))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := i
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp m := Sílabas.Count - 1
& nbsp & nbsp & nbsp & nbsp if (j = n) y (m >= 0) y (s[n] en las Consonantes), a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Sílabas[m] := Sílabas[m] s[n] // La última carta
& nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Sílabas.Agregar(Copia(s, j, n - j-1)) // Última sílaba
& nbsp & nbsp final
Para probar el procedimiento yon puede colocar un cuadro de texto y una Etiqueta en un formulario y en el evento de Cambio de la caja de texto escriba:
procedure TForm1.Edit1Change(Sender: TObject)
& nbsp & nbsp var
& nbsp & nbsp & nbsp & nbsp Sílabas: TStringList
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Sílabas := TStringList.Crear
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Syllabify(Sílabas, Edit1.De texto)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Label1.Caption := StringReplace(Trim(Sílabas.De texto),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp #13#10, '-', [rfReplaceAll])
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Sílabas.Libre
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
Ahora que tenemos un sílabas procedimiento, tenemos que tener en cuenta que no podemos separar una palabra en cualquier sílaba descanso. Es generalmente correcta
y/o deseable para unirse a pequeñas sílabas a la izquierda y/o derecha de una palabra para garantizar, por ejemplo, que hay al menos dos sílabas en cada lado de la palabra cuando se separen, o -como en el siguiente ejemplo - para asegurarse de que al menos tenemos cuatro personajes en uno de los laterales:
procedimiento ApplyRules(Sílabas: TStringList)
& nbsp & nbsp // Garantía de que hay al menos cuatro cartas en la izquierda
& nbsp & nbsp // y el derecho de las partes de la palabra
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp con las Sílabas que empiezan
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Count = 1, entonces la salida
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras Count > 1 do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Longitud(Cadenas[0]) >= 4 entonces break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Cadenas[0] := Cadenas[0] [Cadenas] [1]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras Sílabas.Count > 1 do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Longitud(Cadenas[Count-1]) >= 4 entonces break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Cadenas[Count-2] := Cadenas[Count-2]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Cadenas[Count-1]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(Count-1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
por último, llega el momento de analizar el texto de la separación de las líneas de un párrafo de determinar qué palabras deben estar separadas. El siguiente ejemplo hace que con un texto que se mostrará en un Memo:
procedimiento de Separar(nota: el TMemo OriginalText: TStrings)
& nbsp & nbsp var
& nbsp & nbsp & nbsp & nbsp párrafo, i, j, k, m, n, MaxLineWidth: integer
& nbsp & nbsp & nbsp & nbsp s, línea: cadena
& nbsp & nbsp & nbsp & nbsp mapa de bits: TBitmap
& nbsp & nbsp & nbsp & nbsp Lienzo: TCanvas
& nbsp & nbsp & nbsp & nbsp Sílabas: TStringList
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Sílabas := TStringList.Crear
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp // necesitamos un lienzo para el uso de su método TextWidth para obtener el ancho
& nbsp & nbsp & nbsp & nbsp // el texto para ver si se ajusta en el área de cliente o no. La
& nbsp & nbsp & nbsp & nbsp // TMemo clase no tiene un Lienzo de la propiedad, por lo que tenemos que
& nbsp & nbsp & nbsp & nbsp // crear uno de los nuestros.
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mapa de bits := TBitmap.Crear
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Lienzo := mapa de bits.Lienzo
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Lienzo.Fuente := Memo.Fuente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MaxLineWidth := Memo.ClientWidth - 6 // ancho Máximo
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Memo.Líneas.Claro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp párrafo := 0 a OriginalText.Count - 1 do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Para cada párrafo
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp s := OriginalText[párrafo] // Obtener el párrafo original
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Obtener las líneas en las que tenemos que romper el párrafo
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras Lienzo.TextWidth(s) > MaxLineWidth empiezan
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // en Primer lugar nos encontramos (en 'j') el índice del inicio de la
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // primera palabra que no encaja (el de separar)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp n := Length(s)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp i := 2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras i <= n do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp if (s[i-1] = ' a ') y (s[i] <> ' ') a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := i // última principio de una palabra
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Lienzo.TextWidth(Copia(s), 1, i)) > MaxLineWidth, a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp break // llegaron a un ancho que no encaja
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp / / ¿de Dónde se produce el salto?
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i] ='', a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Genial! Partimos en un espacio
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Memo.Líneas.Agregar(Copia(s), 1, i - 1)) // Añadir la línea
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp s := Copy(s, i 1, n - i) // Eliminar la línea
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Hacemos un descanso en algún lugar de una palabra. Ahora, que nos encontramos (en 'k')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // el primer espacio después de la palabra (k)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp k := j 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras (k <= n) y (s[k] <> ' ') do inc(k)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Dividir la palabra en Sílabas
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Syllabify(Sílabas, Copia(s, j, k - j))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ApplyRules(Sílabas)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Cheque (en 'm') ¿cuántas sílabas ajuste
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp m := 0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Línea := Copy(s), 1, j-1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras Lienzo.TextWidth(Línea de Sílabas[m] '-')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp <= MaxLineWidth empiezan
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Línea := Línea de Sílabas[m]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(m)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (m <> 0) y (Sílabas[m-1] <> '-') a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Separar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Línea :Línea = ' - '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := Longitud(Línea)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Sílabas[m] =' -', a continuación, inc(j)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Memo.Líneas.Añadir(en Línea) // Añadir la línea
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp s := Copy(s, j, n - j 1) // Eliminar la línea
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Memo.Líneas.Agregar(s) // Añadir la última línea (se ajusta)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mapa de bits.Libre
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Sílabas.Libre
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
Para probar el procedimiento, la caída de un Memo componente en un formulario, se suman, por ejemplo, para la parte superior del formulario (Align = alTop) y escribir el siguiente código en el evento Resize del formulario:
procedure TForm1.FormResize(Sender: TObject)
& nbsp & nbsp var
& nbsp & nbsp & nbsp & nbsp OriginalText: TStringList
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp OriginalText := TStringList.Crear
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp OriginalText.Add('Si se ha preguntado cómo hacen los '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'programas procesamiento de textos para dividir palabras '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'con de guiones al final de una línea, él aquí un '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'ejemplo sencillo (en comparación con los que usan las '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'aplicaciones de procesamiento de textos).')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp OriginalText.Add('Este es un segundo párrafo que se provee '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'con multas de ejemplo.')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Separar(Memo1, OriginalText)
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp OriginalText.Libre
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
Usted puede encontrar el código fuente completo de este artículo en el archivo que acompaña a la Pascal Boletín #23
La separacion silabica
La separacion silabica : Multi-millones de consejos para hacer su vida mas facil.
Un simple algoritmo de separacion de silabas (syllabicates palabras en español)
separacion de silabas
a Veces necesitamos mostrar o imprimir un texto, y nos gustaria separar en silabas las palabras largas que no se ajustan al final de una linea, para evitar que caigan completamente en la linea siguiente, dejando demasiado espacio no utilizado.
El principal problema que surge es como dividir una palabra en silabas. Bueno, yo realmente no se como syllabicate en ingles, asi que deje esa parte, pero espero que usted encuentre el ejemplo en español silabas util:
procedimiento Syllabify(Silabas: TStringList s: string)
& nbsp & nbsp const
& nbsp & nbsp & nbsp & nbsp Consonantes = ['b','b','c','C','d','D','f','F','g','G',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'h','H','j','J','k','K','l','L','m','M','n','N',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ' -',' -','p','P','p','Q','r','R','s','S','t','T',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'v','V','w','W','x','X','y','Y','z','Z']
& nbsp & nbsp & nbsp & nbsp StrongVowels = ['a','A','a','A','e','E','e','E',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'i','I','o','o','O','O','u','U']
& nbsp & nbsp & nbsp & nbsp WeakVowels = ['i','I','u','U','ü','Ü']
& nbsp & nbsp & nbsp & nbsp Vocales = StrongVowels WeakVowels
& nbsp & nbsp & nbsp & nbsp Letras = Vocales Consonantes
& nbsp & nbsp var
& nbsp & nbsp & nbsp & nbsp i, j, n, m, guion: integer
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp j := 2
& nbsp & nbsp & nbsp & nbsp s := #0 #0
& nbsp & nbsp & nbsp & nbsp n := Length(s) - 1
& nbsp & nbsp & nbsp & nbsp i := 2
& nbsp & nbsp & nbsp & nbsp Silabas.Claro
& nbsp & nbsp & nbsp & nbsp mientras i <= n do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp guion := 0 // no separar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i] en las Consonantes, a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i 1] en las Vocales, a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i-1] en las Vocales, a continuacion, guion := 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if (s[i 1] en Consonantes) y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp (s[i-1] en las Vocales), a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i 1] en ['r','R'] a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i] en ['b','b','c','C','d','D','f','F','g',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'G','k','K','p','P','r','R','t','T','v','V']
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp luego guion := 1 else guion := 2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final por el contrario, si s[i 1] en ['l','L'] a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i] en ['b','b','c','C','d','D','f','F','g',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'G','k','K','l','L','p','P','t','T','v','V']
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp luego guion := 1 else guion := 2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final por el contrario, si s[i 1] en ['h', 'H'] a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i] en ['c', 'C', 's', 'S', 'p', 'P']
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp luego guion := 1 else guion := 2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp guion := 2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final por el contrario, si s[i] en StrongVowels, a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp if (s[i-1] en StrongVowels), a continuacion, guion := 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final por el contrario, si s[i] =' -', a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Silabas.Agregar(Copia(s, j, i - j))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Silabas.Add('-')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := i
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp guion si = 1, a continuacion, empezar // Separar aqui
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Silabas.Agregar(Copia(s, j, i - j))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := i
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if guion = 2 then begin // Separar despues de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Silabas.Agregar(Copia(s, j, i - j))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := i
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp m := Silabas.Count - 1
& nbsp & nbsp & nbsp & nbsp if (j = n) y (m >= 0) y (s[n] en las Consonantes), a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Silabas[m] := Silabas[m] s[n] // La ultima carta
& nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Silabas.Agregar(Copia(s, j, n - j-1)) // Ultima silaba
& nbsp & nbsp final
Para probar el procedimiento yon puede colocar un cuadro de texto y una Etiqueta en un formulario y en el evento de Cambio de la caja de texto escriba:
procedure TForm1.Edit1Change(Sender: TObject)
& nbsp & nbsp var
& nbsp & nbsp & nbsp & nbsp Silabas: TStringList
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Silabas := TStringList.Crear
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Syllabify(Silabas, Edit1.De texto)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Label1.Caption := StringReplace(Trim(Silabas.De texto),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp #13#10, '-', [rfReplaceAll])
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Silabas.Libre
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
Ahora que tenemos un silabas procedimiento, tenemos que tener en cuenta que no podemos separar una palabra en cualquier silaba descanso. Es generalmente correcta
y/o deseable para unirse a pequeñas silabas a la izquierda y/o derecha de una palabra para garantizar, por ejemplo, que hay al menos dos silabas en cada lado de la palabra cuando se separen, o -como en el siguiente ejemplo - para asegurarse de que al menos tenemos cuatro personajes en uno de los laterales:
procedimiento ApplyRules(Silabas: TStringList)
& nbsp & nbsp // Garantia de que hay al menos cuatro cartas en la izquierda
& nbsp & nbsp // y el derecho de las partes de la palabra
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp con las Silabas que empiezan
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Count = 1, entonces la salida
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras Count > 1 do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Longitud(Cadenas[0]) >= 4 entonces break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Cadenas[0] := Cadenas[0] [Cadenas] [1]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras Silabas.Count > 1 do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Longitud(Cadenas[Count-1]) >= 4 entonces break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Cadenas[Count-2] := Cadenas[Count-2]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Cadenas[Count-1]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(Count-1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
por ultimo, llega el momento de analizar el texto de la separacion de las lineas de un parrafo de determinar que palabras deben estar separadas. El siguiente ejemplo hace que con un texto que se mostrara en un Memo:
procedimiento de Separar(nota: el TMemo OriginalText: TStrings)
& nbsp & nbsp var
& nbsp & nbsp & nbsp & nbsp parrafo, i, j, k, m, n, MaxLineWidth: integer
& nbsp & nbsp & nbsp & nbsp s, linea: cadena
& nbsp & nbsp & nbsp & nbsp mapa de bits: TBitmap
& nbsp & nbsp & nbsp & nbsp Lienzo: TCanvas
& nbsp & nbsp & nbsp & nbsp Silabas: TStringList
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Silabas := TStringList.Crear
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp // necesitamos un lienzo para el uso de su metodo TextWidth para obtener el ancho
& nbsp & nbsp & nbsp & nbsp // el texto para ver si se ajusta en el area de cliente o no. La
& nbsp & nbsp & nbsp & nbsp // TMemo clase no tiene un Lienzo de la propiedad, por lo que tenemos que
& nbsp & nbsp & nbsp & nbsp // crear uno de los nuestros.
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mapa de bits := TBitmap.Crear
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Lienzo := mapa de bits.Lienzo
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Lienzo.Fuente := Memo.Fuente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MaxLineWidth := Memo.ClientWidth - 6 // ancho Maximo
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Memo.Lineas.Claro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp parrafo := 0 a OriginalText.Count - 1 do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Para cada parrafo
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp s := OriginalText[parrafo] // Obtener el parrafo original
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Obtener las lineas en las que tenemos que romper el parrafo
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras Lienzo.TextWidth(s) > MaxLineWidth empiezan
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // en Primer lugar nos encontramos (en 'j') el indice del inicio de la
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // primera palabra que no encaja (el de separar)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp n := Length(s)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp i := 2
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras i <= n do begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp if (s[i-1] = ' a ') y (s[i] <> ' ') a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := i // ultima principio de una palabra
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Lienzo.TextWidth(Copia(s), 1, i)) > MaxLineWidth, a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp break // llegaron a un ancho que no encaja
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(i)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp / / ¿de Donde se produce el salto?
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si s[i] ='', a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Genial! Partimos en un espacio
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Memo.Lineas.Agregar(Copia(s), 1, i - 1)) // Añadir la linea
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp s := Copy(s, i 1, n - i) // Eliminar la linea
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else begin
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Hacemos un descanso en algun lugar de una palabra. Ahora, que nos encontramos (en 'k')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // el primer espacio despues de la palabra (k)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp k := j 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras (k <= n) y (s[k] <> ' ') do inc(k)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Dividir la palabra en Silabas
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Syllabify(Silabas, Copia(s, j, k - j))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ApplyRules(Silabas)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Cheque (en 'm') ¿cuantas silabas ajuste
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp m := 0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Linea := Copy(s), 1, j-1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras Lienzo.TextWidth(Linea de Silabas[m] '-')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp <= MaxLineWidth empiezan
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Linea := Linea de Silabas[m]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp inc(m)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (m <> 0) y (Silabas[m-1] <> '-') a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Separar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Linea :Linea = ' - '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp j := Longitud(Linea)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si Silabas[m] =' -', a continuacion, inc(j)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Memo.Lineas.Añadir(en Linea) // Añadir la linea
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp s := Copy(s, j, n - j 1) // Eliminar la linea
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Memo.Lineas.Agregar(s) // Añadir la ultima linea (se ajusta)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mapa de bits.Libre
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Silabas.Libre
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
Para probar el procedimiento, la caida de un Memo componente en un formulario, se suman, por ejemplo, para la parte superior del formulario (Align = alTop) y escribir el siguiente codigo en el evento Resize del formulario:
procedure TForm1.FormResize(Sender: TObject)
& nbsp & nbsp var
& nbsp & nbsp & nbsp & nbsp OriginalText: TStringList
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp OriginalText := TStringList.Crear
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp OriginalText.Add('Si se ha preguntado como hacen los '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'programas procesamiento de textos para dividir palabras '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'con de guiones al final de una linea, el aqui un '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'ejemplo sencillo (en comparacion con los que usan las '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'aplicaciones de procesamiento de textos).')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp OriginalText.Add('Este es un segundo parrafo que se provee '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'con multas de ejemplo.')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Separar(Memo1, OriginalText)
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp OriginalText.Libre
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp final
Usted puede encontrar el codigo fuente completo de este articulo en el archivo que acompaña a la Pascal Boletin #23