PDA

Ver la Versión Completa : Imprimir con TPrinter varias hojas


ivantj
19-09-2012, 05:20:40
Hola que tal comunidad, queria exponer un problema que tengo con la impresion usando TPrinter, necesito imprimir los datos que me traigo de una consulta, lo cual si se hace, y usando el un while puedo imprimir varias lineas y logro imprimir todos los datos, el problema que tengo es que
las lineas de datos son variables, puedes ser 2, 3 o hasta 100 lineas por lo cual ocupo que al final de la hoja, imprima en otra y que en el pie de la pagina me muestre datos para que firmen, pero no se como contabilizar o hacer para que imprimir ciertas lineas y despues de un numero X de lineas, me ponga los datos para que firmen y continue en una segunda pagina, o tercera dependiendo la cantidad de registros, esa es mi duda.

Encontre un codigo dentro del foro y ya hice algunas pruebas pero no me sale, simple y sencillamente no he podido llenar con un for o while las lineas que me hacen falta para despues deplegar los datos en donde firmen :( no se si alguien haya tenido el mismo problema que me pueda ayudar, por que la verdad si lo ocupo, o si alguien me pudiera dar una idea, gracias

procedure TfrmImprimirCheque.Button1Click(Sender: TObject);
var
r: TRect;
i: Integer;
begin
with Printer do
begin
r := Rect(200,200,(Pagewidth - 200),(PageHeight - 200));
BeginDoc;
Canvas.Brush.Style := bsClear;
for i := 0 to Memo1.Lines.Count do
Canvas.TextOut(200,200 + (i *
Canvas.TextHeight(Memo1.Lines.Strings[i])),
Memo1.Lines.Strings[i]);

Canvas.Brush.Color := clBlack;
Canvas.FrameRect(r);
EndDoc;
end;
end;


Este es el codigo con el que imprimo las lineas, pero no entiendo como apartir de un cierto numero de lineas, imprima los datos para que firmen y al final de la hoja, continue en otra nueva :(, de antemano gracias por la ayuda.

ivantj
19-09-2012, 08:32:20
Oh alguien que me pueda decir, la forma en como puedo contabilizar las lineas que contiene una hoja, para darme una idea de cuantas lineas tienen que pasar para ejecutar el codigo y enviar a una segunda hoja, espero me puedan ayudar

newtron
19-09-2012, 09:34:11
Hola.

Cuando usas un modo de impresión gráfico no existe el concepto de líneas, eso es imprimiendo en modo texto en impresoras matriciales.

Para solucionar tu problema debes de saber cuanto mide el documento en el que vas a imprimir (si es tamaño folio sería 210x297), después, partiendo de cero vas sumando la altura de lo que vas imprimiendo y cuando veas que el acumulado de lo que llevas impreso va a pasar el largo del documento menos un margen adecuado saltas de página.

Saludos

ivantj
19-09-2012, 10:30:03
ok gracias, pues si mira el tipo de documento es de tipo Carta, es una hoja tamanio carta, pero suponiendo que encuentro mas o menos cuantas lineas toma esa hoja, la pregunta es, en la opcion del Canvas.Textout(); como defino dentro apartir de cuantas lineas genero una hoja nueva, o apartir de cuantas lineas imprimo la parte de firmas y continuo en otra hoja, esa es la duda mas que nada, por que he buscado informacion pero no he encontrado nada, o mejor dicho algo que explique parte del codigo, ya que es la primera vez que me veo en la necesidad de imprimir sin un reporteador ya que son solo datos de una consulta y que no requiere tanta implementacion, por eso utilice mejor el Tprinter.

muchas gracias por la ayuda, y a ver si alguien ya ha pasado por esto y pudiera poner algun ejemplo de como hacerle,





datos datos datos datos datos datos datos datos
datos datos datos datos datos datos datos datos
datos datos datos datos datos datos datos datos
datos datos datos datos datos datos datos datos
datos datos datos datos datos datos datos datos
datos datos datos datos datos datos datos datos

//Si me paso de un cierto numero de lineas,
//Imprimo las Firmas
---------- ----------- --------- -----------
nombre1 nombre2 nombre3 nombre4


//Continuar en otra hoja imprimiendo
datos datos datos datos datos datos datos datos
datos datos datos datos datos datos datos datos
datos datos datos datos datos datos datos datos



en si es lo que quiero, pero como repito, es una hoja tamanio carta, y quisiera saber como pasar a una nueva pagina si la cantidad de datos
es mayor que la hoja, y en dado caso de que los datos sean pocos, que las firmas salgan hasta el pie de pagina, hasta abajo, lo cual indica que tendria que llenar la hoja de espacios en blanco hasta llegar al pie de pagina para desplegar las firmas, no se si me explico bien o no :(, gracias de antemano si me pueden ayudar.

newtron
19-09-2012, 11:13:41
A ver....

Suponiendo que el documento tenga 210 de ancho por 148 de alto que sería la mitad de un A4 tendrías que hacer lo siguiente:

Te pongo una idea de cómo podrías hacerlo que deberás retocar (no lo he probado).


LongitudImpresa:=10; // Aquí vamos a almacenar el tamaño impreso del documento, dejamos un pequeño margen por arriba
for i := 0 to Memo1.Lines.Count do begin
Canvas.TextOut(200,LongitudImpresa,Memo1.Lines.Strings[i]);
LongitudImpresa:=LongitudImpresa+Micanvas.TextHeight(Memo1.Lines.Strings[i]);
If LongitudImpresa>130 then begin // Dejamos el margen inferior en blanco
Printer.NewPage;
LongitudImpresa:=10; // Saltamos de página y volvemos a inicializar la variable
end;
end;



Espero que esto te sirva de algo
Saludos

ivantj
19-09-2012, 16:36:31
Muchas gracias Newtron, probare tu codigo, sorry si respondo hasta ahora pero ya era de madrugada cuando te respondi, ahorita probare tu codigo para imprimir directamente y hacer las pruebas, muchas gracias por la respuesta, y reporto los resultados.


yo estaba viendo el uso de tprinter pero por lineas de codigo, creo que no lei bien la respuesta por que ya veo que se trabaja segun la medida del documento a imprimir :S:S:S, muchas gracias