AGB  ·  Datenschutz  ·  Impressum  







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

StringGrid mit Farben drucken

Ein Thema von HolgerCW · begonnen am 5. Okt 2009 · letzter Beitrag vom 6. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2      
HolgerCW

Registriert seit: 28. Nov 2006
Ort: Marl
1.207 Beiträge
 
Delphi XE7 Enterprise
 
#1

StringGrid mit Farben drucken

  Alt 5. Okt 2009, 10:15
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: StringGrid mit Farben drucken

  Alt 5. Okt 2009, 10:53
Wenn ich nicht total danebenliege, musst Du nur vor dem Printer.Canvas.Textout Printer.Canvas.Brush.Color auf die entsprechende Hintergrundfarbe der Zelle setzen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#3

Re: StringGrid mit Farben drucken

  Alt 5. Okt 2009, 11:14
Hallo,

etwas daneben , 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 ...
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: StringGrid mit Farben drucken

  Alt 5. Okt 2009, 12:30
Etwas daneben ist immerhin nahe dran
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
HolgerCW

Registriert seit: 28. Nov 2006
Ort: Marl
1.207 Beiträge
 
Delphi XE7 Enterprise
 
#5

Re: StringGrid mit Farben drucken

  Alt 5. Okt 2009, 15:39
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;

...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: StringGrid mit Farben drucken

  Alt 5. Okt 2009, 16:16
Printer.Canvas.FillRect(Rect(XPos,-YPos,XPos + Grid.ColWidths[J] * 3,YPos + ZeilenSize)); Ungetestet.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#7

Re: StringGrid mit Farben drucken

  Alt 5. Okt 2009, 16:23
Hallo,

mit 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 )

Aber die Farbermittlungsprozedur wird nicht funktionieren:
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 ...
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
HolgerCW

Registriert seit: 28. Nov 2006
Ort: Marl
1.207 Beiträge
 
Delphi XE7 Enterprise
 
#8

Re: StringGrid mit Farben drucken

  Alt 6. Okt 2009, 08:06
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
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#9

Re: StringGrid mit Farben drucken

  Alt 6. Okt 2009, 09:27
Hallo,

mit "bezug zum Grid" meinte ich den Bezug zu den Grid-Zellen.

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.
[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.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: StringGrid mit Farben drucken

  Alt 6. Okt 2009, 09:35
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:51 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