Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Druckfunktion fragen (https://www.delphipraxis.net/82446-druckfunktion-fragen.html)

delphinia 13. Dez 2006 12:34


Druckfunktion fragen
 
ich habe diese Druckfunktion gefunden zum ListView drucken
Damit habe ich 2 Probleme

a) die linien die da gezeichnet werden sidn mir zu dünn!
b) Möchte ich in jeder Zeile ne Linie!

wer kann mir dabei helfen?

Delphi-Quellcode:
procedure PrintListview(oListView: TListView; PrintDialog: TPrintDialog; lvTitel: string);
var
  pWidth, pHeight, i: Integer;
  v, h: Real;
  CurItem, iColumnCount: Integer;
  aCols: array of Integer; // Delphi 5
  iTotColsWidth, iInnerWidth, TopMarg, LinesOnPage, CurLine, TekstHeight, CurCol: Integer;
  CurRect: TRect;
  CurStr: string;
  CurLeft, NumPages, TmpPos: Integer;

begin
  if PrintDialog.Execute then
  begin
    iColumnCount := oListview.Columns.Count;
    SetLength(aCols, iColumnCount + 1);
    Printer.Title := 'Werkhof-Prining';
    Printer.Copies := 1;
    Printer.Orientation := poPortrait;
    Printer.BeginDoc;
    pHeight := Printer.PageHeight;
    pWidth := Printer.PageWidth;

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

    // calculate total width
    iTotColsWidth := 0;
    for i := 0 to iColumnCount - 1 do
      iTotColsWidth := iTotColsWidth + oListView.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(oListView.Columns[i].Width / iTotColsWidth * iInnerWidth);
    TopMarg := Round(2.5 * v);
    with Printer.Canvas do
    begin
      Font.Size := 12;
      Font.Style := [];
      Font.Name := 'Arial';
      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) < oListView.Items.Count do
        inc(NumPages);
      // start
      CurLine := 0;
      for CurItem := 0 to oListView.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 * (oListView.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 + 2)));
            end;
          end;

          Font.Style := [];
          // 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(oListview.Columns.Items[i].Caption) div 2),
              TopMarg - Round(0.1 * v), oListview.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('Vom: ' + DateToStr(Date) + ' - ' + TimeToStr(Time) +
            ' Page: ' + 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), 'Vom: ' + DateToStr(Date) + ' - ' + TimeToStr(Time) +
            ' Page: ' + 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 := 10;
          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 := oListView.Items[CurItem].Caption
            else
              CurStr := oListView.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;

Reinhard Kern 13. Dez 2006 12:53

Re: Druckfunktion fragen
 
Zitat:

Zitat von delphinia
ich habe diese Druckfunktion gefunden zum ListView drucken
Damit habe ich 2 Probleme

a) die linien die da gezeichnet werden sidn mir zu dünn!
b) Möchte ich in jeder Zeile ne Linie!

wer kann mir dabei helfen?
...

Hallo,

da hat sich jemand überhaupt nicht die Mühe gemacht, auf printer.canvas den pen einzustellen - defaultmässig ist das 1 pixel, daher sind die Linien umso dünner, je höher die Auflösung des Druckers ist. Also vor dem Druck der Linien pen zuweisen oder zumindest pen.width auf einen grösseren Wert setzen.

Am saubersten ist es natürlich, die Auflösung des Druckers abzufragen und den Wert für Width so zu wählen, dass die Breite auf allen Druckern gleich ist.

Beispiele sind in der Online-Hilfe unter TCanvas und TPen zu finden.

Gruss Reinhard

delphinia 13. Dez 2006 12:57

Re: Druckfunktion fragen
 
wo muss ich den den PEN eingeben und wie bekomme ich ne Linie in jeder Zeile??

Muetze1 13. Dez 2006 13:01

Re: Druckfunktion fragen
 
Zitat:

Zitat von Reinhard Kern
Beispiele sind in der Online-Hilfe unter TCanvas und TPen zu finden.

Ich kann das nur wiederholen, schau dort mal nach und beide Fragen klären sich von selbst. Zumindest eine Frage ist eine einfache Sache (die Stiftweite), so dass ich glaube, dass du diese Frage mindestens selbst klären kannst.

SirThornberry 13. Dez 2006 13:25

Re: Druckfunktion fragen
 
Ich würde dir empfehlen versuchen den Quelltext den du verwendest zu verstehen. Es bringt dir nichts wenn wir dir sagen welche Zeilen du hinzufügen musst damit das Ergebnis wie gewünscht wird wenn du nichts von dem ganzen verstehst. Denn wer sagt dir das der Quelltext den du irgendwo her hast nicht bösartig ist? Auch Fehler lassen sich schwer/nicht beheben wenn man nicht weiß was der Quelltext macht.
Wenn du den Quelltext verstanden hast findest du auch wie man eine Linie zeichnet (denn es wird ja schon eine gezeichnet). Und dann sollte es auch kein Problem darstellen es so zu ändern das mehr Linien gedruckt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 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