![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#4
|
|||
|
|||
|
Justificar texto en Printer
Esta un poco largo el codigo, pero funciona correctamente para mandar a imprimir parrafos.
La funcion regresa el lugar donde se quedo la impresión anterio (altura) para poder mandar el siguiente parrafo a imprimir y corrige el problema de el redondeo a Integer. Saludos a todos, espero les sirva este codigo, q la verdad da mucha flojera pensar en hacerlo y validarlo y despues de unas 30 pruebas queda. Si alguien tiene un mejor método, por supuesto q lo acepto ![]() Function TFrmImp.Justifica(Const x0, xf, y0: Integer; Const Txt: String): Integer; // x0, xf = posicion de los margenes izquierdo y derecho // y0 = posicion vertical donde se desea empezar a escribir // txt = texto a escribir // y regresa la ultima posición yf para mandar el siguiente parrafo Var i, x, y, K, Ancho, Letra, Remanente: Integer; s, ss: String; x_spc: Double; Begin s:= Txt; y:= y0; Ancho:= (xf - x0); while s <> '' do begin // Obtener el renglon, de acuerdo al ancho y quitarlo de la cadena original ss:= ''; i:=0; While (Printer.Canvas.TextWidth(Copy(s,1,i))<=Ancho) AND (i<=Length(s)) do i:=i+1; ss:=Copy(s,1,i); // Retroceder hasta el primer espacio del hacia la izquierda de // la ss, para separar por palabra en caso de ser existir mas renglones if ss<>s then begin i:=Length(ss); While (Copy(ss,i,1)<>' ') AND (i>=1) do i:=i-1; // Eliminar espacio sobrantes if i=0 then i:=Length(ss); end; ss:=TrimRight(Copy(s,1,i)); s:=TrimLeft(Copy(s,i+1,Length(s)-i)); x_spc:= 0; x:= x0; If (Length(ss) > 1) And (s <> '') Then x_spc:=Printer.Canvas.TextWidth(ss); if (x_spc=Ancho) OR (x_spc=0) OR (s='') Then Printer.Canvas.TextOut(x,y,ss) else begin // Primer for para obtener el remanente por redondeo for k:=1 to Length(ss) do begin Letra:=Printer.Canvas.TextWidth('*' + ss[k] + '*') - Printer.Canvas.TextWidth('**'); if k<>Length(ss) then x:=x + Trunc(Letra*Ancho/x_spc) else x:=x + Letra; end; Remanente:=xf-x; x:= x0; // Segundo for imprime con el remanente aplicado a las primeras letras for k:=1 to Length(ss) do begin Printer.Canvas.TextOut(x,y, ss[k]); Letra:=Printer.Canvas.TextWidth('*' + ss[k] + '*') - Printer.Canvas.TextWidth('**'); if Remanente>0 then begin x:=x + Trunc(Letra*Ancho/x_spc)+1; Remanente:=Remanente-1; end else x:=x + Trunc(Letra*Ancho/x_spc); end; End; y:= y + Printer.Canvas.TextHeight(ss); End; Justifica:=y; End; |
|
|
|