AGB  ·  Datenschutz  ·  Impressum  







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

Listview drucken, Zeilen beim Ausdruck färben

Ein Thema von dr. jack1 · begonnen am 20. Sep 2014 · letzter Beitrag vom 22. Sep 2014
Antwort Antwort
dr. jack1

Registriert seit: 13. Jul 2013
10 Beiträge
 
Delphi 2007 Professional
 
#1

Listview drucken, Zeilen beim Ausdruck färben

  Alt 20. Sep 2014, 17:43
Hallo zusammen,

ich möchte eine Listview ausdrucken aber das Ganze mit grau gefärbten Zeilen.

Mit dem ListViewCustomDrawItem kann ich es wie gewünscht darstellen (weiß-grau-weiß-grau), jedoch erfolgt der Ausdruck ohne die Zeilenfärbung. Hat jemand eine Idee wie das geht?

Google war leider nicht mein Freund bzw. habe ich nur gefunden wie Listviews gefärbt werden...

Danke

Geändert von dr. jack1 (20. Sep 2014 um 17:55 Uhr)
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 20. Sep 2014, 20:22
Hi dr. jack1,

wie druckst du die ListView? Ohne Code kann man da nicht viel sagen...

EDIT: Kopierst du das ListView.Canvas auf das Printer.Canvas?
Andreas Lauß
Blog

Geändert von Andreas L. (20. Sep 2014 um 20:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 20. Sep 2014, 21:46
Nimm eine Report Komponente oder zeichne/schreibe selbst auf den Drucker Canvas. Ich gehe mal davon aus, dass die Daten nicht im Listview gespeichert sind.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
dr. jack1

Registriert seit: 13. Jul 2013
10 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 20. Sep 2014, 22:25
Das wäre der Code zum Drucken. SO tief stecke ich leider nicht in der Materie um hier noch eine Färbung einfügen zu können.

Delphi-Quellcode:
procedure Ttfg_druck.BitBtn7Click(Sender: TObject);
var
   pWidth, pHeight, i: Integer;
   v, h: Real;
   CurItem, iColumnCount: Integer;
   //aCols: array[0..50] of Integer; // Delphi 3
   aCols: array of Integer; // Delphi 5
   iTotColsWidth, iInnerWidth, TopMarg, LinesOnPage, CurLine, TekstHeight, CurCol: Integer;
   CurRect: TRect;
   CurStr: string;
   CurLeft, NumPages, TmpPos: Integer;
   lvTitel: string;

   begin
       begin
   if PrintDialog1.Execute then
   begin

     iColumnCount := listview1.Columns.Count;
     SetLength(aCols, iColumnCount + 1); // + 1 nodig ??? Delphi 5
     Printer.Title := 'TFG Monatsausdruck';
     Printer.Copies := 1;
     Printer.Orientation := poLandscape;
     Printer.BeginDoc;
     pHeight := Printer.PageHeight;
     pWidth := Printer.PageWidth;

     v := (pHeight + (2 * GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY))) / 21;
     //0.95 is a strange correction factor on the clients printer
     h := (pWidth + (2 * GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX))) /(29.7 * 0.95);

     // calculate total width
     iTotColsWidth := 0;
     for i := 0 to iColumnCount - 1 do
       iTotColsWidth := iTotColsWidth + listview1.Columns[i].Width;

     // calculate space between lMargin and rMargin
    aCols[0] := Round(1.5 * h); //left margin ?
    aCols[iColumnCount + 0] := pWidth - Round(1.5 * h); //rigth margin ?
    iInnerWidth := aCols[iColumnCount + 0] - aCols[0]; // space between margins ?

     //calculate start of each column
     for i := 0 to iColumnCount - 1 do
       aCols[i + 1] := aCols[i] + Round(listview1.Columns[i].Width / iTotColsWidth * iInnerWidth);
     TopMarg := Round(2.5 * v);
     with Printer.Canvas do
     begin
       Font.Size := 8;
       Font.Style := [];
       Font.Name := 'Calibri';
       Font.Color := RGB(0, 0, 0);
       TekstHeight := Printer.Canvas.TextHeight('dummy');
       LinesOnPage := Round((PHeight - (5 * v)) / TekstHeight);
       NumPages := 1;

       // gather number of pages to print
       while (NumPages * LinesOnPage) < listview1.Items.Count do
         inc(NumPages);
       // start
       CurLine := 0;
       for CurItem := 0 to listview1.Items.Count - 1 do
       begin
         if (CurLine > LinesOnPage) or (CurLine = 0) then
         begin
           if (CurLine > LinesOnPage) then Printer.NewPage;
           CurLine := 1;
           if Printer.PageNumber = NumPages then
           begin
             MoveTo(aCols[1], topMarg);
             for i := 1 to iColumnCount - 1 do
             begin
               LineTo(aCols[i], TopMarg + (TekstHeight * (listview1.Items.Count - CurItem + 2)));
               MoveTo(aCols[i + 1], topMarg);
             end;
           end
           else
           begin
             // draw vertical lines between data
             for i := 1 to iColumnCount - 1 do
             begin
               MoveTo(aCols[i], topMarg);
               LineTo(aCols[i], TopMarg + (TekstHeight * (LinesOnPage + 1)));
             end;
           end;

           Font.Style := [fsBold];
           // print column headers
           for i := 0 to iColumnCount - 1 do
           begin
             TextRect(Rect(aCols[i] + Round(0.1 * h), TopMarg - Round(0.1 * v), aCols[i + 1] - Round(0.1 * h)
               , TopMarg + TekstHeight - Round(0.1 * v)), ((aCols[i + 1] - aCols[i]) div 2) +
               aCols[i] - (TextWidth(listview1.Columns.Items[i].Caption) div 2),
               TopMarg - Round(0.1 * v), listview1.Columns.Items[i].Caption);
             //showmessage('print kolom: '+IntToStr(i));
           end;

           // draw horizontal line beneath column headers
           MoveTo(aCols[0] - Round(0.1 * h), TopMarg + TekstHeight - Round(0.05 * v));
           LineTo(aCols[iColumnCount] + Round(0.1 * h), TopMarg + TekstHeight - Round(0.05 * v));

           // print date and page number
           Font.Size := 8;
           Font.Style := [];
           TmpPos := (TextWidth('Datum: ' + DateToStr(Date) + ' Seite: ' +
             IntToStr(Printer.PageNumber) + ' / ' + IntToStr(NumPages))) div 2;

           TmpPos := PWidth - Round(1.5 * h) - (TmpPos * 2);

           Font.Size := 8;
           Font.Style := [];
           TextOut(TmpPos, Round(0.5 * v), 'Datum: ' + DateToStr(Date) +
             ' Seite: ' + IntToStr(Printer.PageNumber) + ' / ' + IntToStr(NumPages));

           // print report title
           Font.Size := 18;
           if TmpPos < ((PWidth + TextWidth(lvTitel)) div 2 + Round(0.75 * h)) then
             TextOut((PWidth - TextWidth(lvTitel)) div 2, Round(1 * v), lvTitel)
           else
             TextOut(Round(3 * h), Round(1 * v), lvTitel);

           Font.Size := 8;
           Font.Style := [];
         end;

         CurRect.Top := TopMarg + (CurLine * TekstHeight);
         CurRect.Bottom := TopMarg + ((CurLine + 1) * TekstHeight);

         // print contents of Listview
         for CurCol := -1 to iColumnCount - 2 do
         begin
           CurRect.Left := aCols[CurCol + 1] + Round(0.1 * h);
           CurRect.Right := aCols[CurCol + 2] - Round(0.1 * h);
           try
             if CurCol = -1 then

                  CurStr := listview1.Items[CurItem].Caption
             else
                  CurStr := listview1.Items[CurItem].SubItems[CurCol]
           except
             CurStr := ' ';
           end;
           CurLeft := CurRect.Left; // align left side
           // write string in TextRect
           TextRect(CurRect, CurLeft, CurRect.Top, CurStr);
         end;
         Inc(CurLine);
       end;
     end;
     Printer.EndDoc;
   end;
end;


end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 20. Sep 2014, 22:44
Teil den Spaghetti Code erst mal in einzelne Prozeduren auf. Am besten in einer Klasse kapseln, damit du keine globalen Variablen brauchst. So steigt man da ja kaum durch.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
20. Sep 2014, 22:45
Dieses Thema wurde am "20. Sep 2014, 22:45 Uhr" von "Luckie" aus dem Forum "Algorithmen, Datenstrukturen und Klassendesign" in das Forum "GUI-Design mit VCL / FireMonkey / Common Controls" verschoben.
dr. jack1

Registriert seit: 13. Jul 2013
10 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 21. Sep 2014, 17:14
Joar der Spaghetti Code ist so recht lang, aber er funktioniert. Habe ihn, ehrlich gesagt, auch nur kopiert.
Das Färben bekomme ich nicht hin, weil (ganz unten) der Code pro Spalte ausgelesen wird, nicht zeilenweise
Hat da jemand eine Idee wie es funktionieren könnte?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 21. Sep 2014, 21:10
Zeilenweise auf den Canvas vom Drucker ausgeben und nicht spaltenweise.

Und er mag ja funktionieren, aber wie man sieht, verstehst du ihn selber nicht. Deswegen mal übersichtlich aufteilen, dann kann man ihn auch einfacher modifizieren.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Puke
Puke

Registriert seit: 7. Nov 2012
123 Beiträge
 
Delphi XE5 Architect
 
#9

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 21. Sep 2014, 22:29
Vermutung :
Imho muss nur ein brush.color := clGrey; eingefügt werden. Aber ohne Gewähr ...
Gruß Puke
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#10

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 22. Sep 2014, 08:10
Er mag unten zwar spaltenweise ausgegeben werden,
aber vorher wird ja Zeile für Zeile diese "spaltenweise" Ausgabe in einer Schleife durchgeführt
Delphi-Quellcode:
       for CurItem := 0 to listview1.Items.Count - 1 do
        begin
          if (CurLine > LinesOnPage) or (CurLine = 0) then
und (zumindest in diesem Code)
könntest du hier
Delphi-Quellcode:
         for CurCol := -1 to iColumnCount - 2 do
          begin
            CurRect.Left := aCols[CurCol + 1] + Round(0.1 * h);
            CurRect.Right := aCols[CurCol + 2] - Round(0.1 * h);
            try
              if CurCol = -1 then

                   CurStr := listview1.Items[CurItem].Caption
              else
                   CurStr := listview1.Items[CurItem].SubItems[CurCol]
            except
              CurStr := ' ';
            end;
            CurLeft := CurRect.Left; // align left side
            // write string in TextRect

            if (CurLine mod 2 = 0) //Abhängig davon, ob Curline gerade oder ungerade
              brush.color = clWhite else //ist, die brush.color des Canvas setzen
              brush.color = clGray;
            FillRect(CurRect); //Dann einfach mal ein gefülltes Rechteck Zeichnen
                                           //ggf. könnten noch Linien für die Zeilentrennung oder
                                           //Spaltentrennung gezeichnet werden

            TextRect(CurRect, CurLeft, CurRect.Top, CurStr);
          end;
Macht den Code zwar nicht besser, aber so würd's gehen.

Aber ich muss allen Anderen hier zustimmen. Teil dir den Code erst mal in Procedure und Funktionen auf, damit er lesbar wird.
Mach dir ne Klasse dafür, dann kannst du die Variablen besser überschauen, weil Sie dann zu der Klasse gehören.

Der Vorteil, nach dem du das in eine Klasse gepackt hast, oder das in Funktionen oder Proceduren aufgeteilt hast, ist, dass du auch genau weißt was du tust und warum, und dir die Frage nach der Position einer solchen Änderung ganz allein beantworten kannst. Abgesehen davon, dass du sie auch leichter wiederfindest
Denn was ich daran sehr zu schätzen gelernt habe, ist die Tatsache, dass man bei späteren Änderungen mit [CTRL]+[linke Maustaste] dann recht schnell in eine verwendete Funktion, eine verwendete Procedure und deren Deklarationen springen kann. Ein Vorteil, der einem nicht nur das Suchen erspart, sondern auch Unmengen an Zeit.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo (22. Sep 2014 um 08:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:32 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