Im Zeitalter des Computers, hat man sich angewöhnt viele Informationen direkt am Bildschirm zu lesen. Dennoch bleibt es oftmals nicht aus, dass man Rechnungen oder Auswertungen ausdruckt und diese in Papierform weitergibt. Genau an diesem Punkt verlässt der Visual Basic Programmierer die Darstellung seiner Daten mit Grids (Tabellen) oder Views (Anzeigefelder) und muss sich überlegen, wie er die Ausgabe auf den Drucker weiterleitet.

Dieses Tutorial soll ein wenig Aufschluss über grundsätzliche Möglichkeiten der Druckeransteuerung geben.

 Björn Kirsch  12/2000
 
  Grundlagen  voriges Thema [ Top ] nächstes Thema

Ü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 muss allerdings beachten, dass allein dieser Befehl nicht ausreicht, den Drucker über Windows anzusteuern. Aufgrund der Tatsache, dass eine Art “Druckerimage” angelegt wird, in dem gearbeitet werden kann, muss der Befehl

Printer.EndDoc

gesendet werden, damit Windows die Information erhält, dass die Seite geschlossen ist. Es ist zu beachten, dass die alleinige Verwendung des Printer.Print-Befehls bereits einen Zeilenvorschub beinhaltet und nicht explizit ein Wagenrücklauf und Zeilenwechsel an den Drucker gesendet werden muss.

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.
 
  Die Schriftarten voriges Thema [ Top ] nächstes Thema

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) gibt die erste Schriftart zurück und die letzte verfügbare Schriftart mit Printer.Fonts(Printer.FontCount - 1).

 
  Skalierungsmöglichkeiten voriges Thema [ Top ] nächstes Thema

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   Benutzer definiert  
 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, dass 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).
 
  Ausrichtung von Objekten voriges Thema [ Top ] nächstes Thema

Zur Definition und Nutzung der Ausrichtung von Objekten innerhalb des Druckerimages gibt es verschiedene Hilfsmittel.

Die wichtigsten Möglichkeiten im Überblick:

Property      Beschreibung
 X = Printer.ScaleHeight   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.FontSize = 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 ist nicht besonders schwierig, da mit 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 voriges Thema [ Top ] nächstes Thema
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 voriges Thema [ Top ] nächstes Thema

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, dass 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 voriges Thema [ Top ]
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
Das Beispielprojekt gibt es hier zum Download  ( 20622 )

Startseite | VB/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | VB-/VBA-Forum | VB.Net-Forum | DirectX | DirectX-Forum | Foren-Archiv | VB.Net | Chat | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report

Letzte Aktualisierung: Freitag, 01. Februar 2002