Rubrik: Drucker | VB-Versionen: VB5, VB6 | 26.05.03 |
VB-Printer-Objekt in VBA benutzen Kapseln des Printer-Objekts in einer ActiveX-DLL, so dass man auch unter VBA das dort fehlende Printer-Objekt wie gewohnt verwenden kann. | ||
Autor: Dieter Otter | Bewertung: | Views: 45.095 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Als VB und VBA-Programmierer haben Sie sich doch sicherlich auch schon manchmal darüber geärgert, dass das Printer-Objekt unter VBA nicht zur Verfügung steht. Dieses Manko lässt sich aber sehr leicht "beheben", indem man das Printer-Objekt einfach über eine ActiveX-DLL zur Verfügung stellt. Innerhalb VBA kann man dann die ActiveX-Klasse verwenden und somit auch das VB-Printer-Objekt
Sicherlich denkt jetzt der ein oder andere: "Ach Du meine Güte... alle Eigenschaften, Methoden usw. müssen jetzt in der ActiveX-Klasse nachgebildet werden."
Aber weit gefehlt: Es genügt völlig das Printer-Objekt, sowie die Printers-Auflistung als öffentliche Objekte zu deklarieren
Hier der Code der ActiveX-Klasse:
Option Explicit ' Öffentliche Objekte Public vbPrinter As Printer Public vbPrinters As New Collection
Private Sub Class_Initialize() ' Printer-Objekt Set vbPrinter = Printer ' vbPrinters-Collection füllen Dim oPrinter As Printer For Each oPrinter In Printers vbPrinters.Add oPrinter Next End Sub
Private Sub Class_Terminate() ' Objekte zerstören Set vbPrinter = Nothing Set vbPrinters = Nothing End Sub
Erstellen Sie ein neues Projekt und wählen als Projekttyp ActiveX-DLL. Tragen Sie unter "Projekt-Eigenschaften" als Projektname vbPrinter ein und fügen dann obigen Code in das Klassenmodul Class1 ein.
Kompilieren Sie das Projekt nun zu einer ActiveX-DLL.Verwenden der "neuen" Printer-Klasse in VBA (Bsp.: Access 97)
Starten Sie MS-Access, erstellen ein neues Formular und platzieren einen Button auf die Form. Wechseln Sie in den VBA Code-Editor und aktivieren über das Menü Extras - Verweise die neue vbPrinter-Klasse.
Im Allgemein-Teil der Form wird die Klasse wie folgt instanziert:
Option Compare Database Option Explicit ' vbPrinter-Klasse instanzieren Private pClass As New vbPrinter.Class1
Ein kleiner Test:
Fügen Sie im Form_Load Ereignis folgenden Code ein:
Private Sub Form_Load() ' Name des Standard-Druckers MsgBox pClass.vbPrinter.DeviceName ' Alle verfügbaren Drucker anzeigen Dim i As Integer Dim sMsg As String For i = 0 To pClass.vbPrinters.Count - 1 sMsg = sMsg + pClass.vbPrinters(i + 1).DeviceName + vbCrLf Next i MsgBox sMsg End Sub
Wenn Sie nun unsere kleine Access-Anwendung starten, sollte eine MsgBox mit dem Namen des Standard-Druckers erscheinen. Danch wird eine weitere MsgBox mit allen verfügbaren Druckern angezeigt.
Ein kleiner Test-Ausdruck
Fügen Sie nachfolgenden Code in das Click-Event des Buttons ein.
Private Sub Button_Click() With pClass.vbPrinter ' Test-Ausdruck .ScaleMode = 6 ' Maßeinheit "mm" .CurrentX = 20: .CurrentY = 20 .Font.Name = "Arial" .Font.Size = 14 .Font.Bold = True pClass.vbPrinter.Print "Drucken in VBA" & vbCrLf & _ "...mit dem bekannten VB Printer-Objekt" .CurrentX = 20: .CurrentY = 50 .Font.Bold = False .Font.Size = 12 pClass.vbPrinter.Print "Beliebiger Text, der autom. am " & _ "rechten Rand umgebrochen wird..." ' Bild drucken .PaintPicture LoadPicture("IrgendeinBild.gif"), 20, 100 ' Wichtig: Wenn Druckauftrag beendet, dann... .EndDoc End With End Sub
Das Beispielprojekt und auch die ActiveX-DLL finden Sie auf unserer vb@rchiv CD