FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Gracias
Gracias de todas maneras
Voy a intentar mandar el texto por impresion mediante el SERVER de Word, espero se pueda, ya mande la impresion y el texto, falta solamente la parte de justificar. En cuanto termine, lo publicare aqui por si a alguien le intereza. No es muy elegante la solucion, ya que necesito de word, pero casi todas las maquinas ya lo tienen instalado, pero funciona, de todas maneras si alguien conoce una forma ya sea con APIs o algo parecido, sera bien aceptada. |
#2
|
|||
|
|||
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; |
#3
|
||||
|
||||
Asi si se puede
Usa Rave report, los componentes tienen la propiedad Block que justifica como quieres.
Saludos. |
|
|
|