Printerstatus z.B. Papier alle offline etc.

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

Moderator: Moderatoren

medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Printerstatus z.B. Papier alle offline etc.

Beitrag von medmaster »

Ich bekomme mit dem printerstatus von xbpPrinter immer nur 1 - also ready - zurück .. nichts anderes - obwohl der Drucker offline oder aus ist - wo und wie bekomm ich all die schönen Einzelstatusmeldungen aus :printerstatus() her ?
Ich möchte nur etwas drucken und in den spooler einstellen, wenn der Drucker definitv online ist ....
Danke für Hinweise ...
Rainer
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: Printerstatus z.B. Papier alle offline etc.

Beitrag von AUGE_OHR »

hi,
medmaster hat geschrieben: Ich bekomme mit dem printerstatus von xbpPrinter immer nur 1 - also ready - zurück .. nichts anderes - obwohl der Drucker offline oder aus ist - wo und wie bekomm ich all die schönen Einzelstatusmeldungen aus :printerstatus() her ?
Ich möchte nur etwas drucken und in den spooler einstellen, wenn der Drucker definitv online ist ....
Danke für Hinweise ...
wie wäre es mit dem "suchen" Button oben in der Menuleiste :)

http://www.xbaseforum.de/viewtopic.php? ... ter+status
gruss by OHR
Jimmy
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 »

Hi,

also grundsätzlich geht das. Meine Druckerklasse z.B. verweigert den Druck auf OFFLINE Drucker (angehalten, Papier fehlt) und dazu nutze ich oP:printerStatus() ... .

Aber es scheint so, dass nicht alle Druckertreiber diesen Zustand sauber melden. Der Drucker muss bidirektional arbeiten, damit das überhaupt geht.
Mit älteren Xbase++ Versionen gab es - wenn ich mich recht erinnere - damals auch Fehlermeldungen mit der Funktion.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
nicht nur der Drucker! Es muss auch der richtige parallelport-Treiber unter Windows installiert sein!
Wenn es nicht der ist, der eine Kommunikation in beide Richtungen zulässt, dann klappt nichts!
Ich glaube, der heißt unter XP EPP - kann hier im Büro leider nicht nachschauen, wegen eingeschränkter Rechte...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
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 »

Martin Altmann hat geschrieben:Es muss auch der richtige parallelport-Treiber unter Windows installiert sein!
und natürlich muss man im BIOS den bidirektionalen Zugriff auch freigegeben haben, sonst geht es auch nicht ... ;-)

Am besten schaut man im Druckmanager nach, was Windows zu dem Drucker sagt. Erkennt Windows bzw. der Druckertreiber ob Papier im Drucker ist, ob dieser ausgeschaltet oder offline ist ?

Billige Netzwerkdruckserver liefern auch keine Rückinfos.
Während die eingebauten Druckserver in meinem Samsung CLP-550N bzw. Brother 7820N (beide nur über Ethernet) sauber funktionieren, genauso wie mein HP Deskjet 5550 sowohl über Parralel als auch über USB funktioniert.
Gruß
Hubert
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 »

Hi Rainer,

nimm doch mal XbpPrintDialog() - Dann erhälst du die Druckerauswahl, welche Drucker installiert sind. Wie du es von Druck aus Word kennst.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Beitrag von medmaster »

Danke für die Diskussion .. :-)

kurz der Code :

if oPrinter:create(trim(cPrinter))<> NIL
nPrinterstatus:=oPrinter:printerStatus()
errorbox(alltrim(str(nPrinterStatus)))
* ergibt grundsätzlich 1 also ready obwohl der Drucker aus ist
wäre ja dankbar wenn jemand einen funktionsfähigen Code hätte
übrigens : was ergibt bei euch der Printerstatus wenn der Drucker aus ist ???
Rainer
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 »

Hallo,

dein Code ist völlig in Ordnung.

Mein Canon Drucker (i965) z.B. liefert auch immer XBPPRN_STATUS_READY wenn er ausgeschaltet ist. Sobald der Druckjob da ist, schaltet der Druckertreiber den Drucker ein.

Fehlendes Papier oder im Druckertreiber ('Anhalten') eingeschaltete
Druckbeschränkungen werden mit den erwarteten Defines laut Hilfe
gemeldet.

Die Frage also muss lauten, was sagt dir dein Windows über die Druckerwarteschlange, wenn der Drucker ausgeschaltet ist ?

Wenn dort ein Fehler oder OFFLINE steht, erkennt Windows das Problem, ansonsten IST es (für Windows) kein Problem. Nur wenn Windows einen Fehler erkennt, kann Xbase++ darauf reagieren.
Gruß
Hubert
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

Beitrag von AUGE_OHR »

hi,
medmaster hat geschrieben: if oPrinter:create(trim(cPrinter))<> NIL
nPrinterstatus:=oPrinter:printerStatus()
Das ist nicht unbedingt richtig so. Du fragst den :printerStatus() von
oPrinter ab und nicht den vom zugewiesenen Device oDC!!!

Code: Alles auswählen

FUNCTION PRINTERPS( cPrinter, nCopies, nPaperBin )
LOCAL oDC    := XbpPrinter() :New()
LOCAL oPS
LOCAL lPFail := .F.
LOCAL oPrinter, nStatus

   DEFAULT nCopies TO 1

   BEGIN SEQUENCE
      IF oDC:Create( cPrinter ) == oDC          // = self
      ELSE
         MsgBox( "! Drucker ist Offline !" )
         BREAK                                              // raus
      ENDIF
      //
      // get :PrinterStatus from oDC
      //   
      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 !"  + ;
                    "bitte Rechner neu starten und pr
gruss by OHR
Jimmy
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 »

AUGE_OHR hat geschrieben:
medmaster hat geschrieben: if oPrinter:create(trim(cPrinter))<> NIL
nPrinterstatus:=oPrinter:printerStatus()
Das ist nicht unbedingt richtig so. Du fragst den :printerStatus() von
oPrinter ab und nicht den vom zugewiesenen Device oDC!!!

Code: Alles auswählen

FUNCTION PRINTERPS( cPrinter, nCopies, nPaperBin )
LOCAL oDC    := XbpPrinter() :New()
      ...
      nStatus := oDC:PrinterStatus()

Hi Jimmy,

ich denke mal sein oPrinter entspricht deinem oDC und ist ein XbpPrinter() Objekt. Das wäre schon richtig so.
Gruß
Hubert
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

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben:
medmaster hat geschrieben: if oPrinter:create(trim(cPrinter))<> NIL
nPrinterstatus:=oPrinter:printerStatus()
ich denke mal sein oPrinter entspricht deinem oDC und ist ein XbpPrinter() Objekt. Das wäre schon richtig so.
Nope den das :create ist falsch (so wie es im Help File steht.
Es muss

Code: Alles auswählen

IF oDC:Create( cPrinter ) == oDC          // = self 
heissen damit du vom Device den :PrinterStatus bekommst und
nicht vom Printer Object !
gruss by OHR
Jimmy
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Printerstatus

Beitrag von medmaster »

Jimmy ..
egal wie auch immer - ich hab den Code von Dir kopiert --leider bekomm ich immer noch IMMER 1 - also Drucker online obwohl er definitiv aus ist (Netz-aus). Der Grund liegt irgendwo auf der Windowsebene. Offensichtlich muss ich das anders anpacken .. - xBASE hilt mir da so nicht, da bereits windows nichts meldet. Der Druckauftrag erscheint in der Queue und nach einer Weile dann unten die übliche Druckerwarnmeldung .. das ganze hängt sich erstmal eine Weile auf, unbrauchbar für eine sichere Druck- und Dokumentenkontrolle.
Ich will einen Druckserver bauen mit voller Kontrolle über bestimmte Druckvorgänge ... hmmm. Die Files (pdf) liegen fertig vor.
Rainer
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Rainer,
schau Dir mal die Einstellungen für Deinen Druckertreiber an!
Unter XP findest Du in den Eigenschaften Deines Druckers das Register "Erweitert" - dort solltest Du die Option "Druckaufträge direkt zum Drucker leiten" auswählen anstatt der wahrscheinlich eingestellten "Über Spooler drucken, um Druckaufträge schneller abzuschließen"!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
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: Printerstatus

Beitrag von AUGE_OHR »

hi,
medmaster hat geschrieben: egal wie auch immer - ich hab den Code von Dir kopiert --leider bekomm ich immer noch IMMER 1 - also Drucker online obwohl er definitiv aus ist (Netz-aus). Der Grund liegt irgendwo auf der Windowsebene.
kann nicht sein ... entweder du bekommst ein oPS oder ein NIL

Frage : bis du im Alaska Forum unter RCB unterwegs ?

Ich habe 3 Kyocera 1010. Einer ist mit der UB21 Netzwerkkarte bestückt
der 2nd hängt an LPT1 und der dritte an USB. Besonders bei dem Netz-
Werk Drucker hab ich IMMER das offline Problem (vermutlich weil er aus
Standby erst hochfährt) und MUSS es deshalb mehrfach am Tag abfangen
wie es mir auch mein Logbuch zeigt.

Ich habe für die Lösung schlussendlich mit Till´s Hilfe rausbekommen den
der Zusammenhang mit dem Device war mir lange nicht klar. Leider hab
die die Msg nicht z.H. und versuche es mal mit einer "trivialen" Erklärung

Wenn du ein Printer Object mit XbpPrinter anlegst wie in der Hilfe
beschieben dann hast du ein Device unabhängiges Printer Object.
Verwendest du die Methode von mir DANN versucht der ein Device
abhängiges Printer Object zu :create(n). Wenn nun der Vergleich

Code: Alles auswählen

IF oDC:Create( cPrinter ) == oDC          // = self 
fehlschlägt (weil der Drucker aus/offline ist) dann kommt ein BREAK und
oPS gibt NIL zurück. Das musst du nun wiederrum abfragen !

Code: Alles auswählen

      DO CASE
         CASE nPaperBin = 1
            oPrinter := PrinterPS( NIL, nCopies, XBPPRN_PAPERBIN_CASETTE )  // normal weiss
         CASE nPaperBin = 2
            oPrinter := PrinterPS( NIL, nCopies, XBPPRN_PAPERBIN_MIDDLE )  // untere "gelb"
         OTHERWISE
            oPrinter := PrinterPS( NIL, nCopies, XBPPRN_PAPERBIN_AUTO )
      ENDCASE
      **1**
      IF oPrinter = NIL
         cText := "!!! FEHLER !!! Rechnung Drucker Object konnte aktiviert werden"
         MSGBOX( cText )
         JOBEMAIL( cText, cText, "OTHER" )
         SELECT 4
         WSLclose()              // CloseAll in WorkSpace
         EXITDRUCK()           // Stack
         RETURN
      ENDIF 
Das funktioniert zu 99.999% IMMER !!!

(die 0.001 kann man versuchen mit einem USB Drucker zu "provozieren"
wenn man "gleichzeitig" mit dem ckick auf den ok Button den "Stecker"
der USB Verbindung rauszieht bevor er die erste Seite gedruckt hat...)
Zuletzt geändert von AUGE_OHR am Do, 31. Jan 2008 21:51, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

wo wir gerade dabei sind vielleicht weiss ja jemand eine Antwort :

Ich schrieb ja gerade über den Kyrocrea mit der Netzwerk Karte.
Der muss ja nun erst aus dem Standby "geweckt" werden. Nun spreche
ich den über eine feste IP-Nummer an ... kann ich den Drucker nicht
irgendwie über "Magic Packet" oder "Wakeup" ansprechen ?
gruss by OHR
Jimmy
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 »

Hi Jimmy,

ich weiß nicht ob wir an einander vorbei reden, aber wenn du die Hilfe anschaust, wirst du feststellen, dass der XbpPresentationSpace() eine Methode device() hat, die - bei zugeordnetem Drucker - das XbpPrinterObject, das ist das device, zurück gibt:
Klasse
XbpPresSpace()
Syntax
:device() --> oDevice | NIL
Der XbpPrinter():new():create([cDruckerName]) Aufruf erzeugt - falls erfolgreich, was nicht sein muss - ein Object, das direkt auf den Druckertreiber = Hardwardruckerdevice referenziert.

Wenn cDruckerName dann ein gültiger Druckername ist, wird dieser verwenden, ansonsten (also auch bei keinem Parameter) der Standarddrucker !

Deine Zeile

Code: Alles auswählen

IF oDC:Create( cPrinter ) == oDC          
ist deshalb wichtig, weil sie prüft ob tatsächlich ein Druckerobjekt erzeugt wurde und dieses nun in oDC vorhanden ist. Das kann man aber auch über die von Ihm verwendete Form

Code: Alles auswählen

IF oDC:Create(  ) <> NIL 
machen, solange der oDC vorher NIL war.

Sprich man muss sicherstellen, dass man auch ein gültiges Druckerobjekt erzeugt hat, bevor man damit weiterarbeitet.

Seine Probleme rühren aber daher, dass der Druckertreiber / Windows-Spooler - warum auch immer (vermutlich um Strom zu sparen !) - einen ausgeschalteten Drucker als BEREIT bezeichnet.

Da Xbase nur diesen DRUCKERTREIBER abfragen kann, (es sei denn man versucht es über SET PRINTER TO LPT1 etc. ???) kann XbpPrinter() nur das zurückgeben als Status, was Windows meldet !

Win2000, bei dem über einen anderen PC zugeordneten HP5550 Drucker (LPT1) merkt mein Windows, dass der Druckserver (PC ist aus) nicht vorhanden ist und meldet das im Spooler. Der gleiche Drucker unter USB Anschluss, wird als BEREIT angezeigt. Und das stimmt bei ihm auch, denn der Treiber wird den Drucker starten sobald ein Auftrag vorliegt.
Mein Brother Multifunktionscenter (Laser mit Netzwerkdruckserver direkt am Switch) habe ich vor 10 Minuten abgeschaltet und dennoch wird er als BEREIT geführt !

Es ist nun einmal so, dass Windows die Drucker selbst verwalten will und Anwendungsprogramme sich darum nicht zu kümmern haben
:wink: ob uns das passt oder nicht. Durch Auswahl eines passenden Druckermodells (Samsung CLP-550 im Büro meldet schnell.) eventuell das anpassen, auch das direkte Drucken oder ähnliche Einstellungen wie von Martin erwähnt, könne nützlich sein, aber Xbase++ kann nicht mehr melden als Windows weitergibt :!:
Gruß
Hubert
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

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben:

Code: Alles auswählen

IF oDC:Create( cPrinter ) == oDC          
ist deshalb wichtig, weil sie prüft ob tatsächlich ein Druckerobjekt erzeugt wurde und dieses nun in oDC vorhanden ist. Das kann man aber auch über die von Ihm verwendete Form

Code: Alles auswählen

IF oDC:Create(  ) <> NIL 
machen, solange der oDC vorher NIL war.

Sprich man muss sicherstellen, dass man auch ein gültiges Druckerobjekt erzeugt hat, bevor man damit weiterarbeitet.
Der letzte Satz mit gültiges Druckerobjekt ist genau das worum es
geht. Alledings ist, wie im Help Sample, das prüfen auf NIL nicht die
geeignete Methode weil du ja eben (fast) immer ein Druckerobject :create
kann nur ob es gültiges ist ...
brandelh hat geschrieben: Der gleiche Drucker unter USB Anschluss, wird als BEREIT angezeigt.
ja USB ... da dauert das timeout viel zu lange ... aber da hab ich einen
REG Hack (leider nicht z.H.) mit dem man das verändern kann. Es wirkt
dann so ähnlich wie bei USB Festplatten "schnelles Entfernen".
gruss by OHR
Jimmy
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Beitrag von medmaster »

ok.. - Jimmy - also bei Dir arbeitet die Statusfeststellung einwandfrei : Du schaltest den Drucker aus und dann wird das sofort beim Druckversuch gemeldet ? hmm .. das wäre für mich hier ein Wunder bei gleichem Code .. *g* .. Spass beiseite .. : bitte versuche eine Erklärung warum das bei mir nicht geht - bei gleichem Code !
Und wieso kann Kyocera das mit Delphi wunderbar lösen .. ? Die analysieren jeden Drucker im Netz auf seine Funktion .. fragen die Drucker in einem periodischen Thread ab ... wunderbar .. *grübel*
Rainer
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 »

medmaster hat geschrieben:ok.. - Jimmy - also bei Dir arbeitet die Statusfeststellung einwandfrei : Du schaltest den Drucker aus und dann wird das sofort beim Druckversuch gemeldet ? hmm .. das wäre für mich hier ein Wunder bei gleichem Code .. *g* .. Spass beiseite .. : bitte versuche eine Erklärung warum das bei mir nicht geht - bei gleichem Code !
Und wieso kann Kyocera das mit Delphi wunderbar lösen .. ? Die analysieren jeden Drucker im Netz auf seine Funktion .. fragen die Drucker in einem periodischen Thread ab ... wunderbar .. *grübel*
Rainer
ganz einfach, es liegt nicht am Xbase++ code sondern an Windows, der HARDWARE und der Druckertreiber Software.

Der Drucker HERSTELLER kann alles, denn der nutzt Funktionen die er speziell im Drucker eingebaut hat, wie gesagt, meine Samsung CLP Netzwerkdrucker reagieren sehr schnell auf die Probleme die der Drucker anzeigt. Die kann man auch über das Netzwerk überwachen, normale für lokale Anwendung gedachte Drucker kümmern sich darum nicht.

Eventuell nutzen die mit Delphi auch Win32API Funktionen, das kann man auch aus Xbase++ heraus, wenn man weiß welche man verwenden soll, die Win32API ist recht groß ... oder sie haben einen TcpIp Server auf der Karte installiert und steuern darüber oder über SNMP ?

Was passiert denn bei dir, wenn du im Druckermanager einen Drucker auf OFFLINE oder ANHALTEN stellst ? Ich bekomme dann immer einen Wert ungleich READY.
Gruß
Hubert
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

Beitrag von AUGE_OHR »

hi,
medmaster hat geschrieben: ok.. - Jimmy - also bei Dir arbeitet die Statusfeststellung einwandfrei : Du schaltest den Drucker aus und dann wird das sofort beim Druckversuch gemeldet ? hmm .. das wäre für mich hier ein Wunder bei gleichem Code .. *g* .. Spass beiseite .. : bitte versuche eine Erklärung warum das bei mir nicht geht - bei gleichem Code !
JA !!!
a.) Kyocera Treiber NICHT die von Windows (ich hab 4.1.2115)
b.) Bidirektionale Unterstützung aktivieren
c.) NICHT den Druckerpool aktivieren
d.) "immer verfügbar"
e.) Druckaufträge direkt zum Drucker leiten
f.) KEINEN Harken bei Druckaufträge im Spooler tzerst drucken
g.) Druckprozessor WinPrint/RAW
h.) ich habe noch Zusatz RAM als RAM-Disk im Drucker und 2 Schächte
medmaster hat geschrieben: Und wieso kann Kyocera das mit Delphi wunderbar lösen .. ? Die analysieren jeden Drucker im Netz auf seine Funktion .. fragen die Drucker in einem periodischen Thread ab ... wunderbar .. *grübel*
frage das die Jungs im Delphi Forum :)
Zuletzt geändert von AUGE_OHR am Do, 31. Jan 2008 21:47, insgesamt 1-mal geändert.
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 »

AUGE_OHR hat geschrieben:
medmaster hat geschrieben: Und wieso kann Kyocera das mit Delphi wunderbar lösen .. ? Die analysieren jeden Drucker im Netz auf seine Funktion .. fragen die Drucker in einem periodischen Thread ab ... wunderbar .. *grübel*
frage das die Jungs im Delphi Forum :)
Hi medmaster,

wenn du einen funktionierenden Delphi Code hast, kannst du ihn ja mal posten. Eventuell kann man das direkt umsetzen. Aus meiner Sicht gibt es mehrere Möglichkeiten wie "es" gehen könnte:

1. Es gibt für Delphi eine Zusatzbibliothek die sowas regelt und in Delphi erstellt wurde.
Es gibt viele hardwarenahe Delphi Zusatzbibliotheken, davon können wir nur träumen. Wenn es eine DLL ist, könnte man die eventuell nutzen ?

2. Sie verwenden Windows API Aufrufe oder direkt API Aufrufe des Druckertreibers. In diesem Falle müsste es gut möglich sein diese in Xbase++ nachzubilden.

3. Sie verwenden ein WEB-Verwaltungs-Interface des Druckers. In diesem Falle müsste das ohne Probleme mit LoadFromUrl() auch in Xbase++ gehen. LoadFromUrl() gibt es im Quellcode von PHIL (per PM emailadresse an mich übermitteln und ich sende dir eine- Phils site ist nicht mehr erreichbar) oder über die ASINET.

4. Sie verwenden das Netzwerk Management Protokoll (SNMP). Auch dieses müsste über API / DLL Aufrufe machbar sein, wenn man denn weiß, was man machen muss.

Auf jeden Fall müssen die Jungs viel Ahnung von genau dem Drucker haben, wenn sie an Windows vorbei Informationen vom Drucker abfragen können.
Gruß
Hubert
medmaster
UDF-Programmierer
UDF-Programmierer
Beiträge: 58
Registriert: Di, 29. Jan 2008 1:43

Jimmy ...

Beitrag von medmaster »

"JA !!!
a.) Kyrocera Treiber NICHT die von Windows (ich hab 4.1.2115)
b.) Bidirektionale Unterstützung aktivieren
c.) NICHT den Druckerpool aktivieren
d.) "immer verfügbar"
e.) Druckaufträge direkt zum Drucker leiten
f.) KEINEN Harken bei Druckaufträge im Spooler tzerst drucken
g.) Druckprozessor WinPrint/RAW
h.) ich habe noch Zusatz RAM als RAM-Disk im Drucker und 2 Schächte -"

... hab alles so gemacht ... auf zwei Rechnern Drucker immer bereit *g*
keine Ahnung ... hmmm. Die Delphileute schaffen das auch mit den anderen Druckern. Also zumindest sollte es möglich sein, abzufragen ob ein Drucker online ist - das würde genügen ..
Rainer
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: Jimmy ...

Beitrag von AUGE_OHR »

hi,
medmaster hat geschrieben: ... hab alles so gemacht ... auf zwei Rechnern Drucker immer bereit *g*
hm ... komisch ...

öffne mal deine System Drucker Auswahl. Nun siehst du ja alle Drucker.
Stelle den Kyocera mal auf "Standart Drucker". Nun stelle den Kyocera
Offline und beobachte ob das Drucker Icon "grau" wird. Wenn es nun
soweit ist dann starte nochmals meine PrinterPS Routine und er meldet
Offline.

Sollte das Drucker Icon NICHT "grau" werden dann ist es ein Windows
Problem bei dir und er wird dir immer .T. zurück geben.
Zuletzt geändert von AUGE_OHR am Do, 31. Jan 2008 21:47, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

hi,

Nach ich im Alaska Forum auch eine heftige Disscusion wegen des selben
Thema habe und er einen lauffähigen Code (naja die gra.ch fehlt noch)
ins Forum gestellt hat hab ich noch paar Test gemacht.
Hardware : 3x Kyocera 1010
Drucker vor dem booten angeschaltet !

a.) Netzwerk auf den eingebauten UB21 Print-Server -> ok
b.) USB vom Notebook -> ok
mit ok heist nach dem abschalten -> Druck Versuch -> Icon wird "grau"
Drucker einschalten -> Druck Versuch -> druckt -> Icon "normal"

beides geht mit meine Code wie "gewünscht" während der andere Code
"versagt" und das Icon wird auch nicht "grau".

1.) Drucker an LPT1 vor dem booten AUS (!) -> JA -> Icon wird "grau"
2.) vor dem booten AN (!) und vor Druck aus -> NEIN -> Spooler ???
Ja heist hier er "merkt" Offline

Er macht das Icon also nur "grau" wenn vor dem booten der Drucker an
LPT1 aus war. Beim anderen Code wird nichts "grau"

Warum er allerdings den Spooler aufruft verstehe ich nicht den ich hab
"eigendlich" abgestellt ...

auffällig war nun das beim "anderen" Code die Icon nie "grau" wurden
und nur bei solchen funktioniert ja meine Routine weil ich das "sah" als
ich mit USB probiert habe. Genau den Effekt hab ich dann natürlich Alaska
versucht mitzuteilen weil die das Problem nicht nachvollziehen konnten
(Netzwerk Print Server & Standby timout) aber es sich wie USB verhält
wenn man den USB-"Stecker zieht".

Vieleicht verursacht die Routine die ich von Alaska bekommen habe
tatsächlich eine IDSC Fehler der dann den "grau" Effekt verursacht,
aber ich habe in den Jahren noch keinen Side Effekt gesehen.

Witzig ist vielleich noch die Entwicklung der Geschichte : Speziell der
erste Druck am morgen ging "daneben". Also hab ich den Mädels dann
gesagt sie mögen den Drucker morgens abstellen (lief natürlich die ganz
Nacht), mit Papier füttern und dann anschalten bevor sie den PC
hochfahren. Damit war das Problem "morgens" behoben und hat sich
dann zum "mittag" verschoben ... nach der Mittags Pause trat dann
das Problem auf ... auf jeden Fall immer wenn zwischen dem letzte Druck
einige Zeit vergangen war wie mir das Logbuch sagte. Da kam ich erst
auf ein mögliches Standby Problem was ich von Nadeldruckern nicht
kannte :)
Zuletzt geändert von AUGE_OHR am Do, 31. Jan 2008 21:48, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
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 »

Hi,

genau aus den Gründen gibt es doch den Windowsspooler.
M$ möchte, dass man sich nicht direkt um die Hardware kümmert.

Ein Programm sendet seine Druckdaten zum Drucker.
Erst wenn der dann druckt, kann es dazu kommen, dass der Drucker einen Fehler übergibt. Ab und an prüft zwar auch der Druckspooler, aber eher selten, sonst wäre der Netzwerkverkehr auch enorm.

Im PowerBasic Forum wurde ich - bei einem anderen Problem - mal belehrt, dass es DOS Denken ist, zuerst zu prüfen ob der Drucker an ist, die Diskette eingelegt etc. Diese Prüfung würde nie garantieren, dass später nicht doch noch ein Fehler auftritt und ginge automatisch davon aus, dass diesem Programm das Gerät gehört.
Unter Windows prüft man nicht, man druckt, schreibt etc. und erstellt im Programm nur Routinen die prüfen ob ein Fehler aufgetreten ist.

Erst beim Drucken wird dann eventuell der Rechner über fehlendes Papier aufgeklärt, dann reagiert der Druckspooler / Druckertreiber, denn das eigentliche Programm hat die Daten ja schon versandt !

Ich verstehe schon - und hätte es auch manchmal gerne gemacht, dass man abspeichern möchte, dass ein Brief etc. gedruckt wurde. Windows kann dies aber nicht garantieren. DOS konnte es auch nicht, denn ein leeres Farbband hat auch der Nadler nicht erkannt. Ob der Brief aber nach dem Drucken gleich in den Papierkorb geflogen ist, weil der SB keine Lust hatte kann kein System wirklich überwachen.

Um den Ausfall von z.B. Netzwerkservern etc. zu bemerken kann man dort eine kleine Datei öffnen und ab und an darauf zugreifen. Einen Druckjob zum Druckertesten, wäre aber Papierverschwendung.
Gruß
Hubert
Antworten