PDA

Ver la Versión Completa : Llamar procedimiento para impresion


leogobo
04-06-2011, 23:23:54
Hola,

estoy llamando a un procedimiento para impresión pero al hacer esto no esta cambiando el tipo de letra ni el font. Este el el codigo resumido de lo que estoy haciendo:


Procedure imprimir;
begin
form3.Canvas.Font.Color := clBlack;
form3.Canvas.Font.Size := 15;
Printer.Canvas.TextOut(250, 650, 'Destino: ');
end;

if printdialog1.Execute then
begin
with Printer do
try
Printer.BeginDoc;
imprimir;
finally
Printer.EndDoc;
end;
end;


Cuando imprime 'Destino: ' no lo hace con el tamaño y letra que especifico. Que hago mal??

Gracias

ecfisa
04-06-2011, 23:53:00
Hola.

Probá haciéndolo así:

...

uses Printers;

Procedure imprimir(Prn: TPrinter);
begin
with Prn do
begin
BeginDoc;
Canvas.Font.Color := clBlack;
Canvas.Font.Size := 15;
Canvas.TextOut(250, 650, 'Destino: ');
EndDoc;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Printer: TPrinter;
begin
if PrintDialog1.Execute then
begin
Printer:= TPrinter.Create;
try
imprimir(Printer);
finally
Printer.Free;
end;
end;
end;


Saludos.

leogobo
05-06-2011, 19:21:45
Vale, si funciono, pero cuando quiero hacer varias immpresiones, al momento de dar clic por segunda vez en el boton de imprimir aparece el error "SIGSEGV".

ecfisa
05-06-2011, 21:19:47
Hola leogobo.

Vas a tener que poner el el contéxto (código) donde se te presenta el error ya que si me limito al ejemplo no dá ningún error.
Hice con el mismo una prueba enviando más de diez veces consecutivas a imprimir sin problemas.


Saludos.

leogobo
05-06-2011, 21:50:13
Bueno, en seguida pongo el codigo completo que estoy utilizando:


Procedure imprimir(Prn: TPrinter);
var

bmp : TBitmap;
begin

with prn do
begin
BeginDoc;

canvas.pen.Width:=15;
canvas.Rectangle(40,40,3450,2430);

Canvas.Font.Name := 'Arial';
Canvas.Font.Color := clBlue;
Canvas.Font.Size := 22;
Canvas.TextOut(250, 250, 'CORRESPONDENCIA EL TIEMPO');

Canvas.Font.Color := clBlack;
Canvas.Font.Size := 15;
Canvas.TextOut(250, 650, 'Destino: ' + form3.DataSource1.DataSet.FieldByName('Ciudad Destino').AsString);

Canvas.TextOut(250, 850, 'Direccion: ' + form3.DataSource1.DataSet.FieldByName('Ruta').AsString);

Canvas.TextOut(250, 1050, 'Destinatario: ' +form3.DataSource1.DataSet.FieldByName('Nombre Destinatario').AsString);


Canvas.TextOut(250, 1550, 'Remitente: ' + form3.DataSource1.DataSet.FieldByName('Nombre Remitente').AsString);


Canvas.TextOut(250, 1750, 'Fecha envio: ' + form3.DataSource1.DataSet.FieldByName('Fecha').AsString);


Canvas.Font.Size := 30;
Canvas.Font.Name := 'Code128bWin';
Printer.Canvas.TextOut(2400, 2000,form3.DataSource1.DataSet.FieldByName('id').AsString);

newpage;
EndDoc;
end;
end;

procedure TForm3.Button1Click(Sender: TObject);

begin
u:=1;
If MessageDlg ('Desea imprimir la etiqueta para esta entrada?', mtConfirmation ,[mbyes,mbno],0) = mrYes Then
begin
if printdialog1.Execute then
begin
dbf2.Last;
try

while u <= StrToInt(contregedit.Text) do
begin
imprimir(Printer);
u:=u+1;
end;
finally
Printer.Free;
end;
end;
end;
end;


tambien tengo el problema que necesito imprimir varias paginas en el mismo documento, pero ya que enddoc; esta en el procedimiento solo se imprime de a una.

Mi intecion es que pueda utilizar el codigo del procedimiento en varias partes del programa sin tener que escribirlo de nuevo.

leogobo
06-06-2011, 02:18:49
Hola,

estaba cometiendo un error muy bobo, ya todo marcha bien.

Gracias

vitadiaz
06-06-2011, 03:44:13
Si solucionaste el problema
Deberias incorporar la solucion
Dado que puede que alguien reutilice el codigo deberias indicarnos cual fue la solucion a tu problema y asi potenciar este hilo proveyendo la solucion definitiva al tema
Salu2
Pd. es una cuestion de etica y salubridad informatica

leogobo
08-06-2011, 04:46:56
Bueno, pues el error básicamente era que si se observa en cada ciclo del while se llama al procedimiento "imprimir;", y ya que en este ciclo esta begindoc y enddoc, pues cada vez que entra en el, crea un nuevo documento, osea una por cada pagina.

Muchas gracias