Hola todos,
Estoy intentado detectar el salto de línea en un texto que está en una variable, lo hago así:
// CRLF Chr(13)+Chr(10)
If At( Chr(13), aTextLines[nLenaTextLines] ) > 0
o
If At( Chr(10), aTextLines[nLenaTextLines] ) > 0
Pero no hay manera.
Ustedes saben como detectarlo?
Muchas gracias
Detectar slato de línea en una variable.
- karinha
- Posts: 7935
- Joined: Tue Dec 20, 2005 7:36 pm
- Location: São Paulo - Brasil
- Been thanked: 3 times
- Contact:
Re: Detectar slato de línea en una variable.
C:\FWH\SOURCE\CLASSES\TTXTFILE.PRG
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
- cmsoft
- Posts: 1297
- Joined: Wed Nov 16, 2005 9:14 pm
- Location: Mercedes - Bs As. Argentina
- Been thanked: 2 times
Re: Detectar slato de línea en una variable.
Puedes recorrer el texto y buscar los saltos
En este caso lo dejo en un arreglo y muestro el resultado.
Pero hay varias formas de hacerlo... esta puede ser una
Code: Select all | Expand
#include "FiveWin.ch"
FUNCTION Main()
Local cText := memoread( 'texto.txt' ), i, aResult := {}, cLine := ''
FOR i := 1 TO LEN(cText)
IF SUBSTR(cText,i,1) == CHR(13)
AADD(aResult,cLine)
cLine := ''
ELSE
cLine := cLine + SUBSTR(cText,i,1)
ENDIF
NEXT i
xbrowse(aResult)
RETURN nil
Pero hay varias formas de hacerlo... esta puede ser una
Re: Detectar slato de línea en una variable.
Hola a todos,
Antes de nada muchas gracias por los aportes, he podido solucionar mi problema (lo estaba haciendo mal).
Esto lo ha aplicado a la clase TImprime de The Full (perdona, no te he pedido permiso).
El caso es que ahora con esta clase puedo imprimir párrafos justificados con/sin salto de línea intercalado con tipos de letra proporcional.
He realizado estos cambios:
12/05/2024 C.Gelabert
+ Agefit METHOD AnchoText( cText,oFont ) per saber l'amplada d'un text en base a la oFont (de oPrinter)
Útil per poder justificar amb tipus de lletra proporcional.
És igual al METHOD AnchoMayor( cText,oFont ) de UTILPRN.PRG
* Canviat nom de METHOD MEMO (original de la clase) a METHOD MEMO_20011212
+ Afegit nou METHOD MEMO per indicar si es vol justificar el text i l'amplada en centímetres.
* El METHOD MEMO permet justificar el text en una amplada en centímetres (per servir
per a tipus de lletra proporcional), permet traballar per defecte amb el METHOD MEMO_20011212 (original
de la clase).
METHOD MEMO treballa en nombre de caràcters ( nLine ), o en CENTÍMETRES ( nCm )(*).
(*) nCm debe ser mayor de 2 para usarse.
* Al UtilPrn.ch afegida possibilitat de JUSTIFY i centímetres pel MEMO.
#xcommand IMPRIME ;
MEMO <cText> ;
[ COL <nCol> ] ;
[ LINES <nLine> ];
[ FONT <oFont> ] ;
[ COLOR <nClrText> ];
[ SEPARATOR <nSeparator> ] ;
[ <lJump :JUMP> ];
[ <lJustify :JUSTIFY> ];
[ CM <nCm> ] ;
=>;
::MEMO( <nCol>, <cText>, <nLine>, <nSeparator>, <oFont>, <nClrText>, <.lJump.>, <.lJustify.>, <nCm> )
Seguro que se puede mejorar, a mi ya me vale así.
Muchas gracias,
Antes de nada muchas gracias por los aportes, he podido solucionar mi problema (lo estaba haciendo mal).
Esto lo ha aplicado a la clase TImprime de The Full (perdona, no te he pedido permiso).
El caso es que ahora con esta clase puedo imprimir párrafos justificados con/sin salto de línea intercalado con tipos de letra proporcional.
He realizado estos cambios:
12/05/2024 C.Gelabert
+ Agefit METHOD AnchoText( cText,oFont ) per saber l'amplada d'un text en base a la oFont (de oPrinter)
Útil per poder justificar amb tipus de lletra proporcional.
És igual al METHOD AnchoMayor( cText,oFont ) de UTILPRN.PRG
* Canviat nom de METHOD MEMO (original de la clase) a METHOD MEMO_20011212
+ Afegit nou METHOD MEMO per indicar si es vol justificar el text i l'amplada en centímetres.
* El METHOD MEMO permet justificar el text en una amplada en centímetres (per servir
per a tipus de lletra proporcional), permet traballar per defecte amb el METHOD MEMO_20011212 (original
de la clase).
METHOD MEMO treballa en nombre de caràcters ( nLine ), o en CENTÍMETRES ( nCm )(*).
(*) nCm debe ser mayor de 2 para usarse.
* Al UtilPrn.ch afegida possibilitat de JUSTIFY i centímetres pel MEMO.
#xcommand IMPRIME ;
MEMO <cText> ;
[ COL <nCol> ] ;
[ LINES <nLine> ];
[ FONT <oFont> ] ;
[ COLOR <nClrText> ];
[ SEPARATOR <nSeparator> ] ;
[ <lJump :JUMP> ];
[ <lJustify :JUSTIFY> ];
[ CM <nCm> ] ;
=>;
::MEMO( <nCol>, <cText>, <nLine>, <nSeparator>, <oFont>, <nClrText>, <.lJump.>, <.lJustify.>, <nCm> )
Code: Select all | Expand
*******************************************************************************
METHOD MEMO( nCol, cText, nLine, nSeparator, oFont, nColor, lJump, lJustifica, nCm ) CLASS TIMPRIME
Local nLineas := 0
Local nLineastotal := 0
Local aTextLines := {}
Local nLenaTextLines := 0
Local nPoscText := 1
Local nDummy := 1
Local nEspais := 1
DEFAULT nLine := 60,;
nCol := 1,;
oFont := ::oFnt5,;
lJump := .F., ;
lJustifica := .F., ;
nCm := 2 // Podía haber indicado otro valor, me pareció adecuado.
IF Empty( cText )
Return NIL
ENDIF
IF lJump
::Separator( nSeparator )
ENDIF
// traza( 1, "lJustifica=", lJustifica )
If lJustifica .or. nCm > 2
If ::AnchoText( cText,oFont ) <= nCm
UTILPRN ::oUtil Self:nLinea,nCol SAY cText FONT oFont COLOR nColor
::Separator( nSeparator )
Else
AADD( aTextLines, "" )
nLenaTextLines := Len( aTextLines )
While nPoscText <= Len( RTrim( cText ) )
// CRLF Chr(13)+Chr(10)
// Els 2 següents caràcters són un salt de línia.
If AT( CRLF, SubStr( cText, nPosctext, 2 ) ) > 0
AADD( aTextLines, "" )
nLenaTextLines := Len( aTextLines )
nPosctext := nPosctext + 2
ElseIf AT( Chr(13), SubStr( cText, nPosctext, 1) ) > 0
AADD( aTextLines, "" )
nLenaTextLines := Len( aTextLines )
nPosctext := nPosctext + 1
ElseIf AT( Chr(10), SubStr( cText, nPosctext, 1) ) > 0
AADD( aTextLines, "" )
nLenaTextLines := Len( aTextLines )
nPosctext := nPosctext + 1
// Els 2 següents caràcters NO són un salt de línia.
Else
// Si afegeixo el següent caràcter superaré el límit del text.
If ( ::AnchoText( aTextLines[nLenaTextLines] + SubStr( cText, nPosctext, 1 ), oFont ) > nCm )
// Cerco el darrer espai de la cadena i així no parteixo paraules.
While Right( aTextLines[nLenaTextLines], 1 ) <> " "
aTextLines[nLenaTextLines] := SubStr( aTextLines[nLenaTextLines], 1, Len( aTextLines[nLenaTextLines] ) - 1 )
nPosctext := nPosctext - 1
End
If lJustifica
// Es justificarà el text afegin un espai a on hi hagi un altre, mentre no s'arribi al límit de la longitud establerta.
While ::AnchoText( aTextLines[nLenaTextLines], oFont ) < nCm
// Es recorre el text des del primer caràcter cercant espais en blanc,començant a cercar per 1 espai, 2 espais, 3 espais,...
While nDummy < Len( aTextLines[nLenaTextLines] )
// Es trova el espai en blanc a on s'inserirà un espai addicional.
If SubStr( aTextLines[nLenaTextLines], nDummy, nEspais ) = Space( nEspais )
aTextLines[nLenaTextLines] := Left( aTextLines[nLenaTextLines], nDummy ) + SubStr( aTextLines[nLenaTextLines], nDummy, Len( aTextLines[nLenaTextLines] ) )
nDummy++
If ::AnchoText( aTextLines[nLenaTextLines], oFont ) >= nCm
Exit
EndIf
// Estic al final de la línia, s'afegeix un espai al final i es tornarà a cercar més espais des del inici del text.
ElseIf Len( SubStr( aTextLines[nLenaTextLines], nDummy, nEspais ) ) < nEspais
aTextLines[nLenaTextLines] := aTextLines[nLenaTextLines] + " "
Exit
EndIf
nDummy++
End
nEspais++
nDummy := 1
End
EndIf
AADD( aTextLines, "" )
nLenaTextLines := Len( aTextLines )
// Si afegeixo el següent caràcter NO superaré el límit.
Else
aTextLines[nLenaTextLines] := aTextLines[nLenaTextLines] + SubStr( cText, nPosctext, 1 )
nPosctext := nPosctext + 1
EndIf
EndIf
End
nLineastotal := Len( aTextLines )
FOR nLineas := 1 TO nLineastotal
UTILPRN ::oUtil Self:nLinea,nCol SAY aTextLines[nLineas] FONT oFont COLOR nColor
::Separator( nSeparator )
NEXT
EndIf
Else
::MEMO_20011212( nCol,cText,nLine,nSeparator,oFont,nColor,lJump )
EndIf
Return NIL
*******************************************************************************
Muchas gracias,
Un Saludo
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
- nageswaragunupudi
- Posts: 10721
- Joined: Sun Nov 19, 2006 5:22 am
- Location: India
- Been thanked: 8 times
- Contact:
Re: Detectar slato de línea en una variable.
Can you kindly explain, what are the features this library and method has over and above our normal SayText() method of TPrinter class?
Regards
G. N. Rao.
Hyderabad, India
G. N. Rao.
Hyderabad, India
Re: Detectar slato de línea en una variable.
The author of the library is The Full (Rafa Carmona) from more than 20 years ago, it is TImprime() and TUtilPrn().nageswaragunupudi wrote:Can you kindly explain, what are the features this library and method has over and above our normal SayText() method of TPrinter class?
They are used together to format invoices, receipts, receipts, etc. using code. I don't know if it is currently 100% compatible in all its source code with FiveWin (The Full can tell us that), since I use few of its functions.
I don't know if SayText() from TPrinter class can justify text, but I was already using this library and didn't want to switch to Tprinter() for convenience.
Un Saludo
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
Carlos G.
FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10