Die Community zu .NET und Classic VB.
Menü

Umgang mit dem Printer-Objekt

 von 

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 = Skalierung
festgelegt. 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 = 7
bedeutet 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 ????