Problem beim Drucken

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.

Problem beim Drucken

Beitragvon wennerer » 9. Sep 2018, 18:20 Problem beim Drucken

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.
 
 
wennerer
 
Beiträge: 22
Registriert: 19. Mai 2015, 19:05
OS, Lazarus, FPC: Ubuntu 16.04, Lazarus 1.6, FPC 3.0.0 | 
CPU-Target: xxBit
Nach oben

• Themenende •

Zurück zu Sonstiges



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

porpoises-institution
accuracy-worried