Umgang mit dem Printer-Objekt
von Björn Kirsch
Verwendung
Im Zeitalter des Computers, hat man sich angewöhnt viele Informationen direkt am Bildschirm zu lesen.
Dennoch bleibt es oftmals nicht aus, daß man Rechnungen oder Auswertungen ausdruckt und diese in Papierform weitergibt. Genau an diesem Punkt verläßt der Visual Basic Programmierer die Darstellung seiner Daten mit Grids oder Views und muß sich überlegen, wie er die Ausgabe auf den Drucker weiterleitet.
Dieses Tutorial soll ein wenig Aufschluß über grundsätzliche Möglichkeiten der Druckeransteuerung geben.
Mit freundlichen Grüßen
Björn Kirsch
Das Printer-Objekt
Die Grundlagen
Über das Printer-Objekt kann in relativ kurzer Zeit eine erste Ausgabe auf den Drucker erfolgen.
Mit dem Befehl
Printer.Print TEXT
wird der übergebene Text in den Druckerspooler geschrieben. Man muß allerdings beachten, daß allein dieser Befehl nicht ausreicht, den Drucker über Windows anzusteuern. Aufgrund der Tatsache, daß eine Art “Druckerimage” angelegt wird, in dem gearbeitet werden kann, muß der Befehl
Printer.EndDoc
gesendet werden, damit Windows die Information erhält, daß die Seite geschlossen ist. Es ist zu beachten, daß die alleinige Verwendung des Printer.Print-Befehls bereits einen Zeilenvorschub beinhaltet und nicht explizit ein Wagenrücklauf und Zeilenwechsel an den Drucker gesendet werden muß.
Um während einer Druckeroperation eine neue Seite zu erhalten, ist der Befehl
Printer.NewPage
zu verwenden. Ein begonnener Druckerauftrag kann durch
Printer.KillDoc
wieder aus dem Spooler gelöscht werden.
Schriftarten
Das Printer-Objekt stellt eine sehr einfache Möglichkeit des Zugriffes auf die Systemschriftarten zur Verfügung. Ähnlich wie in der RTF-Box oder unter VBA in Word respektive Excel kann auch im Printer-Objekt auf die üblichen Eigenschaften zurückgegriffen werden.
Property | Beschreibung |
---|---|
Printer.Font = "Arial" | Legt die Schriftart fest, z. B. Arial |
Printer.FontSize = 12 | Legt die Größe der Schriftart fest, z. B. 12 |
Printer.Font.Bold = True | Aktiviert den Fettdruck |
Printer.Font.Italic = True | Aktiviert die Kursivschrift |
Printer.Underline = True | Aktiviert das Unterstreichen |
Printer.Font.Strikethrough = True | Aktiviert das Durchstreichen des Textes |
Am Beispiel:
Printer.Font = "Arial" Printer.FontSize = 14 Printer.Font.Bold = True Printer.Font.Italic = True Printer.Print "Testtext" Printer.EndDoc
Dieses einfache Beispiel druckt den Text “Testtext”, in der Schriftart Arial und mit der Schriftgröße 14, am obersten Rand eines Blattes aus. Weiterhin wird der Text fett und kursiv gedruckt.
Die zur Verfügung stehen Schriftarten können durch
x = Printer.FontCount
gezählt werden und der jeweilige Name der Schriftart ist über die Funktion
x = Printer.Fonts(Index - Nummer)
zu erreichen. Das bedeutet
Printer.Fonts(0)würde die erste Schriftart zurückgeben und
Printer.Fonts(Printer.FontCount - 1)die letzte verfügbare Schriftart.
Die Skalierungsmöglichkeiten
Das Printer-Objekt bietet verschiedene Skalierungsmöglichkeiten für das “Druckerimage”. Die Skalierung wird mit dem Befehl
Printer.ScaleMode = Skalierungfestgelegt. Zur Skalierung stehen folgende Einstellungen zur Verfügung:
Konstante | Wert | Beschreibung |
---|---|---|
vbUser | 0 | Benutzerdefiniert |
vbTwips | 1 | Twips (Grundeinstellung, sofern ScaleMode nicht geändert wird) |
vbPoints | 2 | Punkte (bei 72 dpi - dot per inch) |
vbPixels | 3 | Pixel |
vbCharacter | 4 | Zeichen (120 twips horizontal, 240 twips vertikal) |
vbInches | 5 | Inch |
vbMillimeters | 6 | Millimeter |
vbCentimeters | 7 | Zentimeter |
Printer.ScaleMode = 7bedeutet demnach, daß die vom Objekt verarbeiteten Werte ab sofort in cm gerechnet werden. Diese Definition ist immer dann erforderlich, wenn eine Ausrichtung des zu druckenden Textes erfolgen soll (siehe hierzu das nächste Kapitel).
Die Ausrichtung von Objekten
Zur Definition und Nutzung der Ausrichtung von Objekten innerhalb des Druckerimages gibt es verschiedene Hilfsmittel.
Die wichtigsten Möglichkeiten im Überlick:
Property | Beschreibung |
---|---|
X = Printer.ScaleWidth | Gibt den maximalen horizontalen Druckbereich zurück |
Y = Printer.ScaleHeight | Gibt den maximalen vertikalen Druckbereich zurück |
Printer.CurrentX | Setzt die horizontale Druckposition bzw. gibt sie zurück |
Printer.CurrentY | Setzt die vertikale Druckposition bzw. gibt sie zurück |
Im vorherigen Kapitel wurde aufgezeigt, wie eine Skalierung erfolgt. Das folgende Beispiel soll das Zusammenspiel verdeutlichen:
Printer.ScaleMode = 7
Printer.CurrentX = 12
Printer.CurrentY = 8
Printer.Font = "Arial"
Printer.Font = 16
Printer.Print "Test"
Printer.EndDoc
Das obige Beispiel justiert die Druckposition bei 12 Zentimetern auf der X-Achse (horizontal, also Abstand vom linken Seitenrand) und bei 8 Zentimetern auf der Y-Achse (vertikal, also Abstand vom oberen Rand) und druckt den Text “Test” in der Schriftart “Arial”, Schriftgröße 16.
Liest man nun
X = Printer.CurrentX
und
Y = Printer.CurrentY
aus, so bekommt man die nächste Position für den Printer.Print-Befehl zurückgegeben.
Möchte man nun einen Text auf dem Druckerimage positionieren, so benötigt man noch folgende Funktionen:
Property | Beschreibung |
---|---|
X = Printer.TextWidth("Drucktext") | Gibt die Breite des zu druckenden Textes zurück, auf den jeweiligen Skalierungsmode bezogen |
Y = Printer.TextHeight("Drucktext") | Gibt die Höhe des zu druckenden Textes zurück, auf den jeweiligen Skalierungsmode bezogen |
Die linksbündige Textausrichtung gestaltet sich nicht besonders schwierig, da gemäß Printer.CurrentX und Printer.CurrentY einfach die Position festgelegt wird.
Möchte man nun den Text zentriert ausdrucken, so bedarf es ein wenig mehr Aufwand. Die horizontale Zentrierung erfolgt wie folgt:
Printer.CurrentX = _ (Printer.ScaleWidth - Printer.TextWidth("Drucktext")) / 2
Eine vertikale Ausrichtung kann mit folgender Zeile erreicht werden:
Printer.CurrentY = _ (Printer.ScaleHeight - Printer.TextHeight("Drucktext")) / 2
Die rechtsbündige Ausrichtung erfolgt nach dem gleichen Prinzip; auf der X-Achse:
Printer.CurrentX = _ (Printer.ScaleWidth - Printer.TextWidth("Drucktext")
Und auf der Y-Achse:
Printer.CurrentY = _ (Printer.ScaleHeight - Printer.TextHeight("Drucktext")
Die Druckqualität
Natürlich kann auch die Druckqualität für die eigenen Dokumente festgelegt werden.Printer.PrintQuality = Qualität
Konstante | Wert | Beschreibung |
---|---|---|
vbPRPQDraft | -1 | Draft |
vbPRPQLow | -2 | Niedrige Qualität |
vbPRPQMedium | -3 | Normale / Medium Qualität |
vbPRPQHigh | -4 | Hohe / Beste Qualität |
Linien und Kreise
Relativ einfach lassen sich auch Linien und Kreise zeichen:
Printer.Line (x1, y1)-(x2, y2)
zeichnet eine Linie von der Position x1, y1 zur Position x2, y2:
Printer.Circle (x1, y1), Radius
zeichnet einen Kreis gemäß angegebener Koordinaten, in Größe des angegebenen Radius.
Natürlich kann in einem solchen Tutorial nicht alles erörtert werden, was das Printer-Objekt an Funktionen / Methoden zur Verfügung stellt. Dennoch sollte es mit den dargestellten Mitteln nunmehr erheblich einfacher sein, ein eigenes Drucktool zu entwerfen.
Beispielprojekt
Quelltext
Option Explicit ' definiert den Abstand vom Blattkopf in cm Const AbstandOben = 2 ' definiert den Abstand vom Blattfuss in cm Const AbstandUnten = 1 ' definiert den Abstand von der linken Seite in cm Const AbstandLinks = 2.5 ' definiert den Abstand von der rechten Seite in cm Const AbstandRechts = 2.5 ' definiert den Abstand zwischen den einzelnen Objekten Const TextAbstand = 0.1 ' definiert die Rahmenart Const RahmenOben = True Const RahmenUnten = True Const RahmenLinks = True Const RahmenRechts = True ' legt fest, ob die Seiten gezählt werden Const SeitenZaehlen = True ' setzt den Zaehler für die Seitenzahlen Dim Seiten As Integer Private Sub Command1_Click() Dim i As Integer Dim DruckString As String Seiten = 0 ' mit cm skalieren Printer.ScaleMode = 7 ' Schriftart wählen Printer.Font = "Arial" ' Schriftgröße wählen Printer.FontSize = "11" Call NeueSeite(False) For i = 1 To 100 Call Zentriert(Printer.CurrentY, "Test " + Str(i)) Next i Printer.EndDoc End Sub Private Sub NeueSeite(Newpage As Boolean) If Newpage = True Then Printer.Newpage End If Seiten = Seiten + 1 If RahmenOben = True Then Printer.Line _ (0 + AbstandLinks - TextAbstand, 0 + AbstandOben - _ TextAbstand)-(Printer.ScaleWidth - AbstandRechts + _ TextAbstand, 0 + AbstandOben - TextAbstand) If RahmenUnten = True Then Printer.Line _ (0 + AbstandLinks - TextAbstand, Printer.ScaleHeight - _ AbstandUnten + TextAbstand)-(Printer.ScaleWidth - _ AbstandRechts + TextAbstand, Printer.ScaleHeight - _ AbstandUnten + TextAbstand) If RahmenLinks = True Then Printer.Line _ (0 + AbstandLinks - TextAbstand, 0 + AbstandOben - _ TextAbstand)-(0 + AbstandLinks - TextAbstand, _ Printer.ScaleHeight - AbstandUnten + TextAbstand) If RahmenRechts = True Then Printer.Line _ (Printer.ScaleWidth - AbstandLinks + TextAbstand, 0 + _ AbstandOben - TextAbstand)-(Printer.ScaleWidth - _ AbstandLinks + TextAbstand, Printer.ScaleHeight - _ AbstandUnten + TextAbstand) If SeitenZaehlen = True Then If RahmenUnten = False Then Printer.CurrentY = (Printer.ScaleHeight - AbstandUnten + _ TextAbstand) Printer.CurrentX = (Printer.ScaleWidth - _ Printer.TextWidth("- Seite " + _ Str(Seiten) + " -")) / 2 Printer.Print "- Seite " + Str(Seiten) + " -" Else Printer.CurrentY = (Printer.ScaleHeight - AbstandUnten + _ TextAbstand + 0.1) Printer.CurrentX = (Printer.ScaleWidth - _ Printer.TextWidth("- Seite " + _ Str(Seiten) + " -")) / 2 Printer.Print "- Seite " + Str(Seiten) + " -" End If End If Printer.CurrentY = AbstandOben End Sub Private Sub Zentriert(Height As Single, strText As String) If Printer.CurrentY + Printer.TextHeight(strText) >= _ Printer.ScaleHeight - AbstandUnten Then Call NeueSeite(True) Height = Printer.CurrentY End If ' hiermit wird der Text auf der X-Kooradinate zentriert ' Schema: Seitenbreite - Textbreite / 2 Printer.CurrentX = (Printer.ScaleWidth - _ Printer.TextWidth(strText)) / 2 Printer.CurrentY = Height Printer.Print strText End Sub Private Sub Rechts(Height As Single, strText As String) If Printer.CurrentY + Printer.TextHeight(strText) >= _ Printer.ScaleHeight - AbstandUnten Then Call NeueSeite(True) Height = Printer.CurrentY End If ' hiermit wird der Text auf der X-Kooradinate zentriert ' Schema: Seitenbreite - Textbreite - AbstandvonRechts Printer.CurrentX = (Printer.ScaleWidth - _ Printer.TextWidth(strText) - AbstandRechts) Printer.CurrentY = Height Printer.Print strText End Sub Private Sub Links(Height As Single, strText As String) If Printer.CurrentY + Printer.TextHeight(strText) >= _ Printer.ScaleHeight - AbstandUnten Then Call NeueSeite(True) Height = Printer.CurrentY End If ' hiermit wird der Text auf der X-Kooradinate zentriert ' Schema: 0 + AbstandvonLinks Printer.CurrentX = (0 + AbstandLinks) Printer.CurrentY = Height Printer.Print strText End Sub
Download
Projekt als Download [2485 Bytes]
Ihre Meinung
Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 13 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Fabio am 14.12.2008 um 15:46
Hallo zusammen, ich wollte mich nur herzlich bedanken für diese sehr hilfreiche Seite. Ich programmiere gerade eine Home-Applikation und benötigte gerade diese Druckfunktionen.
Danke nochmal und Gruss
Fabio
Kommentar von dampfohr am 07.12.2008 um 09:29
Hallo
funktioniert ganz prima, lediglich ein kleiner Programm fehler hat sich eingeschlchen. Im sub NeueSeite ist beim rechnen Rand der AbstandLinks eingegeben. Wenn die Abstände gleich sind gibt's kein Problem. Sonst fällt's auf.
Trotzdem vielen Dank
dampfohr
Kommentar von Bernd Bahde am 02.04.2008 um 22:25
Hi,
ich habe eine Druckvorschau geschrieben, die an sich gut läuft. Ein Problem ist: Wird das Programm beendet und nochmals gestartet, so stellen sich für Printer.Textwidth falsche Werte ein. Es wird bei Font.Size 20 z. B. der gleiche Wert zurück gegeben wie bei 10. Wird Visual Basic komplett beendet und neu gestarte ist das Problem wieder verschwunden. Warum?
TestProgramm (Form mit Picture "Bild1"):
Mehrmals starten, wieder beenden und wundern.
For i = 1 To 10
Printer.Font.Size = i
Bild1.Print "Druck", Printer.Font.Size, Printer.TextWidth("ABCDEF")
Next i
Gruß
Bernd
Kommentar von Karl-Heinz Pönighaus am 30.08.2007 um 15:33
Wie kann ich die Linienart,-Stärke und Farbe einstellen ?
Vielen Dank für die Antwort
Kommentar von Andreas Wenig am 02.05.2005 um 14:24
Hallo,
supper Euer Tutorial. Jetzt hätte ich da gerne noch ein Problem:
Kann man auch die Linienart, -Stärke und -Farbe einstellen? Ich habe habe inziwschen mehrere Versuche gestartet, erhalte aber immer nur eine dünne schwarze durchgezogene Linie. Eine ausgefüllte Box zu zeichnen wäre auch nicht schlecht, bei der man die Füllfarbe und Modus einstellen kann.
Über Anregungen würde ich mich wirklich sehr freuen.
Viele Grüße,
Andreas
Kommentar von Peyman am 30.03.2005 um 16:26
Ihr seid SUPER!!!
Kommentar von Martin Rapp am 13.03.2005 um 16:16
Ich finde dieses Tutorial einfach super.
Leider ist ein Fehler drinnen.
Dieser wäre beim unterstreichen.
Richtig wäre: Printer.font.Underline = True
oben steht halt Printer.Underline = True
Dass war bestimmt nur ein Rechtschreibfehler.
Macht weiter so
mfg
Martin
Kommentar von Stefan Raithel am 07.01.2005 um 14:31
Hallo an Alle,
zuerst, ich bin kein guter Programmierer, "klaue" gern und passe an. Nur damit man nicht zuviel von mir hält.
Nun zur Frage. Ich habe den Demotext verwendet und bekomme beim Debuggen einen Fehler beim erstem Eintrag von
printer.scaleMode .....
mit der Aussage "Variable nicht definiert".
oder im Direkt Bereich einen Laufzeitfehler 424 "Objekt erforderlich"
Was habe ich vergessen?
Vielen Dank
Stefan Raithel
Kommentar von pit am 24.10.2004 um 19:43
'geht ganz einfach:
Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, _
ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Public Sub PrintHTMLDocument(ByVal sFilename As String)
Call ShellExecute(Me.hwnd, vbNullString, _
"rundll32.exe", "mshtml.dll,PrintHTML " & _
Chr$(34) & sFilename & Chr$(34), "", vbHide)
End Sub
private sub command1_click()
printHTMLdocument "c:\test.htm"
end sub
'MFG!!
Kommentar von jbaar am 22.10.2004 um 17:23
Diese Projekt find ich einfach genial. So wie es oben steht funzt das auch super.
Jetzt wollte ich jedoch folgendes probieren:
Original:
For i = 1 To 100
Call Zentriert(Printer.CurrentY, "Test " + Str(i))
Next i
Da ich den Zähler nicht brauche habe ich diesen auskommentiert. Desweiteren habe ich den String ("Test ") durch den Inhalt einer RichTextBox ersetzt.
Daher meine Änderung:
'For i = 1 To 100
Call Zentriert(Printer.CurrentY, rtb_wk.Text)
'Next i
Leider wird da der Inhalt der RT-Box völlig unformatiert gedruckt. Alles klebt am linken Rand. Gibts da irgendwie ne Lösung für dieses Problem. Ich wäre seeehr dankbar für jeden guten Hinweis.
Kommentar von Michael Wolf am 14.05.2004 um 20:39
Hallo!
Ich möchte gerne in VBA (Access um genau zu sein) etwas ausdrucken. Doch das dort vorhandene Printer-Objekt, beherrscht (fast) gar keinen der Befehle, die ich anwenden möchte...
Was soll ich denn da jetzt nur machen?
Kommentar von Mathias am 11.12.2003 um 19:16
Hallo,
laut Euren Totorials müßte folgender code eigentlcih eine angezeigte HTML Seite ausdrucken:
Private Sub cmd_text_druck_Click()
'Inhalt drucken
Printer.ScaleMode = 3
Printer.Print WebBrowser1.document.All(0).innerText
Printer.EndDoc
End Sub
Das tut es auch, aber ohne jegliche Formatierung. Ihc möchte aber den Druck so haben, wie in WebBrowser1 angezeigt. Was muß ich da tun?
Mathias
Kommentar von Benjamin Noack am 11.12.2003 um 15:05
wie druckt man briefumschläge ????