Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Drucker druckt nur eine Seite (https://www.delphipraxis.net/12106-drucker-druckt-nur-eine-seite.html)

Bobdimfi 20. Nov 2003 17:27


Drucker druckt nur eine Seite
 
Hallo,

ich arbeite zur Zeit an einem Programm, um eine Rangliste zu verwalten.

Unter anderem habe ich vor, diese auszudrucken.

Dazu benutze ich folgende Prozedur:

Delphi-Quellcode:
procedure Drucken;
var
  I: Integer;
  X, Y: Integer;
  Breite, Hoehe, Randlinks, Randoben: Integer;
begin
  if PrintDialog1.Execute then
    with Printer do
    begin
      BeginDoc;
      SetMapMode(Canvas.Handle,MM_LOMETRIC);  // 1/10 mm

      with Canvas do
      begin
        with Font do
        begin
          Name := 'Courier New';
          Height := 50;
        end;

        Breite := GetDeviceCaps(Handle,HORZSIZE) * 10;
        Hoehe := GetDeviceCaps(Handle,VERTSIZE) * 10;

        Randlinks := 100;
        Randoben := 200;

        Y := -Randoben;

        for I := 0 to ListBox1.Items.Count-1 do
        begin

          if -Y > (Hoehe - 2 * Randoben) then
          begin
            NewPage;                   // funktioniert nicht
            Y := -Randoben;
          end;

          TextOut(X,Y,ListBox1.Items[I]);

          Y := Y - TextHeight(ListBox1.Items[I]);
        end;
      end;
      EndDoc;
    end;
end;
Ich habe sie ein bisschen vereinfacht (ListBox1 anstatt Listview mit Subitems).

Die erste Seite wird besstens gedruckt, aber seit ich "MapMode" auf MM_LOMETRIC gesetzt habe,
werden alle weiteren Seiten leer ausgeworfen.

An was könnte das denn liegen?

Horald 20. Nov 2003 19:28

Re: Drucker druckt nur eine Seite
 
Hallo,

warum hast du die Druckroutine "hardcodiert". Mach es doch mit Quickreport. Man braucht für Quickreport nicht unbedingt eine Datenbank. Meine Fehlerreports drucke ich auch mit Quickreport. Dies hat einige Vorteile. Quickreport kümmert sich selbst um Papierformat, Seitengröße etc. Und ich kann die Position der Ausgabezeile recht einfach auf einem Report platzieren.
Entscheidend ist dass das onNeeddata-Ereignis überschrieben wird. Solange moredata=true ist macht Quickreport weiter, sobald moredata=false ist wird die Ausgabe beendet. Mit Quickreport könnte dein Source dann etwa so aussehen:

Code:
var i : integer;

procedure TQRDrucken.QRDruckenBeforePrint(Sender: TQuickRep;
  var PrintReport: Boolean);
begin
  i:=0;
end;


procedure TQRDrucken.QRLabel1Print(sender: TObject; var Value: String);
begin
  value:=Form1.ListBox1.Items[i];
end;

procedure TQRDrucken.QRDruckenNeedData(Sender: TObject;
  var MoreData: Boolean);
begin
  moreData:=true;
  if i>Form1.ListBox1.Items.Count then
    begin
    moredata:=false;
    end;
  inc(i);
end;
Probiers mal aus.

Gruß

Horst
:hi:


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