AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringrid mit Gitternetzlineien drucken

Ein Thema von hgiel · begonnen am 3. Aug 2005
Antwort Antwort
hgiel

Registriert seit: 4. Apr 2005
61 Beiträge
 
#1

Stringrid mit Gitternetzlineien drucken

  Alt 3. Aug 2005, 11:50
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:07 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