AGB  ·  Datenschutz  ·  Impressum  







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

Druckfunktion fragen

Offene Frage von "delphinia"
Ein Thema von delphinia · begonnen am 13. Dez 2006 · letzter Beitrag vom 13. Dez 2006
Antwort Antwort
delphinia

Registriert seit: 16. Feb 2006
444 Beiträge
 
Delphi 11 Alexandria
 
#1

Druckfunktion fragen

  Alt 13. Dez 2006, 12:34
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;
Doreen
Gruss Doreen
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#2

Re: Druckfunktion fragen

  Alt 13. Dez 2006, 12:53
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
  Mit Zitat antworten Zitat
delphinia

Registriert seit: 16. Feb 2006
444 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Druckfunktion fragen

  Alt 13. Dez 2006, 12:57
wo muss ich den den PEN eingeben und wie bekomme ich ne Linie in jeder Zeile??
Doreen
Gruss Doreen
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Druckfunktion fragen

  Alt 13. Dez 2006, 13:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Druckfunktion fragen

  Alt 13. Dez 2006, 13:25
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  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 04:11 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