Ermittlung der Druckerbereitschaft

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

Antworten
Werner
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 120
Registriert: Sa, 18. Mär 2006 16:08

Ermittlung der Druckerbereitschaft

Beitrag von Werner »

Hi!
Kann mir jemand sagen, wie ich aus einem xBase-Programm die Bereitschaft eines Druckers ermitteln kann. Mit isprinter() lässt sich lediglich die Druckerbereitschaft am LPT1 ermitteln. Wie kann ich diese Informationen bekommen, wenn der Drucker über einen USB-Anschluss angeschlossen ist oder gar an einem Netzwerk angekoppelt ist?

Ferner würde mich einmal interessieren, ob es eine Möglichkeit gibt, einen schon angelaufenen Druckvorgang mit einem Hotkey abzubrechen.

Vielen Dank im voraus!

Gruß Werner
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Druckerstatus:
Wenn Du unter Verwendung der xBase-Tools programmierst, dann wird Dir die Funktion PrintStat() weiter helfen.

Abbruch eines Druckvorganges:
Ich denke, dass sich ein Druckabbruch unter Verwendung einer Taste nur über das Windows-API realisieren läßt, da der Druckoutput vom Windows-OS gehändelt wird.


Gruß, Olaf
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Werner,

ich habe gerade in Hilfe nachgesehen. Bei XbpPrinter() gibt es Methode printerStatus(), wo du alle möglichen Sacen abfragen kannst.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo Werner,

außerdem kannst du beim xbpprinter() den :devport() abfragen. Hier erhälst du den anschluss des Druckers.

Schau es dir mal an.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Juergen
UDF-Programmierer
UDF-Programmierer
Beiträge: 92
Registriert: Di, 19. Dez 2006 19:37
Wohnort: Düsseldorf
Kontaktdaten:

Druckerbereitschaft

Beitrag von Juergen »

Hallo Werner,

mir ist es auch noch nicht gelungen, die Bereitschaft des Druckers an LPT
direkt abzufragen. Ist der Drucker hingegen an einen
COM-Port angeschlossen, funktioniert sogar ISPRINTER().

Ich gehe davon aus, dass Windows eine Abfrage auf
unterster Ebene nicht zulässt.

Die Fehlermeldung kommt nach relativ langer Zeit von
Windows. Ich würde dies auch gerne abfangen.


Gruß
Jürgen
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Druckerbereitschaft

Beitrag von AUGE_OHR »

hi,
Juergen hat geschrieben: mir ist es auch noch nicht gelungen, die Bereitschaft des Druckers an LPT
direkt abzufragen. Ist der Drucker hingegen an einen
COM-Port angeschlossen, funktioniert sogar ISPRINTER().
zeig uns doch mal deinen Code den du verwendest.

gruss by OHR
Jimmy
Juergen
UDF-Programmierer
UDF-Programmierer
Beiträge: 92
Registriert: Di, 19. Dez 2006 19:37
Wohnort: Düsseldorf
Kontaktdaten:

Printerport

Beitrag von Juergen »

Hallo Auge_Ohr,

Werte werden aus einer INI-Datei gelesen.
.
.


IF upper(left(cPrinter_Port,3))="COM"
RunShell('/C mode '+cPr_Port+' '+cPr_Baud,,,.t.)
ENDIF

.
.
cPrinter_Port:=upper(left(cPrinter_port,4))

IF !IsPrinter(cPrinter_Port)
ok_ask("Warnung: Der Bondrucker ist nicht bereit !")
ENDIF


Gruß
Jürgen
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Printerport

Beitrag von AUGE_OHR »

hi,
Juergen hat geschrieben: IF upper(left(cPrinter_Port,3))="COM"
RunShell('/C mode '+cPr_Port+' '+cPr_Baud,,,.t.)
ENDIF
cPrinter_Port:=upper(left(cPrinter_port,4))
IF !IsPrinter(cPrinter_Port)
ok_ask("Warnung: Der Bondrucker ist nicht bereit !")
ENDIF
sowas ging mal zu Cl*pper Zeiten unter DOS aber schon bei W95 ging
das ganze durch den Windows Druck Spooler sodas du bei ISPRINTER()
immer .T. bekommst.

Unter Xbase++ kann man ja nun auf die Windows Drucker (die man auch
für DOS benutzen kann ) zugreifen. dazu benutzt man XbpPrinter() um
ein Printer Object anzufordern. Analog zu Beispiel der Xbase++ Hilfe hier
ein erweitertes Beispiel mit :PrinterStatus() welches auch für USB oder
Netzwerk funktioniert :

Code: Alles auswählen

FUNCTION PRINTERPS( cPrinter, nCopies ,nPaperBin)
LOCAL oDC    := XbpPrinter():New()
LOCAL oPS
LOCAL aPB, i, iMax                              // Array Paperbins
LOCAL lRaus  := .T.
LOCAL lPFail := .F.
LOCAL oDlg, oPrinter,cText,nStatus
LOCAL nDummy
LOCAL aPrint := oDC:list()        // Liste aller installierter Drucker
LOCAL nPrint := 0

   DEFAULT nCopies TO 1

   BEGIN SEQUENCE
      //
      // suche "meinen" ID_DRUCK Drucker
      // 
      nPrint := ASCAN(aPrint, {|x| (ID_DRUCK) $ UPPER(x) } )
      IF nPrint > 0
         cPrinter := aPrint[nPrint]
      ENDIF

      IF cPrinter != NIL                        // if NIL use Windows default?
         cPrinter := TRIM(cPrinter)
      ENDIF
      //
      // so wird ein Printer Object "richtig" angelegt
      // 
      IF oDC:Create( cPrinter ) == oDC          // = self
      ELSE
         MsgBox( "! kann kein Drucker Object anlegen !" )
   BREAK                                        // raus
      ENDIF
      //
      // jett können wir den Status überprüfen
      //
      nStatus := oDC:PrinterStatus()

      DO CASE
         CASE nStatus ==  1
            lPFail := .F.                       // alles OK
         CASE nStatus == -7 ; MsgBox( "The Printer is Offline !" )
            lPFail := .T.
         CASE nStatus == -6 ; MsgBox( "The Printer has a failure !" )
            lPFail := .T.
         CASE nStatus == -5 ; MsgBox( "The Printer is not useable !" )
            lPFail := .T.
         CASE nStatus == -4 .OR. nStatus == -1 ; MsgBox( "The Printer is not ready !" )
            lPFail := .T.
         CASE nStatus == -3 ; MsgBox( "The Printer has no paper !" )
            lPFail := .T.
         CASE nStatus == -2
         MsgBox( "Der Netzwerk Drucker ist offline !"+CHR(13)+CHR(10)+Chr(13) +;
                 "bitte Rechner neu starten und pr
Juergen
UDF-Programmierer
UDF-Programmierer
Beiträge: 92
Registriert: Di, 19. Dez 2006 19:37
Wohnort: Düsseldorf
Kontaktdaten:

Printerport

Beitrag von Juergen »

Danke Auge_Ohr,

muss Deinen Quellcode ausprobieren.

Grundsätzlich hatte ich für meine Kassensysteme den
entsprechenden Bondruckern keinen Windowsdrucker zugeordnet,
sondern direkt über die Druckerschnittstelle LPTx programmiert.

Von daher ist eine Abfrage, wie Du sie darstellst natürlich nicht
möglich.

Es ist sehr schade, dass man z. B. um den Zustand
der Kassenlade zu überprüfen erst ein OCX-Control einbinden muss,
da die Kassenlade über den Drucker gesteuert wird.

Früher konnte man LPTx Byte für Byte abfragen.

Gruß

Jürgen.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Unter DOS hatte man halt die volle Kontrolle über die Hardware.
Für den direkten LPTx Zugriff müsste das auch heute noch möglich sein, aber USB verhält sich da halt ganz anders.
Gruß
Hubert
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo,

hier gibt es einen Gerätetreiber zu kaufen, der auch unter XP Hardwarezugriffe erlaubt.

Irgendwann, irgendwo habe ich auch mal einen Freeware-Hardwaretreiber für LPTs gesehen. Ich schau mal, ob ich den Link wiederfinde.

...Gefunden!

InpOut.dll
http://www.logix4u.net/inpout32.htm

Beispielprogramm in VB
http://www.lvr.com/files/test_inpout32_vb6.zip

Alles, was man schon immer über Parallelports wissen wollte
(mit Links zu ähnlich umfangreichen Infos über serielle Ports und USB)
http://www.lvr.com/parport.htm

Viele Grüße,
Günter
Antworten