In den meisten Anwendungen, die mit einer VBA-Entwicklungsumgebung ausgestattet sind, gibt es offensichtlich keine Möglichkeit, eine Auflistung der im System vorhandenen Drucker zu erhalten. Die ActiveX-DLL PrinterListDLL stellt daher einer Auflistung der Namen der verfügbaren Drucker zur Verfügung.
Die SystemPrinters-Auflistung ist die Standard-Eigenschaft des globalen Objekts PrinterList und kann daher direkt und ohne vorherige Instanzierung verwendet werden, sobald ein Verweis auf die ActiveX-DLL in das aktuelle Projekt aufgenommen worden ist. Sie kann auch wie jede andere ActiveX-Komponente explizit deklariert und instanziert werden, sowohl mit Set ... = New PrinterList als auch mit Set ... = CreateObject("PrinterListDLL.PrinterList").
Zur Iteration durch die Auflistung mit For...Each ist die Laufvariable als Variant zu deklarieren. Sie können die Auflistung aber auch in einer gewöhnlichen Schleife mit einer Zählervariablen (des Datentyps Long) durchlaufen.
Sub Test1()
Dim Printer As Variant
For Each Printer In SystemPrinters
Debug.Print Printer
Next
End Sub
Sub Test2()
Dim l As Long
For l = 1 To SystemPrinters.Count
Debug.Print SystemPrinters(l)
Next
End Sub
Der Code der Komponente ist nicht sehr umfangreich. Die Komponente enthält zwei Klassen. Die Klasse PrinterList ist global (Instancing = GlobalMultiUse) und dient lediglich dazu, in ihrer Standard-Eigenschaft SystemPrinters eine von ihr selbst angelegte Instanz der von außen nicht direkt instanzierbaren Klasse Printers zur Verfügung zu stellen, die die eigentliche Auflistung der Druckernamen anbietet.
Private pPrinters As Printers
Public Property Get SystemPrinters() As Printers
Set SystemPrinters = pPrinters
End Property
Private Sub Class_Initialize()
Set pPrinters = New Printers
End Sub
Private Sub Class_Terminate()
Set pPrinters = Nothing
End Sub
Die Klasse Printers beruht selbst auf einer Collection, die jedes mal neu angelegt und mit den Namen der Drucker gefüllt wird, wenn ein Druckername über die Standard-Eigenschaft PrinterName abgerufen wird, oder durch die Auflistung mit For...Each iteriert wird (Aufruf der verborgenen Methode NewEnum). So wird sichergestellt, dass die Auflistung immer aktuell ist.
Private mPrinters As Collection
Public Property Get Count() As Long
Count = Printers.Count
End Property
Public Property Get PrinterName(Index As Long) As Variant
zFillPrinters
PrinterName = mPrinters(Index)
Set mPrinters = Nothing
End Property
Public Function NewEnum() As IUnknown
zFillPrinters
Set NewEnum = mPrinters.[_NewEnum]
End Function
Private Sub zFillPrinters()
Dim nPrinter As Printer
Set mPrinters = New Collection
With mPrinters
For Each nPrinter In Printers
.Add nPrinter.DeviceName
Next
End With
End Sub
Private Sub Class_Terminate()
Set mPrinters = Nothing
End Sub
Sie können alternativ zu der Standard-Version, die die Visual Basic 6 Runtime-Dateien benötigt, auch eine Version für Visual Basic 5 herunterladen - je nach dem, welcher Satz Runtime-Dateien auf Ihrem System bereits vorhanden ist oder welche VB-Version Sie bevorzugen. Die Runtime-Dateien selbst sind in den Setups nicht enthalten. Den Code samt Beispiel-Projekt können Sie sowohl für VB 5 als auch für VB 6 herunterladen.
|