Hallo zusammen,
nachdem "fertige Lösungen" wohl nicht mehr zu erwarten waren, habe ich mich selbst bemüht und "das Rad neu erfunden". Nun, nicht ganz! Immerhin habe ich eine sehr brauchbare Routine zum Drucken gefunden [
flocke.vssd.de/prog/tips/pascal/prtred/], sie angepasst und bin schon recht zufrieden. Bevor ich die Lösung der "Öffentlichkeit" vorstelle, gibt es noch kleine Wünsche, die sinnvoll wären mit einzuarbeiten.
Vielleicht sage ich zunächst, was schon alles funktioniert:
Unter Nutzung der Komponenten TPageSetuoDialog und TPrintdialog kann ich drucken unter Beachtung von:
- Papiergröße einstellen, Blattränder einstellen, Hoch-Querformat beachten
- Drucker auswählen, Druckbereich festlegen (Alles, Seite von..bis, oder nur markierten Text drucken)
Damit habe ich das "wichtige" Ziel erst einmal errreicht. So weit so gut. Nun soll es kleine Erweiterungen geben:
1. PageNumber am Blattende: Was einfach aussieht funktioniert im Hinblick auf die Positionierung des Textes bei mir nur bedingt. Die Seitennummer drucke ich mit
Delphi-Quelltext
1:
| Printer.Canvas.TextOut(vSeiteXPos, vSeiteYPos, 'Seite '+ IntToStr(Printer.Pagenumber)); |
Da die X,Y-Koordinaten sich in Abhängigkeit von Blattgröße und Hochkant/Querformat ändern, ermittle ich diese mit:
Delphi-Quelltext
1: 2:
| vSeiteXPos := PageSetupDialog1.PageWidth div 20) ; vSeiteYPos := PageSetupDialog1.PageHeight div 10) -100 ; |
(Ergebnisse bei DIN A4 Hochkant). Tatsächlich druckt der Canvas-Befehl die Seitennummer aber nicht Blatt-mittig und an der Y-Koordinate etwa 4 cm über Blattende, also mitten in den Text (siehe Anlage). Mein Druckauftrag sieht verkürzt wie folgt aus;
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| with PrintDialog1 do begin h := RichEdit1.Handle; Printer.BeginDoc; case ... prAllPages: begin pp:=-1; vEndPos := length(Richedit1.Text) - (Richedit1.Lines.Count-1); if length(Richedit1.Text)>0 then begin repeat pp := PrintRichEditIntoRect(h, Rect(vRandLi, vRandOb, vRandRe, vRandUnt), false, -PageRect_MM, pp); Printer.Canvas.TextOut(vSeiteXPos, vSeiteYPos, 'Seite '+ IntToStr(Printer.Pagenumber)); if pp<vEndpos then Printer.NewPage; until (pp>=vEndpos); end; end; end; Printer.EndDoc; end |
Frage1: Warum ist Canvasfenster nicht an gewünschter Position?
Mir fällt auf, dass die Canvas-Schriftgröße von der Richedit-Schrift abweicht (ist nicht schlimm). Könnte dies etwas damit zu tun haben? (eigentlich nicht, denn das Fenster wird durch X,Y festgelegt). Was ist falsch?
2. Eine weitere Verbesserung hätte ich gerne beim Printdialog. Diesen kann man nur mit OK oder Abbruch bedienen. Bei Ok geht man davon aus, dass damit auch der Druckvorgang ausgelöst wird. Ich möchte jedoch, dass auch Druckerauswahl, Druckbereichsauswahl oder Seitenanzahl eingestellt werden können ohne sofort bei Ok zu drucken. Für den Druckauftarg soll es gezielt einen weiteren "Drucken-Butttom" geben (wie z.B. bei Word oder Excel).
Frage: Gibt es in Delphi einen neueren (verbesserten) Druckdialog den ich noch nicht kenne?
Hintergrund: Zum Testen benutze ich keinen Papierdrucker, sondern verwende einen Pdf-Drucker. Beim Start des Programms ist jedoch der Systemdrucker eingestellt. Ich kann also die Voreinstellungen (für den Schnelldruck) nicht einstellen, ohne vorab einen Druck ausgelöst zu haben (es sei denn, Ok löst den Druck nicht aus. Dann brauche ich jedoch einen weiteren Druckbutton an anderer Stelle.
Wer kann helfen?
hRb