Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Imprimir directamente (https://www.clubdelphi.com/foros/showthread.php?t=76920)

lucas05 04-12-2011 23:00:55

Imprimir directamente
 
Hola, como puedo hacer para imprimir enviando los datos directamente a la impresora.
Quiero que el usuario presione un button e imprima los datos de una tabla temporal ClientDataSet1, y también el contenido de EDit1, Edit2 (los edits tienen datos que son ingresados por el usuario).

Muchas Gracias.

ecfisa 05-12-2011 01:28:40

Cita:

Empezado por lucas05 (Mensaje 420474)
Hola, como puedo hacer para imprimir enviando los datos directamente a la impresora.
Quiero que el usuario presione un button e imprima los datos de una tabla temporal ClientDataSet1, y también el contenido de EDit1, Edit2 (los edits tienen datos que son ingresados por el usuario).

Hola lucas.

Un ejemplo:
Código Delphi [-]
...
uses Printers;

procedure TForm1.btnImprimirClick(Sender: TObject);
var
  i,x,y: Integer;
  s: string;
begin
  with TPrinter.Create do
  try
    i:= 1;
    BeginDoc;
    x := Printer.PageWidth div 15;
    y := Printer.PageHeight div 50;
    Canvas.Font.Name:= 'Times new Roman';
    Canvas.Font.Color:= clBlack;
    Canvas.Font.Height:= Printer.PageHeight div 100;
    ClientDataSet.First;
    while not ClientDataSet.Eof do
    begin
      s:= ClientDataSet.FieldByName('Campo1').AsString +' '+
          ClientDataSet.FieldByName('Campo2').AsString +' '+
          //...
          ClientDataSet.FieldByName('CampoN').AsString;
      Canvas.TextOut(x, i*y , s);
      ClientDataSet.Next;
      Inc(i);
    end;
    Canvas.TextOut(x, i*y, Edit1.Text);
    Inc(i);
    Canvas.TextOut(x, i*y, Edit2.Text);
    EndDoc;
  finally
    Free;
  end;
end;

Saludos.

lucas05 05-12-2011 03:54:52

Hola ecfisa, muchas gracias por tu ayuda, tu código funciona bien.
Quisiera mejorarlo un poco mas, para que se vea mejor.
Te explico que quiero hacer:
1) Agrandar un poco mas el tamaño de la impresión.
2) Imprimir el edit2 a la derecha del edit1 (o sea uno a la par del otro, pero separados por una pequeña distancia)
3) Poner una mensaje estático (como el QRLabel del QReport) a la izquierda de cada edit

Espero que puedas ayudarme. Desde ya Muchas Gracias.

ecfisa 05-12-2011 04:57:13

Hola Lucas.

Código Delphi [-]
uses Printers;

procedure TForm1.Button1Click(Sender: TObject);
var
  i,x,y: Integer;
  s: string;
begin
  with TPrinter.Create do
  try
    i:= 1;
    BeginDoc;
    x := Printer.PageWidth div 15;
    y := Printer.PageHeight div 50;
    Canvas.Font.Name:= 'Times new Roman';
    Canvas.Font.Color:= clBlack;
    Canvas.Font.Height:= Printer.PageHeight div 60; // Aumentar tamaño del font
    ClientDataSet.First;
    while not ClientDataSet.Eof do
    begin
      s:= ClientDataSet.FieldByName('Campo1').AsString +' '+
          ClientDataSet.FieldByName('Campo2').AsString +' '+
          //...
          ClientDataSet.FieldByName('CampoN').AsString;
      Canvas.TextOut(x, i*y , s);
      ClientDataSet.Next;
      Inc(i);
    end;
    s:= 'ETIQUETA1: '+Edit1.Text+'     ETIQUETA2: '+Edit2.Text; //2 edits en 1 linea, separados y c/u precedido por una etiqueta
    Canvas.TextOut(x, i*y, s);
    EndDoc;
  finally
    Free;
  end;
end;

Saludos.

lucas05 06-12-2011 20:10:06

Hola ecfisa, muchas gracias por tu ayuda, esta siendo muy útil.
Trate de agregarle mas cosas pero tuve algunos problemas:
1) Intente imprimir un titulo en el documento, pero no lo imprime, este es el código que utilice.
Código Delphi [-]
Printer.Title:='El titulo del documento';
2) Intente imprimir el contenido de dos label antes ClientDataSet,y tampoco lo imprime.
Código Delphi [-]
s:= 'Fecha: '+Label10.Caption+'     Nº: '+Label11.Caption;
    Canvas.TextOut(x, i*y, s);
3) Cuando imprimo el contenido del Edit3, este se imprime a la izquierda de la hoja, como puedo hacer para que salga un poco mas a la derecha de la hoja.

Muchas Gracias.

ecfisa 06-12-2011 20:27:20

Hola Lucas.

1) y 2):
Código Delphi [-]
  ...
    Canvas.Font.Color:= clBlack;
    Canvas.Font.Height:= Printer.PageHeight div 60; // Aumentar tamaño del font
    s:= 'El titulo del documento';
    Canvas.TextOut((Printer.PageWidth-Canvas.TextWidth(s)) div 2, i*y, s );  // Título centrado
    Inc(i);
    s:= 'Fecha: '+Label10.Caption+'     Nº: '+Label11.Caption;
    Canvas.TextOut(x, i*y, s);
    Inc(i);
    ClientDataSet.First;
    while not ClientDataSet.Eof do
    ...

3) No sé si se me está escapando... Pero no veo al Edit3 ni donde debería imprimirse


Saludos.

lucas05 06-12-2011 21:18:32

Hola, las modificaciones funcionan bien.
El edit3 debe imprimirse despues del ClientDataSet.
Código Delphi [-]
Canvas.TextOut(x, i*y,'Total: '+Edit3.Text);
Inc(i);
.
Como puedo dejar mas espacio entre las lineas, para que no se imprima todo junto.
Esta es la idea, imprimir el titulo del documento (dejar un espacio), luego imprimir los labels (dejar un espacio), imprimir el clientdataset (dejar un espacio) y por ultimo el edit3 (quiero que se imprima mas a la derecha de la hoja, debajo de la ultima columna del clientdataset).

Gracias.

ecfisa 06-12-2011 22:43:15

Hola Lucas.

A ver si de este modo te resulta más sencillo:
Código Delphi [-]
...
uses Printers;

function LinesDown(ACanvas: TCanvas; const Lineas: Integer): Integer;
begin
  ACanvas.TextOut(Printer.PageWidth div 15, Lineas*Printer.PageHeight div 50,'');
  Result:= Lineas
end;

procedure PrintLineAt(ACanvas:TCanvas; const X: Integer; var Y: Integer;
  const Str: string);
begin
  ACanvas.TextOut(ACanvas.TextWidth('O')*X, Y* Printer.PageHeight div 50, Str);
  Inc(Y)
end;

procedure PrintLine(ACanvas: TCanvas; const X:Integer; var Y: Integer;
  const Str: string);
begin
  Acanvas.TextOut(X, Y * Printer.PageHeight div 50, Str);
  Inc(Y)
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x, y: Integer;
  nLin: Integer;
  s: string;
begin
  with TPrinter.Create do
  try
    x := Printer.PageWidth div 15;
    y := Printer.PageHeight div 50;
    nLin:= 1;
    BeginDoc;
    Canvas.Font.Name:= 'Times new Roman';
    Canvas.Font.Color:= clBlack;
    Canvas.Font.Height:= Printer.PageHeight div 60;
    PrintLine(Canvas,(Printer.PageWidth-Canvas.TextWidth(s)) div 2, nLin, 'El titulo del documento');
    nLin:= LinesDown(Canvas, 3); // TRES LINEAS ABAJO
    PrintLine(Canvas, x, nLin, 'Fecha: '+Label10.Caption+'     Nº: '+  Label11.Caption);
    ClientDataSet.First;
    while not ClientDataSet.Eof do
    begin
      s:= ClientDataSet.FieldByName('Name').AsString +' '+
          ClientDataSet.FieldByName('Capital').AsString;
      PrintLine(Canvas,Printer.PageWidth div 15, nLin, s);
      ClientDataSet.Next;
    end;
    PrintLineAt(Canvas, 10, nLin, 'Total: '+ Edit3.Text);  // 10 A LA DERECHA
    PrintLine(Canvas, x, nLin,'ETIQUETA1: ' + Edit1.Text + '  ETIQUETA2: ' + Edit2.Text);
    EndDoc;
  finally
    Free;
  end;
end;

Saludos.


La franja horaria es GMT +2. Ahora son las 15:50:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi