![]() |
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; |
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.
|
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).
|
Re: Stringgrid drucken
Hallo...
also
Delphi-Quellcode:
bringt nichts, es wird immer noch gleichviel/wenig angezeigt.
FontHeight (z.B. 24)
Zitat:
capo |
Re: Stringgrid drucken
Zitat:
Delphi-Quellcode:
ist.
HorzSize >= Printer.Canvas.TextWidth(längste zu druckende Zeile)
|
Re: Stringgrid drucken
Aha...vielen Dank :)
gruss capo |
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?
|
Re: Stringgrid drucken
Mit Canvas.MoveTo und Canvas.LineTo die Linien selber zeichnen, etwas anderes fällt mir nicht ein.
|
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; |
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 21:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz