Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringGrid mit Farben drucken (https://www.delphipraxis.net/141222-stringgrid-mit-farben-drucken.html)

HolgerCW 5. Okt 2009 10:15


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:
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;
Gruss

Holger

DeddyH 5. Okt 2009 10:53

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.

Lannes 5. Okt 2009 11:14

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:
Printer.Canvas.Brush.Style := bsClear;
//...
if J in [2,5] then
  begin
  Printer.Canvas.Brush.Color := clRed;
  Printer.Canvas.FillRect(...);
  end;
Printer.Canvas.TextOut(...);
oder so ähnlich ...

DeddyH 5. Okt 2009 12:30

Re: StringGrid mit Farben drucken
 
Etwas daneben ist immerhin nahe dran :lol:

HolgerCW 5. Okt 2009 15:39

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;

...

DeddyH 5. Okt 2009 16:16

Re: StringGrid mit Farben drucken
 
Delphi-Quellcode:
Printer.Canvas.FillRect(Rect(XPos,-YPos,XPos + Grid.ColWidths[J] * 3,YPos + ZeilenSize));
Ungetestet.

Lannes 5. Okt 2009 16:23

Re: StringGrid mit Farben drucken
 
Hallo,

mit
Delphi-Quellcode:
function Rect ( Left, Top, Right, Bottom : Integer ) : TRect;
Delphi-Quellcode:
//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);
oder so ähnlich ... (mein Lieblingssatz :angel2: )

Aber die Farbermittlungsprozedur wird nicht funktionieren:
Delphi-Quellcode:
Printer.Canvas.Brush.Color := Grid.Canvas.Pixels[XPos,YPos];
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.

//Edit: roter Kasten, aber ...

HolgerCW 6. Okt 2009 08:06

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

Lannes 6. Okt 2009 09:27

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: [TStringGrid, TBitmap, VCL Win32] ... ein Stringgrid als Bitmap ausgeben/speichern
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.

DeddyH 6. Okt 2009 09:35

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 06:03 Uhr.
Seite 1 von 2  1 2      

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