Problem beim Drucken

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Problem beim Drucken

Beitrag von wennerer »

Hallo an Alle,
ich möchte eine Grafikausgabe mit Printer.Canvas ausdrucken. Mein Betriebsystem ist Ubuntu 16.04. Dazu habe ich mir im Wiki die Seite "using the printer" durchgelesen und meinen Code daran angelegt. Das Drucken geht jetzt soweit ganz gut. Probleme habe ich aber mit dem Auszentrieren auf der Seite. Ich habe in untenstehendem Programmcode drei Varianten probiert. Bei Variante 1 mit workrect dachte ich eigentlich es würde die ganze Form in den Druckbereich gedruckt. Ergebnis war aber dass das größte Rechteck (das die Größe der Form simulieren soll) rechts und unten abgeschnitten wird. Bei Variante 3 und 4 habe ich eigentlich erwartet dass das gestrichelte Rechteck auf den Seitenrändern liegt. Hier werden aber alle drei Rechtecke rechts und unten abgeschnitten. Wer weiß wo mein Denkfehler liegt?

Viele Grüße
Bernd

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,StdCtrls,Printers;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1 : TButton;
    procedure FormCreate(Sender: TObject);
    procedure drucken1(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1        : TForm1;
  dpi          : integer;
  Druckbereich : TRect;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
 
begin
  dpi:=72;
  Form1.Caption   := 'Drucke die ganze Form';
  Form1.Left      :=  250;
  Form1.Top       :=  100;
  Form1.Width     := round((297*dpi)/25.4); //A4 so das es in meinen Bildschirm passt
  Form1.Height    := round((210*dpi)/25.4);
  Form1.Color     := clwhite;
 
  Button1         := TButton.Create(self);
  Button1.Parent  := Form1;
  Button1.Left    :=  20;
  Button1.Top     := 550;
  Button1.Height  :=  25;
  Button1.Width   := 100;
  Button1.Caption := 'Drucken1';
  Button1.OnClick := @drucken1;
 
  Printer.Orientation:=poLandscape;
  Druckbereich.Left   :=round((printer.PaperSize.PaperRect.WorkRect.Left)*dpi/Printer.XDPI);
  Druckbereich.Top    :=round((printer.PaperSize.PaperRect.WorkRect.Top)*dpi/Printer.YDPI);
  Druckbereich.Right  :=round((printer.PaperSize.PaperRect.WorkRect.Right)*dpi/Printer.XDPI);
  Druckbereich.Bottom :=round((printer.PaperSize.PaperRect.WorkRect.Bottom)*dpi/Printer.YDPI);
 
 
end;
 
procedure TForm1.drucken1(Sender: TObject);
var myBitMap     : TBitMap;
    rct           : TRect;
    HScaleFactor, VScaleFactor: single;
begin
 
 
  HScaleFactor:=Printer.XDPI/dpi;            //Screen.PixelsPerInch=Auflösung Bildschirm
  VScaleFactor:=Printer.YDPI/dpi;
  myBitMap := TBitMap.Create;
  try
    myBitMap.LoadFromDevice(Canvas.Handle); //Hier hat myBitMap die Größe Form1.width bzw. height
    rct:=Rect(0, 0, trunc(myBitMap.Width*HScaleFactor), trunc(myBitMap.Height*VScaleFactor));
   Printer.BeginDoc;
    try
     //Variante1:
       Printer.Canvas.StretchDraw(printer.PaperSize.PaperRect.WorkRect, myBitMap);
     //Variante2:
       //Printer.Canvas.StretchDraw(Rect(0,0,Printer.PaperSize.Width,Printer.PaperSize.Height), myBitMap);
     //Variante3:
       //printer.Canvas.StretchDraw(rct,myBitMap);
    finally
      Printer.EndDoc;
    end;
  finally
    myBitMap.Free;
  end;
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Brush.Color  := clwhite;
  //Rechteck mit Blattgröße:
  Canvas.Rectangle(0,0,Form1.Width,Form1.Height);
  Canvas.Pen.Color    := clblue;
  Canvas.Pen.Style    := psdot;
  //Rechteck vom Druckbereich:
  Canvas.Rectangle(Druckbereich);
  Canvas.Pen.Color    := clblack;
  Canvas.Pen.Style    := pssolid;
  //Rechteck minimal kleiner als Druckbereich:
  Canvas.Rectangle(Druckbereich.Left+2,Druckbereich.Top+2,Druckbereich.Right-2,Druckbereich.Bottom-2);
  //das was halt so ausgegeben werden soll:
  Canvas.Rectangle(50,50,150,150);
 
end;
 
end.
 
 

Antworten