Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Stringgrid drucken (https://www.delphipraxis.net/95231-stringgrid-drucken.html)

capo 3. Jul 2007 17:13


Stringgrid drucken
 
Hallo

ich möchte ein Stringgrid ausdrucken, dazu verwende ich folgenden Code (s.u.)
Ich drucke schon im Querformat, bekomme in der Breite aber nicht alles auf den Ausdruck drauf.
An welcher Stelle im Code muss ich dafür Änderungen vornehmen?

gruss vom capo

Delphi-Quellcode:

uses
  printers;

//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);

end;

shmia 3. Jul 2007 18:04

Re: Stringgrid drucken
 
Ein kleinerer Wert für die Variable FontHeight (z.B. 24) reduziert die Schriftgrösse und damit auch die Breite der Zeilen.

DeddyH 3. Jul 2007 18:22

Re: Stringgrid drucken
 
Jepp, man könnte auch 2 Schleifen verwenden: die 1. ermittelt die längste zu druckende Zeile, die 2. reduziert die Schriftgröße so lange, bis diese Zeile auf das Blatt passt (Feintuning ist natürlich vonnöten, das soll nur als Ansatz dienen).

capo 3. Jul 2007 19:22

Re: Stringgrid drucken
 
Hallo...
also
Delphi-Quellcode:
FontHeight (z.B. 24)
bringt nichts, es wird immer noch gleichviel/wenig angezeigt.

Zitat:

man könnte auch 2 Schleifen verwenden: die 1. ermittelt die längste zu druckende Zeile, die 2. reduziert die Schriftgröße so lange, bis diese Zeile auf das Blatt passt
das hört sich sehr gut an, wie fang ich sowas an?

capo

bitsetter 3. Jul 2007 22:05

Re: Stringgrid drucken
 
Zitat:

Zitat von capo
Zitat:

man könnte auch 2 Schleifen verwenden: die 1. ermittelt die längste zu druckende Zeile, die 2. reduziert die Schriftgröße so lange, bis diese Zeile auf das Blatt passt
das hört sich sehr gut an, wie fang ich sowas an?

Die verkleinerst die Schrift solange bis
Delphi-Quellcode:
HorzSize >= Printer.Canvas.TextWidth(längste zu druckende Zeile)
ist.

capo 3. Jul 2007 22:09

Re: Stringgrid drucken
 
Aha...vielen Dank :)
gruss capo

Tod787 8. Jan 2009 23:13

Re: Stringgrid drucken
 
Also bei mir funktioniert das auch ziemlich gut. Allerdings hätte ich gerne noch die Gitterlinien mitausgedruckt. Weiß jemand wie ich das noch einbauen kann?

DeddyH 9. Jan 2009 10:27

Re: Stringgrid drucken
 
Mit Canvas.MoveTo und Canvas.LineTo die Linien selber zeichnen, etwas anderes fällt mir nicht ein.

Fever22 10. Jan 2009 09:01

Re: Stringgrid drucken
 
Also ich hab die Funktion bei mir auch erfolgreich eingebaut doch da mit mehreren Druckern gearbeitet wird müsste eine Druckerauswahl her. Hab hier im Forum auch nen Beispielcode gefunden. Aber mir fehlt noch der Ansatz für eine Implementierung.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender:TObject);

var
  I, Start, Stop: Integer;
begin
PrintDialog1.Options := [poPageNums, poSelection];
PrintDialog1.FromPage := 1;
PrintDialog1.MinPage := 1;
PrintDialog1.ToPage := PageControl1.PageCount;
PrintDialog1.MaxPage := PageControl1.PageCount;
if PrintDialog1.Execute then
  begin
    { Ausgewählten Druckbereich ermitteln }
    with PrintDialog1 do
    begin
      if PrintRange = prAllPages then

        begin
        Start := MinPage - 1;
        Stop := MaxPage - 1;
      end
      else if PrintRange = prSelection then
      begin
        Start := PageControl1.ActivePage.PageIndex;
        Stop := Start;
        end
      else { PrintRange = prPageNums }
      begin
        Start := FromPage - 1;
        Stop := ToPage - 1;
      end;
    end;
    { Jetzt die Seiten drucken }

    with Printer do
    begin
      BeginDoc;
      for I := Start to Stop do
      begin
        PageControl1.Pages[I].PaintTo(Handle, 10, 10);
        if I <> Stop then
          NewPage;
      end;
      EndDoc;
    end;
  end;

end;

Fever22 11. Jan 2009 19:35

Re: Stringgrid drucken
 
*schieb* :angel:

Steh da nämlich immer noch vorm Berg. Hat denn keiner einen Vorschlag? Will doch "nur" drucken...


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