![]() |
StringGrid mit Farben drucken
Hallo zusammen,
wie kann ich folgenden Code soweit modifizieren, dass er auch die Hintergrundfarben des StringGrid mit ausdruckt ? Ich habe den einzelnen Zellen unterschiedliche Farben verpasst.
Delphi-Quellcode:
Gruss
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; Holger |
Re: StringGrid mit Farben drucken
Wenn ich nicht total danebenliege, musst Du nur vor dem Printer.Canvas.Textout Printer.Canvas.Brush.Color auf die entsprechende Hintergrundfarbe der Zelle setzen.
|
Re: StringGrid mit Farben drucken
Hallo,
etwas daneben :wink: , damit wird nur der eigentliche Text hinterlegt, und da die Textlänge unterschiedlich sein wird ... Würde sagen das da mit Printer.Canvas.FillRect entsprechend der Bedingungen in OnDrawcell gearbeitet werden muss. angenommen Spalte 3 und 6 in rot:
Delphi-Quellcode:
oder so ähnlich ...
Printer.Canvas.Brush.Style := bsClear;
//... if J in [2,5] then begin Printer.Canvas.Brush.Color := clRed; Printer.Canvas.FillRect(...); end; Printer.Canvas.TextOut(...); |
Re: StringGrid mit Farben drucken
Etwas daneben ist immerhin nahe dran :lol:
|
Re: StringGrid mit Farben drucken
Danke schon mal. Nur wie bekomme ich das mit dem Rect hin ?
So klappt es nicht:
Delphi-Quellcode:
...
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.Brush.Color := Grid.Canvas.Pixels[XPos,YPos]; Printer.Canvas.FillRect(Rect); 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; ... |
Re: StringGrid mit Farben drucken
Delphi-Quellcode:
Ungetestet.
Printer.Canvas.FillRect(Rect(XPos,-YPos,XPos + Grid.ColWidths[J] * 3,YPos + ZeilenSize));
|
Re: StringGrid mit Farben drucken
Hallo,
mit
Delphi-Quellcode:
function Rect ( Left, Top, Right, Bottom : Integer ) : TRect;
Delphi-Quellcode:
oder so ähnlich ... (mein Lieblingssatz :angel2: )
//Variable anlegen
var aRect : TRect; //... aRect := Rect(XPos, - YPos, XPos + (Grid.ColWidths[J] * 3), YPos - (Grid.RowHeigths[ I + (Seite - 1) * Zeilen - 1] * 3) ); Printer.Canvas.FillRect(Rect); Aber die Farbermittlungsprozedur wird nicht funktionieren:
Delphi-Quellcode:
die Koordinaten -XPos,YPos- beziehen sich auf den Druckbereich, ein Bezug zum Grid ist da erforderlich, wie im oberen Vorschlag. Nimm doch die Bedingungen die Du in OnDrawcell verwendest.
Printer.Canvas.Brush.Color := Grid.Canvas.Pixels[XPos,YPos];
//Edit: roter Kasten, aber ... |
Re: StringGrid mit Farben drucken
Danke schon mal,
den Bezug zum Grid habe ich doch, da ich das Grid an die "Druckprozedure" übergebe. Da ich im Ereignis OnDrawCell sehr viel mache, um das Grid farblich zu gestalten, fände ich es gut wenn ich die einzelnen Zellenfarben einfach Zelle für Zelle an den Drucker übergeben könnte, wie das auch beim Zellentext gemacht wird. Gibt es dafür eine Lösung ? Gruss Holger |
Re: StringGrid mit Farben drucken
Hallo,
mit "bezug zum Grid" meinte ich den Bezug zu den Grid-Zellen. :wink: In OnDrawCell werden abhängig von der aktuellen Ansicht und den Erfordernissen(eine Zelle muss neu gezeichnet werden) die Farben in den Bereich der jeweiligen Zelle gemalt. Eine Verbindung der Farbe mit der Zelle ist dann nicht gegeben, es sei denn Du verwaltest die Farben in Objects oder einer anderen Datenhaltung. Werden die Farben anhand von Bedingungen den Zellen zugeordnet, gibt es zwei Wege: 1.) Bei der Druckausgabe wird analog der Bedingungen in OnDrawcell die Farbe ermittelt. oder 2.) Das Grid wird paralell mit der Druckausgabe so gescrollt, das ein OnDrawCell ausgelöst wird und man auf die dann gezeichneten Zellen/Farbe zugreifen kann. Im der EE habe ich mal einen Beitrag hinterlegt der die Vorgehensweise realisiert. :arrow: ![]() Der Code gibt das Grid auf einem Bitmap aus. Entweder den Code so abändern das die Ausgabe direkt auf Printer.Canvas erfolgt(schwierig wenn das Grid nicht auf eine Seite passt), oder das Bitmap Seitenweise auf Printer.Canvas übertragen. Ich halte die Version 1.) für leichter realisierbar, insbesondere wenn das Grid sich über mehrere Seiten erstreckt. Poste doch mal deine OnDrawcell-Behandlung, mit mehr Detail-Wissen kann man genaueres sagen. |
Re: StringGrid mit Farben drucken
Und sofern es sich machen lässt, verlagert man das Zeichnen dann in eine eigene Methode, die parametergesteuert entweder auf den Canvas des Grids oder den des Druckers zeichnet.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 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