Ver Mensaje Individual
  #4  
Antiguo 30-01-2004
fabian_hr fabian_hr is offline
Registrado
 
Registrado: dic 2003
Ubicación: Toluca, Mexico
Posts: 5
Reputación: 0
fabian_hr Va por buen camino
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;
Responder Con Cita