Página 1 de 1

AYUDA CON FUNCION

Publicado: Mié Abr 25, 2007 10:13 am
por ANTON52
Hola a todos:
Tengo esta funcion que en principio, crei que me solucionaba el problema, pero no funciona, y no se por que, la cuestion es que necesito una funcion, que pasandole dos parametros, nombre de cadena y longitud, me reparta los espacio en blanco sobrantes por la derecha, entre las palabras que contiene, como en un editor de texto, encontre esto pero no funciona.
La inserto tal como la encontre.
**************************
Distribuir un texto en renglones
La rutina GRAPPA ha sido probada para que suministre una matriz donde cada
elemento corresponde a un renglón, de modo que cada uno contenga palabras
enteras, salvo que haya alguna cuyo largo sea mayor que el indicado en
nCaracteres; en ese caso se trunca la palabra larga. Si hay retornos de
carro intercalados -chr(13)+chr(10)- se los toma como un renglón más, en
blanco.
Uso:
GRAPPA(cTexto, nCarac) -> aTexto
cTexto es la cadena de caracteres que hay que poner en renglones.
nCarac es el número de caracteres que tendrá como máximo cada renglón.
aTexto es una matriz de caracteres, donde cada elemento mide nCarac, el
texto de cada renglón está recostado sobre la izquierda y está rellenado
a la derecha con blancos.
--------------------------------------------------------------------------------
********** Devuelve una matriz con elementos/renglones de nCaracteres cada uno.
FUNC GRAPPA(cCadena, nCaracteres)
LOCAL aTexto := {}
LOCAL nCont := 0
LOCAL lMuyLarga := .F.

cCadena := IF(cCadena == NIL, '', LTRIM(cCadena))
nCaracteres := IF(nCaracteres == NIL, 0, nCaracteres)

IF nCaracteres > 0
IF LEN(cCadena) > nCaracteres
WHILE LEN(cCadena) > 0
WHILE chr(13)+chr(10) $ LEFT(cCadena, nCaracteres)
IF LEFT(cCadena,2) == chr(13) + chr(10)
AADD(aTexto, SPACE(nCaracteres))
ELSE
AADD(aTexto, PADR(LEFT(cCadena,AT(chr(13)+chr(10),cCadena)-1), nCaracteres))
ENDIF
cCadena := SUBSTR(cCadena, AT(chr(13)+chr(10),cCadena)+2)
ENDDO
IF LEN(cCadena) <= nCaracteres
AADD(aTexto, PADR(cCadena, nCaracteres))
EXIT
ELSE
IF SUBSTR(cCadena, nCaracteres, 1) == ' ' .OR. ;
SUBSTR(cCadena, nCaracteres+1, 1) == ' ' .OR. ;
SUBSTR(cCadena, nCaracteres, 1) == CHR(13) .OR. ;
SUBSTR(cCadena, nCaracteres+1, 1) == CHR(13)
* El último carácter o el primero del siguiente es justo
* un espacio en blanco o un retorno de carro
IF SUBSTR(cCadena, nCaracteres, 1) == CHR(13)
AADD(aTexto, PADR(LEFT(cCadena, nCaracteres-1), nCaracteres))
cCadena := LTRIM(SUBSTR(cCadena, nCaracteres))
ELSE
AADD(aTexto, PADR(LEFT(cCadena, nCaracteres), nCaracteres))
cCadena := LTRIM(SUBSTR(cCadena, nCaracteres + 1))
ENDIF
ELSE
nCont := nCaracteres
lMuyLarga := .T.
WHILE --nCont > 0
IF SUBSTR(cCadena, nCont, 1 ) == ' ' .OR. ;
SUBSTR(cCadena, nCont, 1 ) == CHR(13)
IF nCont == 1
IF SUBSTR(cCadena, nCont, 1) == CHR(13)
AADD(aTexto, SPACE(nCaracteres))
cCadena := LTRIM(SUBSTR(cCadena, 3))
ELSE
cCadena := LTRIM(SUBSTR(cCadena, 2))
ENDIF
ELSE
IF SUBSTR(cCadena, nCont, 1 ) == CHR(13)
AADD(aTexto, PADR(LEFT(cCadena, nCont-1), nCaracteres))
cCadena := LTRIM(SUBSTR(cCadena, nCont))
ELSE
AADD(aTexto, PADR(LEFT(cCadena, nCont), nCaracteres))
cCadena := LTRIM(SUBSTR(cCadena, nCont + 1))
ENDIF
lMuyLarga := .F.
ENDIF
EXIT
ENDIF
ENDDO
IF lMuyLarga
AADD(aTexto, PADR(LEFT(cCadena, nCaracteres), nCaracteres))
cCadena := LTRIM(SUBSTR(cCadena, nCaracteres + 1))
ENDIF
ENDIF
ENDIF
ENDDO
ELSE
AADD(aTexto, cCadena)
ENDIF
ELSE
AADD(aTexto, '')
ENDIF

RETURN(aTexto)

**********

Publicado: Jue May 17, 2007 11:04 pm
por homerg
podrias poner un ejemplo para terminar de entenderte?

un ejemplo no de codigo, si no del string que tienes y como quieres que quede!!!!

asi terminaria de entender lo que necesitas...

gracias.. saludos!!!

AYUDA CON FUNCION

Publicado: Sab May 19, 2007 11:35 am
por ANTON52
Ante todo gracias por contestar:
La funcion en si seria Funcion(nombrevar,n), nonbrevar el nombre de la variable de texto, y n la longitud de esta variable,
ejemplo: me creo una variable de texto de longitud 30, en ella escribo "hola que tal estas", la longitud de este testo es 18, entonces aplicandole la funcion quedaria asi, "hola que tal estas", como lo haria un editor de texto.repartiendo los espacios en blanco sobrantes por la derecha entre las palabras y ajustando la ultima palabra por la derecha.

Perdona si no me explico bien

Gracias de nuevo.

Publicado: Sab May 19, 2007 11:38 am
por ANTON52
Hola de nuevo, en el ejemplo no me ha respetado los espacios en blanco, entra las palabras, la pongo con guiones.
"Hola-----que-----tal-----estas" los guiones serian espacios en blanco.