Einzelnen Beitrag anzeigen

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