Drucker in dBASE-Programmen einstellen

Mit der dBASE-Funktion

chooseprinter()

können Sie einen bestimmten Drucker auswählen, der dann z. B. auch bei Befehlen wie

set printer on
? “zu druckender Text …”
set printer off

verwendet wird. Im Dialog nach chooseprinter() ist meist der Standard-Drucker von Windows voreingestellt. Wenn Sie einen anderen Drucker benutzen wollen, wählen Sie diesen aus der Liste der speziellen Drucker aus. Eine Text-Information über den gewählten Drucker ist anschliessend auch über die dBASE Systemvariable _pdriver abrufbar:

? _pdriver

Diese Systemvariable kann jedoch nicht nur abgefragt, sondern auch ganz gezielt verändert werden, um z. B. beim Programmstart gleich einen bestimmten Drucker zu aktivieren.

Dazu müssen Sie diesen Drucker lediglich einmal per chooseprinter() einstellen und sich den Inhalt von _pdriver merken. Anschliessend können Sie die Zeichenkette direkt im Quellcode an _pdriver zuweisen um den Drucker auch ohne Zutun des Benutzers zu aktivieren.

Meist besteht diese Zeichenkette aus dem Namen des Druckers und ggf. weiterer Infos. Den Text “WINSPOOL,” fügt Windows vorne ein, auch wenn der Spooler (ein Zwischenspeicher um grössere Druckaufträge schneller abfertigen zu können) für diesen Drucker ausgeschaltet ist.

Am sichersten ist es, wenn Sie den Drucker einmal manuell einstellen, sich danach die Zeichenkette ausgeben lassen, kopieren und in den Quellcode übernehmen.

chooseprinter() ; ? _pdriver

Eine beispielhafte Ausgabe von ? _pdriver könnte z. B. so aussehen:

WINSPOOL,Samsung SCX-4500 Series

Diese Ausgabe übernehmen Sie exakt so in Ihr Programm, inkl. Leer- und Sonderzeichen. Lediglich Gross- und Kleinschreibung ist beliebig. Bei der Zuweisung an _pdriver muss der Text auch noch in “” gesetzt werden, da es sich ja um eine Zeichenkette handelt:

_pdriver = “WINSPOOL,Samsung SCX-4500 Series”

Damit wird der Drucker befehlsgesteuert aktiviert, ohne dass der Benutzer etwas tun muss. Das gilt sowohl für mit dBASE erstellte EXE-Programme als auch für mit DO gestartete PRG- oder WFM-Programme. Auch für die dBASE-Entwicklungsumgebung kann man es nutzen und als Startbefehl einbauen, wie bereits an anderer Stelle unserer Trickkiste beschrieben. Das funktioniert ab Visual dBASE 5.5 und 5.7, sowie allen Folgeversionen inkl. dBASE 2000.

Hier ein paar beispielhafte Ausgaben von ? _pdriver bei verschiedenen PCs/Druckern:

WINSPOOL,Samsung SCX-4500 Series
WINSPOOL,Samsung SCX-4500 Series (NET/LPT2)
WINSPOOL,Microsoft XPS Document Writer
WINSPOOL,FinePrint pdfFactory
WINSPOOL,FinePrint 2000
WINSPOOL,Fax
WINSPOOL,Adobe PDF
WINSPOOL,Epson Stylus Scan 2500 ESC/P 2 (USB)
WINSPOOL,fritz.mac FRITZ!Box Fon WLAN 2170
WINSPOOL,\\VENUS\FRITZfax Drucker

Sie sehen, dass auch Netzwerk-Drucker (diese beginnen i.d.R. mit \\, gefolgt vom Namen des Servers, dann ein \ und dann erst der eigentliche Druckername) so aktiviert werden können.

Übrigens, wenn Sie per chooseprinter() einen Drucker wählen der gerade nicht verfügbar ist (z. B. einen Netzwerk-Drucker, dessen PC nicht eingeschaltet ist), so erhalten Sie meistens (nicht immer, je nach Windows- und Treiber-Version) eine Fehlermeldung wie diese:

Fehler: Ungültiger Treibername oder nicht ausreichende Systemressourcen: WINSPOOL

Diese Meldung hat schon viele dBASE-Benutzer an den Rand der Verzweiflung gebracht, insbesondere bei den ersten Versionen 5.x (dBASE for Windows, Visual dBASE). Zumal bei diesen Versionen oft noch der lästige Fehler dazu kam, dass sich beim Start eines damit erstellten Programms bestimmte Drucker autom. in den Vordergrund gedrängt und autom. aktiviert haben, selbst wenn sie nicht der Standard-Drucker von Windows waren. Häufig trat das bei “unechten” Druckern auf, z. B. Druckertreiber von Fax- oder PDF-Programmen.

Der obige Fehler tritt jedoch richtigerweise dann auf, wenn Sie einen Drucker auswählen der zwar in der Druckerliste von Windows geführt wird, jedoch nicht (von Windows) benutzbar ist, warum auch immer. Wir haben diesen Effekt z. B. auch unter Windows7. Dieses erkennt einen Drucker im Netzwerk (an einem XP-Rechner angeschlossen und im Netzwerk freigegeben) zwar korrekt, doch sobald man an ihn druckt meldet Windows7 lapidar Unbekannter Fehler, ganz egal mit welchem Programm gedruckt wird. Es liegt also sicher nicht an dBASE.

Und bei dBASE Plus kommt es bei Auswahl dieses Druckers zu obiger Meldung, die wir sonst nur noch aus Visual dBASE Zeiten kannten. Doch dBASE ist unschuldig, Windows7 ist einfach unfähig diesen (gerade einmal zwei Jahre alten) Drucker im LAN zu benutzen, trotz aktueller Updates und neuster Treiber. Dass das Problem an Windows7 liegt beweist die Tatsache, dass dieses Windows auf einem Apple iMac unter Parallels Desktop läuft, und der iMac mit seinem eigenen System (Snow Leopard) völlig problemlos auf diesen XP-Netzwerkdrucker druckt!

Update 2016: von einem dBASE-Anwender erreichte mich dazu noch dieser Hinweis:
Hallo, Danke für den Artikel zu Druckproblemen mit Visualdbase 16 Bit. Erst nachdem ich mit regedit unter dem Suchbegriff “winspool” alle nicht vorhandenen Drucker gelöscht hatte kam die Fehlermeldung nicht mehr und dbase startete normal. Der Fehler hat mich zur Verzweiflung gebracht! System Win10 mit visualdb 5.5/5.7 im 16 Bit Modus. Alles läuft prima. Dies zur Info für die restlichen dbaser.

Mehr Hinweise zum Drucken mit dem ?-Befehl enthält dBASE lebt! Band 1 ab Seite 285.

(Stand dieser Info: 2011)