Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stringrid mit Gitternetzlineien drucken (https://www.delphipraxis.net/50958-stringrid-mit-gitternetzlineien-drucken.html)

hgiel 3. Aug 2005 11:50


Stringrid mit Gitternetzlineien drucken
 
Hallo,

möchte die Daten eines Stinggrids ausdrucken - soweit kein Problem, da gibts ja viele Hinweise! Zur verbesserten Darstellung möchte ich aber mindestens unter jeder Zeile ein Trenlinie, idealerweise aber komplette Gitternetzlinien (wie in Excel) mit ausdrucken.

Der Code bisher mit "einprogrammierten" Trennlinien, aber auch mit Problemen beim Ausdruck von mehreren Seiten:

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 := 200;
  FooterSize := 150;
  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.Font.Height := FontHeight;

    Printer.Canvas.TextOut(0,-100, 'Abfahrtsdatum: '+datetostr(form1.datetimepicker3.date)+' - Zugnummer: '+form1.combobox1.Text+' - von Bhf: '+vonbhf+' - bis Bhf: '+bisbhf+' - Linie: '+linie+' - Produkt: '+produkt);

    // Spalten-Überschriften:
    Printer.Canvas.Font.Height := FontHeight-5;

    XPos := 0;

    for J := 0 to 20 do
    begin
      Printer.Canvas.TextOut(XPos, - 160,
        Grid.Cells[J, 0]);
      XPos := XPos + Grid.ColWidths[J] * 2 + 25;
    end;

    // Linie unter Überschriften
    Printer.Canvas.Pen.Width := 5;
    Printer.Canvas.MoveTo(0, - HeaderSize);
    Printer.Canvas.LineTo(HorzSize, - HeaderSize);

    //Fußzeile

    // Linie über 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 + 140,Footer);

    //Zeilen drucken
    Printer.Canvas.Font.Height := FontHeight-5;
    YPos := HeaderSize + 25;

    // for I := 1 to Zeilen do
    if Seite=1 then
            begin
                  for I := 2 to Zeilen do // 2 und nicht 1 - wegen fester Kopfzeile in Bildschirm-Stringgrid
                  begin
                    if Grid.RowCount >= I + (Seite-1)*Zeilen then
                    begin
                      XPos := 0;

                      for J := 0 to 20 do
                      begin
                        Printer.Canvas.TextOut(XPos, - YPos,
                          Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
                        XPos := XPos + Grid.ColWidths[J] * 2 + 25;
                      end;

                      YPos := YPos + ZeilenSize;

                      // Linie nach jedem Datensatz
                      Printer.Canvas.Pen.Width := 2;
                      Printer.Canvas.MoveTo(0, - YPos);
                      Printer.Canvas.LineTo(HorzSize, - YPos);

                      YPos := YPos + ZeilenSize;
                    end;
                  end;
            end
    else
            begin
                  for I := 1 to Zeilen do
                  begin
                    if Grid.RowCount >= I + (Seite-1)*Zeilen then
                    begin
                      XPos := 0;

                      for J := 0 to 20 do
                      begin
                        Printer.Canvas.TextOut(XPos, - YPos,
                          Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
                        XPos := XPos + Grid.ColWidths[J] * 2 + 25;
                      end;

                      YPos := YPos + ZeilenSize;

                      // Linie nach jedem Datensatz
                      Printer.Canvas.Pen.Width := 2;
                      Printer.Canvas.MoveTo(0, - YPos);
                      Printer.Canvas.LineTo(HorzSize, - YPos);

                      YPos := YPos + ZeilenSize;
                    end;
                  end;
            end;
    //Seite hinzufügen
    Inc(Seite);
    if Seite <= AnzSeiten then Printer.NewPage;
  end;
  Printer.EndDoc;
end;
Vielen Dank und Gruß,

Heinz


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 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