Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Drucken, Stringgrid, Bitmap einfügen (https://www.delphipraxis.net/205507-drucken-stringgrid-bitmap-einfuegen.html)

S4SH1981 17. Sep 2020 15:45

Delphi-Version: 10.4 Sydney

Drucken, Stringgrid, Bitmap einfügen
 
Hallo an das Forum,

Delphi-Quellcode:
//StringGrid Inhalt ausdrucken
procedure PrintStringGrid(Grid: TStringGrid; Title: string;
  Orientation: TPrinterOrientation);
var
  P, I, J, YPos, XPos, HorzSize, VertSize: Integer;
  AnzSeiten, Seite, Zeilen, HeaderSize, FooterSize, ZeilenSize, FontHeight: Integer;
  mmx, mmy: Extended;
  Footer: string;
begin
  //Kopfzeile, Fußzeile, Zeilenabstand, Schriftgröße festlegen
  HeaderSize := 100;
  FooterSize := 200;
  ZeilenSize := 36;
  FontHeight := 36;
  //Printer initializieren
  Printer.Orientation := Orientation;
  Printer.Title := Title;
  Printer.BeginDoc;
  //Druck auf mm einstellen
  mmx := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) /
    GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 25.4;
  mmy := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) /
    GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 25.4;

  VertSize := Trunc(mmy) * 10;
  HorzSize := Trunc(mmx) * 10;
  SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);

  //Zeilenanzahl festlegen
  Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize;
  //Seitenanzahl ermitteln
  if Grid.RowCount mod Zeilen <> 0 then
    AnzSeiten := Grid.RowCount div Zeilen + 1
  else
    AnzSeiten := Grid.RowCount div Zeilen;

  Seite := 1;
  //Grid Drucken
  for P := 1 to AnzSeiten do
  begin
    //Kopfzeile
    Printer.Canvas.Font.Height := 48;
    Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Title) div 2)),
      - 20,Title);
    Printer.Canvas.Pen.Width := 5;
    Printer.Canvas.MoveTo(0, - HeaderSize);
    Printer.Canvas.LineTo(HorzSize, - HeaderSize);
    //Fußzeile
    Printer.Canvas.MoveTo(0, - VertSize + FooterSize);
    Printer.Canvas.LineTo(HorzSize, - VertSize + FooterSize);
    Printer.Canvas.Font.Height := 36;
    Footer := 'Seite: ' + IntToStr(Seite) + ' von ' + IntToStr(AnzSeiten);
    Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Footer) div 2)),
      - VertSize + 150,Footer);
    //Zeilen drucken
    Printer.Canvas.Font.Height := FontHeight;
    YPos := HeaderSize + 10;
    for I := 1 to Zeilen do
    begin
      if Grid.RowCount >= I + (Seite - 1) * Zeilen then
      begin
        XPos := 0;
        for J := 0 to Grid.ColCount - 1 do
        begin
          Printer.Canvas.TextOut(XPos, - YPos,
            Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
          XPos := XPos + Grid.ColWidths[J] * 3;
        end;
        YPos := YPos + ZeilenSize;
      end;
    end;
    //Seite hinzufügen
    Inc(Seite);
    if Seite <= AnzSeiten then Printer.NewPage;
  end;
  Printer.EndDoc;
end;

//Example
procedure TForm1.Button1Click(Sender: TObject);
begin
  //Drucken im Querformat
  PrintStringGrid(Grid, 'StringGrid Print Landscape', poLandscape);
  //Drucken im Hochformat
  PrintStringGrid(Grid, 'StringGrid Print Portrait', poPortrait);
end;
ich benutze diesen Code um ein Stringgrid mehrseitig, falls erforderlich auszudrucken.
Dies funktioniert soweit ganz gut.
Ich möchte nun aber in dem Header ein Logo einfügen und komme hier nicht weiter.

Das Logo liegt als BMP vor, sodass ich es eigentlich mit
Delphi-Quellcode:
  with Printer do
  begin
    BeginDoc;
    Canvas.Draw(125,125,BitMap);
    EndDoc;
drucken kann.

Leider wird es als PDF Datei nicht angezeigt. Der Rest des Codes wird übernommen.

Meine Frage ist daher, wie ich dies nun einfüge.

Würde mich über einen Lösungsvoschlag sehr freuen.

Gruss S4SH

hoika 17. Sep 2020 16:00

AW: Drucken, Stringgrid, Bitmap einfügen
 
Hallo,
Zitat:

Leider wird es als PDF Datei nicht angezeigt.
Du druckst auf einen PDF-Drucker?

PS: Nach dem Code hier sollte es eigentlich klappen
http://delphiexamples.com/devices/printbitmap.html

S4SH1981 17. Sep 2020 16:36

AW: Drucken, Stringgrid, Bitmap einfügen
 
Hallo Hoika,

zu Testzwecken drucke ich über den Windows 10 PDF Drucker.
Hier sehe ich aber keine Probleme.

Den von Dir verlinkten Code nutze ich bereits.
Über eine normalen Button druckt er mir auch das Bitmap.

Meine Frage ist allerdings, wo ich diesen in die PrintStringgrid Prozedur einfügen muss, dass es auch gedruckt wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz