Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Drucken über Canvas! (https://www.delphipraxis.net/68364-drucken-ueber-canvas.html)

Goldesel 28. Apr 2006 19:56


Drucken über Canvas!
 
Hallo,
zuerst einmal zur Veranschaulichung mein Source:

Delphi-Quellcode:
     begin
      Lines := 900;
      table3.First;
      printer.BeginDoc;

      printer.Title:='Ausdruck von My- Bank';
      printer.Canvas.Font.Name:='Times New Roman';

      printer.Canvas.Font.Size:=18;
      printer.Canvas.Font.Style:=[fsunderline,fsbold];
      printer.canvas.TextOut(1750,200,'Auszahlungen');
      printer.Canvas.Font.Style:=[];
      printer.Canvas.Font.Size:=14;
      printer.Canvas.TextOut(350,500,'Ausdruck vom : '+datetostr(now));
     end;
   repeat
   while not table3.Eof do
    begin
      druck1:='Kreditinstitut: '+dbtext5.Caption;
      druck2:='Ort: '+dbtext6.caption;
      druck3:='Betrag: '+dbtext7.Caption+' €';
      druck4:='Verwendungszweck: '+dbtext8.Caption;
      druck5:='Datum: '+dbtext9.Caption;
      anzahldb:=table3.RecordCount;
      activedb:=table3.RecNo;

      table3.Next;
   
      printer.Canvas.Font.Size:=14;
      printer.Canvas.Font.Style:=[fsunderline];
      printer.Canvas.TextOut(350,lines-150,'Datensatz '+inttostr(activedb)+' von '+inttostr(anzahldb));
      printer.Canvas.Font.Style:=[];

      printer.Canvas.Font.size:=12;
      printer.Canvas.TextOut(350,lines,druck1);
      printer.Canvas.TextOut(350,lines+150,druck2);
      printer.Canvas.TextOut(350,lines+300,druck3);
      printer.Canvas.TextOut(350,lines+450,druck4);
      printer.Canvas.TextOut(350,lines+600,druck5);

    end;
    until
     (table3.RecNo=anzahldb);
     printer.EndDoc;

  lines:=lines+1000;
    if lines>6000 then
     begin;
      printer.NewPage;
      lines:=200;
     end;
Die bisherige Durckfunktion läuft eigentlich ganz gut. Das einzige Problem was ich habe ist, dass ich nur eine Seite ausdrucken kann. Ich möchte aber pro Seite nur 5 Datensätze haben, d.h. wenn eine bestimmte Line erreicht ist soll eine neue Seite gezogen werden und dort weitergedruckt werden. Ich hoffe mein Problem ist einigermaßen verständlich geschildert ;-)

Und noch eine Frage am Rande: Wie kann ich dem Dokument einen Dokumentnamen zuordnen, welcher in der Druckerwarteschlange angezeigt wird?


Vielen Dank
Jannik

Hawkeye219 28. Apr 2006 20:14

Re: Drucken über Canvas!
 
Hallo Jannik,

hast du es schon mal mit Delphi-Referenz durchsuchenTPrinter.NewPage versucht?

Gruß Hawkeye

Goldesel 28. Apr 2006 20:15

Re: Drucken über Canvas!
 
Ja allerdings bekomme ich dann nur eine leere Seite ausgegeben.

Hawkeye219 28. Apr 2006 20:24

Re: Drucken über Canvas!
 
und wenn du zwei Zeilen deines Codes entfernst?

Delphi-Quellcode:
begin
  Lines := 900;
  table3.First;
  printer.BeginDoc;
  repeat

    // Druckbefehle

    lines:=lines+1000;
    if lines>6000 then
    begin;
      Printer.NewPage;  // <<-- neu
      lines:=900;
//    printer.enddoc;   // <<-- entfernen
//    printer.BeginDoc; // <<-- entfernen
    end;
  until (table3.RecNo = anzahldb);
  printer.EndDoc;
end;

Goldesel 28. Apr 2006 20:32

Re: Drucken über Canvas!
 
Zuerst einmal vielen Dank! So klappt es nämlich. Jetzt habe ich allerdings folgendes Problem. Wenn ich zehn Datensätze in der table habe, werden nur neun gedruckt. Das heißt immer der letzte Datensatz wird nicht mitgedruckt? Kann dies am table3.next liegen?

Hawkeye219 28. Apr 2006 20:44

Re: Drucken über Canvas!
 
Ich habe mit den Datenbank-Komponenten noch nicht gearbeitet. Laut Hilfe gibt es die Eigenschaft Eof. Wäre es damit nicht einfacher?

Delphi-Quellcode:
table3.First;
while not table3.eof do
begin

  // hier Datensatz verarbeiten

  table3.next;
end;
Gruß Hawkeye

Goldesel 28. Apr 2006 20:50

Re: Drucken über Canvas!
 
Jetzt werden zwar alle Datensätze gedruckt, Datensatz 1-7 auch ordnungsgemäß. Nur Datensatz 8 (also der letzte) wird auf eine neue Seite und etwas weiter unten gedruckt.

Hawkeye219 28. Apr 2006 21:12

Re: Drucken über Canvas!
 
Die Steuerung der Ausgabe über die Variable lines in deinem Code stimmt wohl noch nicht ganz. Offensichtlich druckst du auch den Header ("Auszahlungen") für jeden Datensatz erneut aus. Diesen Code solltest du aus der Schleife herausziehen und den Header nur 1x pro Seite drucken.

Vielleicht ist es besser, die ausgegebenen Datensätze pro Seite mitzuzählen und beim Erreichen des gewünschten Maximalwertes auf eine neue Seite umzuschalten. Aus diesem Zähler kannst du dann die vertikale Druckposition für jeden Datensatz errechnen. Die jetzige Steuerung über lines ist schwerer nachzuvollziehen; bei einer Änderung (z.B. andere Anzahl Datensätze pro Seite) schleichen sich schnell Fehler ein.

Gruß Hawkeye

Goldesel 28. Apr 2006 21:18

Re: Drucken über Canvas!
 
Also, ich habe eben den Code nochmal erneuert (s.o.). Jetzt habe ich allerdings folgendes Problem, nun wird nur der 8 (also der letzte) Datensatz gedruckt und der Header.

Hawkeye219 28. Apr 2006 21:28

Re: Drucken über Canvas!
 
Den Fehler solltest du eigentlich sofort sehen, wenn du deinen Code vernünftig einrückst. :wink:
In dem linksbündigen Listing übersiehst du allzu leicht logische Fehler im Ablauf.

Gruß Hawkeye

Goldesel 28. Apr 2006 21:59

Re: Drucken über Canvas!
 
Mmmmhhh ... hab das Code-Design jetzt geändert und ein paar Sachen ausprobiert aber den Fehler finde ich immer noch nicht!

Mackhack 28. Apr 2006 22:01

Re: Drucken über Canvas!
 
Poste halt nochmal dein neudesignes Code-Stueck!

Goldesel 28. Apr 2006 22:05

Re: Drucken über Canvas!
 
So, sollte ich Fehler in der Formatierung gemacht haben, BITTE UNBEDINGT drauf aufmerksam machen. Hab bisher sehr selten meinen Code formatiert!

Mackhack 28. Apr 2006 22:06

Re: Drucken über Canvas!
 
Zitat:

Zitat von Goldesel
So, sollte ich Fehler in der Formatierung gemacht haben, BITTE UNBEDINGT drauf aufmerksam machen. Hab bisher sehr selten meinen Code formatiert!

Dann wird es aber hoechste Zeit sich mal den StyleGuide von Borland anzusehen und den auch anzuwenden. Wie einer meiner Vorredner schon sagte kann man damit auch Fehler vorbeugen!

Ausserdem,... Nutz doch dafuer die QuickReport oder FastReport-Kompo. Dann hast sogar ne Vorschau! Warum das Rad neu erfinden?

Goldesel 28. Apr 2006 22:24

Re: Drucken über Canvas!
 
@ mackhack

Wo finde ich die QuickReports von Delphi? Irgendwie scheine ich die nicht unter meinen Komponenten zu haben ...

Hawkeye219 28. Apr 2006 22:40

Re: Drucken über Canvas!
 
Ok Jannik, der Code ist nun schon etwas lesbarer geworden. Wenn du diesen Thread liest, wirst du sehen, daß es sehr viele unterschiedliche Meinungen zum Thema "Formatierung von Quelltexten" gibt. Letztlich orientieren sich die meisten doch mehr oder weniger an den unverbindlichen Vorgaben von Borland. In diesen Vorgaben findest du noch viele Hinweise, wie du die Lesbarkeit deines Codes weiter verbessern kannst.

Nun zum Fehler. Hier die grobe Struktur deines Codes als Pseudo-Code:

Delphi-Quellcode:
<Druckposition initialisieren>
table.First;
printer.BeginDoc;
<Überschrift drucken>

repeat
 
  while not table.Eof do
    begin
      <aktuellen Datensatz lesen>
      table.Next;
      <Datensatz an aktueller Position drucken>
    end;

until "letzter Datensatz erreicht";
 
printer.EndDoc;
 
<vertikale Druckposition erhöhen>
if "Position > 6000" then
  begin
    printer.NewPage;
    <Position auf 200 setzen>
  end;
Kann das funktionieren?

Goldesel 29. Apr 2006 09:34

Re: Drucken über Canvas!
 
Eine Frage zu deinem Code. Meinst du mit <Druckpositiojn initialisieren> dasselbe wie lines:=900; ?

Solltest du damit das oben genannte meinen, muss ich dich leider enttäuschen. Dies funktioniert auch nicht. Es wird nach wie vor nur der letzte Datensatz gedruckt (und der header). Aber ich werde heute wahrscheinlich auf QuickReport umsteigen.

Hawkeye219 29. Apr 2006 10:44

Re: Drucken über Canvas!
 
Zitat:

Zitat von Goldesel
Dies funktioniert auch nicht. Es wird nach wie vor nur der letzte Datensatz gedruckt (und der header).

Ich habe lediglich deinen Code als Pseudo-Code formuliert, weil ich dir damit die Fehlersuche etwas erleichtern wollte.

Gruß Hawkeye

Goldesel 29. Apr 2006 10:56

Re: Drucken über Canvas!
 
Achso ... tut mir leid. Das muss ich überlesen haben. Natürlich ... jetzt hab ichs auch hinbekommen:

Delphi-Quellcode:
<Druckposition initialisieren>
table.First;
printer.BeginDoc;
<Überschrift drucken>

repeat
 
  while not table.Eof do
    begin
      <aktuellen Datensatz lesen>
      table.Next;
      <Datensatz an aktueller Position drucken>
     <vertikale Druckposition erhöhen>
     if "Position > 6000" then
      begin
       printer.NewPage;
       <Position auf 200 setzen>
      end;
    end;


until "letzter Datensatz erreicht";
 
printer.EndDoc;
So siehts bei mir jetzt aus und es funktioniert sogar. Aber ich denke trotzdem, dass ich
auf QuickReport umsteigen werde, da es meiner Meinug nach komfortabler zu nutzen ist und mehr Möglichkeiten bietet. Zumal dies das erste Mal war, dass ich mich mit Printer.Canvas beschäftigt habe.
Weiß vielleicht noch jemand wie ich dem Dokument einen Dokumentname zuordnen kann, welcher auch in der Durckerwarteschlange angezeigt wird?

Vielen Dank
Jannik

mkinzler 29. Apr 2006 11:13

Re: Drucken über Canvas!
 
Borland liefert seit Version 6 zusätzlich Rave Reports mit. Ab Version 2005 ausschließlich!(Win32)

Goldesel 29. Apr 2006 11:18

Re: Drucken über Canvas!
 
Also bei mir sind keine Rave Reports enthalten. Ich nutze Delphi 2005 Architect. Sind diese vielleicht in irgendeinem Package oder so "versteckt"?

mkinzler 29. Apr 2006 11:25

Re: Drucken über Canvas!
 
laut Feature-Matrix von Borland ist es in allen Versionen (ür W32 VCL.Net vorhanden.

Hawkeye219 29. Apr 2006 11:30

Re: Drucken über Canvas!
 
Zitat:

Zitat von Goldesel
So siehts bei mir jetzt aus und es funktioniert sogar.

Pseudo-Code ist ein sehr wirksames Mittel gegen Strukturfehler im Programm. Bei größeren Programmen hilft es, den Ablauf zunächst im Pseudo-Code zu formulieren. Dann muß man "nur" noch alle Anweisungen in sauberen Delphi-Code übersetzen.

Zu deiner Frage nach dem Namen des Dokuments: Delphi-Referenz durchsuchenPrinter.Title sollte hier helfen. Wichtig ist es, diese Eigenschaft vor Printer.BeginDoc zu setzen. Man findet allerdings in diversen Newsgroups auch Hinweise darauf, daß der eingetragene Name ignoriert wird. :(

Gruß Hawkeye

merlin17 30. Apr 2006 15:33

Re: Drucken über Canvas!
 
Zitat:

Borland liefert seit Version 6 zusätzlich Rave Reports mit. Ab Version 2005 ausschließlich!(Win32)
nur der vollständigkeitshalber: Seit Version Delphi7 und Rave ist sowohl für VCL-Anwendungen (win32) als auch für
VCL.net-Anwendungen enthalten; in BDS 2006 neben Pascal auch für C++.


:-) thomas, TeamNevrona

Goldesel 30. Apr 2006 18:42

Re: Drucken über Canvas!
 
Also irgendwie finde ich die Ravereports in Delphi nicht. Nutze jetzt QuickReports, habe damit allerdings auch Probleme... kennt vielleicht jemand ein gutes Tutorial?

Danke

fkerber 30. Apr 2006 18:45

Re: Drucken über Canvas!
 
HI!

Schau mal, was google alles kann :wink:
http://www.dsdt.info/tutorials/quickreports/


Ciao Frederic

Goldesel 30. Apr 2006 18:59

Re: Drucken über Canvas!
 
Das hatte ich auch schon gefunden, allerdings hat mir das nicht wirklich weitergeholfen. Aber ich werde weiter suchen und bei eventuell auftretenden Problemen zw. Fragn fleißig posten!!! :-D

hsbc 30. Apr 2006 19:34

Re: Drucken über Canvas!
 
Hier vielleicht noch ein weiterer Tipp:

PrintPreview

Schau dir mal diese Komponenten an, sind Freeware und können ebenfalls sehr viel. Ebenfalls mit Vorschau, Miniaturbilder, usw. Ich habe selbst schon einige Anwendungen damit zu meiner vollsten Zufriedenheit geschrieben.

mfg
Herbert

Goldesel 30. Apr 2006 19:49

Re: Drucken über Canvas!
 
@hsbc Danke für den Tipp. Kommt aber leider etwas zu spät ;-) habe bereits angefangen mit QuickReports zu arbeiten. Aber trotzdem danke, ich werde mir die Komponenten auf jeden Fall mal downloaden.


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