[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/privacyprotection/cron/task/anonymize_ip.php on line 83: A non-numeric value encountered
Inoffizielles deutsches Xbase-Forum • Kein Druck mehr möglich
Seite 1 von 1

Kein Druck mehr möglich

Verfasst: Fr, 10. Sep 2021 15:43
von Wolfgang_B
Hallo,
diese Problem taucht plötzlich ohne Änderung an der App. schon bei 2 meiner Kunden auf. Beim Drucken kommt Fehlermeldung "Kein Drucker installiert". Beim ersten Kunden hat der IT-Service irgendetwas am Drucker umgestellt, dann gings wieder (leider keine Ahnung was, ist nicht erreichbar), beim zweiten Kunden heute das gleiche Problem. Dummerweise kann man mit Windows-Programmen (Word etc.) drucken.

Ist Euch das was bekannt?

Re: Kein Druck mehr möglich

Verfasst: Fr, 10. Sep 2021 16:44
von Rolf Ramacher
Hallo Wolfgang

wie druckst du denn aus xbase heraus ? xbpprintdialog ()

da kann das nicht passieren, hierbei werden die Drucker angezeigt, die unter Windows installiert sind.

Re: Kein Druck mehr möglich

Verfasst: Fr, 10. Sep 2021 16:55
von Wolfgang_B
Hallo Rolf,
ich drucke mit Huberts Durckerklasse. Die installierten Drucker sind auch sichtbar.

oPr := XbpPrinter():new()
oPr:create()
aPRList := oPr:list()

Der Fehler wird hier abgefragt:

oDrucker := Druckformulare():New():create()
IF oDrucker:IsPrinterError()
MsgBox("Kein Drucker installiert (J)" )
RETURN(NIL)
ENDIF

Bisher hats ja immer funktioniert ... Nichteinmal "Microsoft Print to PDF" funktioniert mehr ...

Re: Kein Druck mehr möglich

Verfasst: Fr, 10. Sep 2021 17:00
von Wolfgang Ciriack
Ich tippe mal stark auf irgendein Windows Update. Evtl. falls noch nicht passiert, PC nochmals komplett neu starten. Ansonsten mal schauen, welche Updates zuletzt installiert wurden, ob es noch weitere Windows Updates gibt, evtl. mal Updates deinstallieren, etc.
Auch mal den Standarddrucker direkt setzen (Windows verwaltet Standarddrucker ausschalten).

Re: Kein Druck mehr möglich

Verfasst: Fr, 10. Sep 2021 17:01
von Wolfgang_B
Die Vermutung habe ich auch. Das Problem ist, daß der Server in einem Rechenzentrum läuft. Auf die Windowsteile habe ich keinen Zugriff.

Re: Kein Druck mehr möglich

Verfasst: Fr, 10. Sep 2021 17:13
von Wolfgang_B
Habe gerade mit dem Rechenzentrum telefoniert. Bei denen ist nichts bekannt.

Re: Kein Druck mehr möglich

Verfasst: Fr, 10. Sep 2021 19:48
von ramses
Das ist ein bekanntes Problem:
Versuch mal PrintError() rauszunehmen. Unter Windows Drucker ist es eigenlich nicht vorgesehen den Druckerstatus aus der App abzufragen denn der Spooler ist immer bereit auch wenn der Drucker kein Papier mehr hat oder ausgeschaltet ist. Genau deshalb lässt sich auch aus Word problemlos Drucken.

Aus der Windows Doc:

Wenn die Druckerwarteschlange leer ist wird angenommen, dass der Drucker bereit für die Annahme von Druckaufträgen ist. Dies ist eine gültige Annahme, auch wenn sich der physische Drucker in einem Fehlerzustand befindet, z. B. offline. Das Betriebssystem betrachtet den Drucker als bereit, Druckaufträge zu akzeptieren, auch wenn die Zustellung an den physischen Drucker aus irgendeinem Grund nicht abgeschlossen werden kann. Ein solcher Fall wird als Fehlerstatus im Betriebssystem betrachtet, der vom Benutzer behoben werden muss. Es wird nicht als Fehler betrachtet, der für die Anwendung gemeldet werden kann, die die Warteschlange des Druckauftrags erfolgreich abschließen kann.

Quelle: Microsoft DOCS

Re: Kein Druck mehr möglich

Verfasst: Fr, 10. Sep 2021 19:50
von Wolfgang_B
ok, kann ich machen. Werde dann am Montag berichten..
Vielen Dank ..

Re: Kein Druck mehr möglich

Verfasst: Fr, 10. Sep 2021 20:57
von AUGE_OHR
hi,
ramses hat geschrieben: Fr, 10. Sep 2021 19:48 Das ist ein bekanntes Problem:
Versuch mal PrintError() rauszunehmen.
wie ich versucht habe dir zu erklären ist das Quatsch auf Xbase++ bezogen.

es geht Primär darum "ob" das XbpPrinter Object "richtig" erstellt wurde was üblicherweise nicht geprüft wird.
natürlich kann man nur dann den Printer Status "richtig" abfragen ohne das es knallt.

Re: Kein Druck mehr möglich

Verfasst: Fr, 10. Sep 2021 23:55
von Werner_Bayern
Servus Wolfgang,

dazu habe ich mir die Methode create() in Huberts Druckerklasse in hbprint.prg etwas angepasst:

Code: Alles auswählen

METHOD _HBPrinter:create(cDrucker)
LOCAL oDrucker, nDrucker := 1
STATIC saDrucker

IF saDrucker == NIL
  saDrucker := ::DruckerListe()
  aeval(saDrucker, {|x, i| saDrucker[i] := upper(x)})
ENDIF
IF cDrucker == NIL .OR. (nDrucker := aScan(saDrucker, {|x|x == upper(cDrucker)})) == 0
// entweder kein oder unbekannten Drucker uebergeben, also Standarddrucker aus dem System oder 1. tatsächlichen Drucker
  IF nDrucker == 0 // Drucker gibt es nicht (mehr), Druckerliste neu einlesen
    saDrucker := ::DruckerListe()
    aeval(saDrucker, {|x, i| saDrucker[i] := upper(x)})
  ENDIF
  cDrucker := getDefaultPrinter()
  IF empty(cDrucker)  // kein Defaultdrucker im System!
    oDrucker := Druckerauswahl(saDrucker[1])  // Dialog zur Druckerauswahl
    IF .NOT. oDrucker == NIL
      cDrucker := oDrucker:devName
      oDrucker:destroy()
    ELSE
      cDrucker := saDrucker[1]
    ENDIF
  ENDIF
ENDIF

if IsNil(::_oPS)
   ::_oPS             := ::PrinterPS(cDrucker)
   ::oPrinterPS       := ::_oPS
endif

::nLineFeed           := 49 // laut AmiPro hat 12 Punkt Times new Roman genau 4.9 mm Abstand.
                            // a 12 point Times New Roman in AmiPro (my favorite textprogram) has exactly 4.9 mm linefeed
return self
dann die Methode DurckerListe hinzugefügt:

Code: Alles auswählen

    METHOD _HBPrinter:Druckerliste() // gibt alle installierten Drucker zurück.
      LOCAL aDrucker := XbpPrinter():new():list()

      IF aDrucker == NIL
         aDrucker := {} // Fehler später vermeiden
      ENDIF
      RETURN aDrucker
und der Aufruf erfolgt so:

Code: Alles auswählen

oDrucker := FormularDrucker():new():create(cDruckername)
IF .NOT. oDrucker:printerStatus() == XBPPRN_STATUS_READY
   IF .NOT. fehler("Der Drucker '" + oDrucker:devName + "' meldet folgenden Fehler: " + chr(13) + chr(13) +;
   cPrinterStatus(oDrucker:printerStatus()) + chr(13) + chr(13) + "Trotzdem drucken?",,,,,,XBPMB_OKCANCEL) == XBPMB_RET_OK
      RETURN NIL
   ENDIF
ENDIF
Der Anwender kann also entscheiden, ob er trotzdem druckt, oder nicht.

Funktioniert nach etlichen Anpassungen seit Jahren...

Die Funktionen von uns dürften selbsterklärend sein.

Re: Kein Druck mehr möglich

Verfasst: Sa, 11. Sep 2021 2:39
von AUGE_OHR
hi,

ist der Drucker an einem PC angeschlossen ( wie ? ) oder hat er eine eigene Netzwerkkarte ( mit IP Adresse ) :?:

leider "sehe" ich den IMHO wichtigen Teil nicht

Code: Alles auswählen

   ::PrinterPS(cDrucker)
das ist doch der Teil wo es, wenn, schon harkt

---

Printerstatus war ursprünglich für LPT wo man eine "direkte" Leitung durch den Parallele Port hatte.
USB und Netzwerk IP laufen aber "anders" und :PrinterPS(cDrucker) "könnte" ein "falsches" Object erzeugen.

dann tritt das auf was Carlo schildert mit dem Spooler wo sich die Druck-Jobs ansammeln aber nichts gedruckt wird.
"irgendwann" meldet sich dann der Spooler ... aber ich habe schon alle als "gedruckt" markiert ...

also überprügt ob das XbpPrinter Object "richtig" erstellt wurde bevor ihr es mit dem Presentation Space verknüpft

Code: Alles auswählen

FUNCTION PRINTERPS( cPrinter, nCopies, nPaperBin )
LOCAL oDC    := XBPPRINTER() :New()

      IF oDC:Create( cPrinter ) == oDC       // = self
      ELSE
         MSGBOX( "! Drucker ist Offline !" )
         BREAK                               // raus
      ENDIF
      nStatus := oDC:PrinterStatus()
      ...
      
      oPS := XBPPRESSPACE() :New()
      oPS:Create( )
      oPS:configure( oDC, oDC:paperSize(), GRA_PU_LOMETRIC )

RETURN oPS
probiert es doch einfach aus

Re: Kein Druck mehr möglich

Verfasst: Sa, 11. Sep 2021 3:17
von Werner_Bayern
AUGE_OHR hat geschrieben: Sa, 11. Sep 2021 2:39 ist der Drucker an einem PC angeschlossen ( wie ? ) oder hat er eine eigene Netzwerkkarte ( mit IP Adresse ) :?:
Ist doch egal, heutzutage dürften wohl >90% der Drucker über LAN oder WLAN und der Rest per USB angeschlossen sein. LPT gibt's seit 1000 Jahren nicht mehr...
Wen interessierts, PrinterStatus() liefert immer die korrekte Info, der Code von Hubert und mir lässt ggf. dem Benutzer die Wahl.
leider "sehe" ich den IMHO wichtigen Teil nicht

Code: Alles auswählen

   ::PrinterPS(cDrucker)
das ist doch der Teil wo es, wenn, schon harkt
Was fehlt Dir hier? cDrucker wird mit einem gültigen Namen belegt, sobald es mind. einen Drucker im System gibt.

Re: Kein Druck mehr möglich

Verfasst: Sa, 11. Sep 2021 23:13
von AUGE_OHR
hi,

lies dir mal den Thread in der Alsaka Newgroup durch
29. Januar 2008
public.xbase++.generic
xbpprinter printerstatus
solange nicht "geprüft" wird ob das XbpPrinter() Object "richtig" ( = self ) erstellt wurde "kann" es schief gehen.

p.s. nur weil es bei dir funktioniert muss es nicht richtig sein

Re: Kein Druck mehr möglich

Verfasst: So, 12. Sep 2021 18:50
von Werner_Bayern
Servus Jimmy,

das fängt Hubert schon sauber in seiner Druckerklasse in der Methode PrinterPS ab:

Code: Alles auswählen

METHOD _HBPrinter:PrinterPS(cPrinterName)
    LOCAL oPS, oDC, nBreite,nHoehe,aPaperSize, IsPrinterVorgabe

    IsPrinterVorgabe := .f.

    if IsNil(::oPrinterPS)              // erster Aufruf - first Time
       if IsNil(::oUseXbpPrinter)       // keine Vorgabe - no preselection
          oPS := XbpPresSpace():New()
          oDC := XbpPrinter():New()
       else
          oPS := XbpPresSpace():New()
          oDC := ::oUseXbpPrinter
          IsPrinterVorgabe := .t.
       endif
    else

       oPS := ::oPrinterPS
       oDC := oPS:device()
       oPS:configure()                  // oDC freigeben - release oDC
       if IsNil(oDC)
          oDC := XbpPrinter():New()
       endif
       if oDC:Status() = XBP_STAT_CREATE  // dann zurücksetzen
          oDC:destroy()
       endif
       if oPS:Status() = XBP_STAT_CREATE  // dann zurücksetzen
          oPS:destroy()
       endif
    endif

    if ! IsPrinterVorgabe
       * Nun haben wir leere Objecte
       oDC:Create(cPrinterName)
    endif

    if IsNil(oDC) .or. oDC:Status() = XBP_STAT_FAILURE
       ::_PrinterCreateErr := .t.
    else
       ::_PrinterCreateErr := .f.
    endif

    if ! ::_PrinterCreateErr

       aPaperSize := oDC:PaperSize()               // hier kommen nur 6 Elemente
       nBreite := aPaperSize[5] - aPaperSize[3]    // laut DOKU sollten es 8 sein.
       nHoehe  := aPaperSize[6] - aPaperSize[4]
       oPS:Create( oDC, {nBreite,nHoehe} , GRA_PU_LOMETRIC )

       ::SetInternalPageVars(oPS)

    endif

RETURN oPS
Deshalb auch sein Hinweis im Code:
Nach MyHBPrinter:Create() muß in Ihrem Programm
IsPrinterError() abgeprüft werden. Bei .T. müssen Sie eine
Fehlermeldung anzeigen und dürfen nicht drucken.
Funktioniert bei vielen Programmen - nicht nur bei unseren - seit vielen Jahren.

Re: Kein Druck mehr möglich

Verfasst: Mo, 13. Sep 2021 6:19
von AUGE_OHR
hi,

die gezeigte Version gibt es IMHO seit 2009 denn ursprünglich gab es einige Zeilen vorher nicht.
man muss Hubert fragen warum er die Ergänzung gemacht hat ... hat er was in der Alaska Newsgroup gelesen ...

---

die ursprüngliche Anfrage von Wolfgang lautete ja warum seine Xbase++ Apps nicht drucken.
sollte er keine "Prüfung" in seiner PrinterPS haben "könnte" es genau daran liegen

Re: Kein Druck mehr möglich

Verfasst: Mo, 13. Sep 2021 9:55
von Wolfgang_B
Guten Morgen,
nochmal zur Erinnerung. Ich verwende die Druckerklasse von Herbert schon seit ca. 2 Jahren. Bei allen meinen Kunden hat das Drucken bisher problemlos funktioniert. Das erste Problem trat vor ca. 4 Monaten bei Kyrocera Druckern auf. Hier kam dann von Microsoft zwei Notfallpatche, die das Problem (lt. Microsoft Forum größtenteils) beseitigten. Der zweite Fall vor ca 4 Wochen bei einem anderen Kunden. Hier hat der IT-Support irgendwas an der Druckerinstallation geändert, was, ließ sich bis jetzt nicht herausfinden.

Ich habe gerade mit meinem Kunden telefoniert. Es ist wieder ein Kyrocera Drucker, der nicht druckt. Auf einem anderen Drucker kann gedruckt werden. Komisch ...

Die Prüfung findet auch statt:

Code: Alles auswählen

IF oDrucker:IsPrinterError()
			MsgBox("Kein Drucker installiert" )
	RETURN(NIL)


Ich werde zukünftig noch den Fehlercode abfragen. Das hilft vielleicht weiter ...

Re: Kein Druck mehr möglich

Verfasst: Mo, 13. Sep 2021 10:01
von Jan
Hallo Wolfgang,

nur mal so ins blaue hinein: Das ist aber nicht ein neu aufgesetzter Rechner, der die damaligen MS-Patches noch nicht bekommen hat?

Jan

Re: Kein Druck mehr möglich

Verfasst: Mo, 13. Sep 2021 10:32
von brandelh
IF oDrucker:IsPrinterError()

prüft ob das Druckerobjekt mit dem Treiber verbunden werden konnte, ist also nötig.
Es kann aber sein, dass ein "angehaltener" Drucker oder einer ohne Papier das auch als Fehler ausgibt.
den genaueren Printstatus abzufragen macht also Sinn.

Ich habe allen Win10 Rechnern verboten die Druckereinstellungen eigenmächtig zu ändern.

Re: Kein Druck mehr möglich

Verfasst: Mo, 13. Sep 2021 10:51
von Wolfgang_B
Hallo Jan,
die Rechner laufen schon seit mindestens 1 Jahr ohne Probleme ..

Re: Kein Druck mehr möglich

Verfasst: Mi, 15. Sep 2021 1:29
von AUGE_OHR
hi,
Wolfgang_B hat geschrieben: Mo, 13. Sep 2021 9:55 Ich habe gerade mit meinem Kunden telefoniert. Es ist wieder ein Kyrocera Drucker, der nicht druckt. Auf einem anderen Drucker kann gedruckt werden. Komisch ...
hatte der Kunden bei den letzten malen auch Probleme mit anderen Apps beim drucken oder nur deine Xbase++ App ?

üblicherweise "sollte" man die Treiber des Hersteller verwenden aber zum "testen" tut es im Prinzip jeder PCL Treiber.