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
Benutzerbild von Luckie
Luckie

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

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 20. Sep 2014, 20: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
 
#2

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 20. Sep 2014, 21: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
 
#3

AW: Listview drucken, Zeilen beim Ausdruck färben

  Alt 20. Sep 2014, 21: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
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 05:55 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-2025 by Thomas Breitkreuz