Während heutzutage der Begriff Digitalisierung mehr und mehr und die Runde macht, und man unter immer mehr Emails den Hinweis findet, dass man sich doch aus Umweltschutzgründen überlegen soll, ob man die Mail wirklich ausdrucken will, ist der Druckoutput doch immer noch bestimmend im Programmierbereich.
Auch wenn viele Dokumente heute als PDF durch die Welt reisen, so werden PDFs doch auch mehr oder weniger gedruckt.
Xbase++ bietet zwei Möglichkeiten an, zu drucken:
- Stream- bzw. zeichen-orientiert wie unter Clipper - unter Verwendung eines Windows-Druckers
Drucken unter Windows
Windows hat die Schnittstellenvielfalt gebändigt, indem es eine Standardschnittstelle zum Drucker anbietet, an die sich eigentlich jedes Programm andocken kann.
Wie der PC mit dem Drucker kommuniziert, ist ein ganz anderes Thema, das durch den jeweiligen Druckertreiber sowie die physikalische Schnittstelle geregelt wird.
Ein Programm greift immer nur auf ein Windows-Drucker-Objekt zu und druckt darüber.
Das Drucken verläuft asynchron, d.h. das druckende Programm redet mit einem Spooler, einem Programm, das Druckoutput entgegennimmt, speichert und zu einem geeigneten Zeitpunkt an den Drucker schickt. Zum Druck ist noch nicht einmal ein physisch vorhandener Drucker erforderlich: es genügt, wenn der Druckertreiber installiert ist.
Ein gutes Beispiel hierfür sind Druckertreiber, die PDF-Dateien erzeugen: hier ist ein Drucker erforderlich, da wir es mit einem rein elektronischen Dokument zu tun haben.
Drucken unter Xbase++
Um Druckoutput zu erzeugen, benötigt man einen installierten Druckertreiber, sowie ein XbpPrinter()-Objekt:
XbpPrinter()
Ein XbpPrinter()-Objekt ist erst einmal nur eine leere Hülle, die über Definitionen und Zuweisungen funktionsfähig gemacht wird.
oPrint := XbpPrinter():new() oPrint:create("Microsoft Print to PDF")
Durch diese Anweisungen erzeugen wir ein Objekt der XbpPrinter()-Klasse, das mit dem Druckertreiber "Microsoft Print to PDF" verknüpft ist. An dieser Stelle sei darauf hingewiesen, dass die Namen der Druckertreiber eine exakte Schreibweise (Gross- und Kleinschreibung inklusive) verlangen.
Wir sind jedoch noch nicht in der Lage, zu drucken. Das Drucker-Objekt verlangt nach einem PresentationSpace, über den gedruckt werden kann. Oder, genauer geschrieben, der PresentationSpace wird benötigt, um Output aufzunehmen und wiedergeben zu können.
XbpPresSpace()
Ein PresentationSpace muss immer in Verbindung mit einem DeviceContext stehen. Der DeviceContext ist in unserem Beispiel das XbpPrinter()-Objekt:
oPresSpace := XbpPresSpace():new() oPresSpace:create(oPrint, oPrint:paperSize(), GRA_PU_LOMETRIC)
Auch hier ist der PresentationSpace erst einmal eine leere Hülle, die beim Ausführen der Methode :create() durch Definitionen mit Leben gefüllt wird.
Als Parameter benötigen wir:
- das jeweilige Objekt, über das die Ausgabe erfolgen soll
- eine Angabe zu den Dimensionen des Ausgabemediums (ein Array mit den Werten für Länge und Breite). Die hier angegebenen Werte beziehen sich auf die Adressierungseinheiten, die im dritten Parameter festgelegt werden
- eine Angabe, wie Adressierungen im PresentationSpace zu interpretieren sind (GRA_PU_LOMETRIC steht hier für 0.1 mm für einen Wert von 1 - GRA_PU_HIMETRIC erlaubt eine genauere Positionierung, hier steht 0.01 mm für einen Wert von 1)