Drucken mit HBPrinter - Was geht wie warum ???

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

Moderator: Moderatoren

Wer kennt, nutzt oder verabscheut HBPrinterX ?

Ich nutze HBPrinterX ausschließlich
6
16%
Ich nutze HBPrinterX gelegentlich bzw. zusätzlich
9
24%
HBPrinterX habe ich früher mal genutzt
1
3%
geprüft, aber für mich ungeeignet
1
3%
der Schrott gehört verboten
0
Keine Stimmen
In nutze grundsätzlich keine Fremdprodukte
0
Keine Stimmen
Noch nie gehört oder kein Interesse
1
3%
Ich nutze Reportgeneratoren oder ähnliches
9
24%
Ich nehme XbpPrinter() pur
10
27%
 
Abstimmungen insgesamt : 37

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon brandelh » Mi, 09. Sep 2015 8:14

So, hier die Ergebnisse, meine Druckerklasse ist nicht das Problem und auch nicht GraQueryBox() ...
Alle direkten Ausdrucke sind einwandfrei (HP und Canon Drucker), auch die PDF vom eDokPrinter ...
ScanVonDruck.png
ScanVonDruck.png (88.1 KiB) 3360-mal betrachtet

Aber die PDF von Adobes PDF Druckertreiber zeigt einen Versatz.
Eventuell wegen Schriftartersetzungen in der PDF - also Vorgaben des Druckertreibers um Speicherplatz zu sparen.
Sowas machen auch PS Drucker, während andere eigentlich die Schrift-Eingenschaften von Windows verarbeiten.
In der ZIP ist das Testprogramm und 2 PDFs
Dateianhänge
DruckTest.zip
(45.36 KiB) 71-mal heruntergeladen
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon mini990 » Mi, 30. Mär 2016 8:12

Hallo Hubert,
ich habe eine Frage zur Funktion isprintererror()
In der Regel funktioniert die Abfrage prima. Auch bei Netzwerkdruckern.
Nun habe ich hier einen Ricoh Gelsprinter 3300.
Ist der Drucker lokal an einem PC angeschlossen und freigegeben können alle anderen Rechner auf diesem Drucker drucken.
Die Abfrage isprintererror() gibt ein .F. zurück.
Prima.
Nun das Problem: Ist der Drucker via Netzwerk mit eigener IP verbunden melden alle
PC's ein .T. bei isprintererror().
Habe das Printerinfotool ausprobiert, auch das Win32_Printer Tool von Jimmy.
Bei Netzwerkdruckern die funktionieren wird als PortName eine Bezeichnung/Text angezeigt.
Beim Rico steht als PortName IP_192.168. ...

kann hier der Fehler liegen?

Gruß Stefan
Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 242
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon brandelh » Mi, 30. Mär 2016 11:03

Hast du ein Druckerobject in Windows ?
Du brauchst eines, dort eine Testseite drucken.

Wenn die ankommt ! ... wenn nicht, muss das Windowsdruckerobjekt verbessert werden.

mit XbpPrintDialog() den drucker auswählen und ein einfaches Druckbeispiel versuchen ...

Hier das aus der Hilfe:

Code: Alles auswählen
// Konfiguration eines Druckjobs
// Das  Beispiel demonstriert die verschiedenen Schritte,
// die für die Konfiguration eines Druckjobs erforderlich sind.
   #include "Gra.ch"
   #include "Xbp.ch"
   #pragma Library( "XppUI2.lib" )
   PROCEDURE Main
      LOCAL oPrinter, oPS, oDlg, aSize
      oDlg := XbpPrintDialog():new()
      oDlg:create()
      // Konfiguriertes Drucker Objekt erzeugen
      oPrinter := oDlg:display()
      oDlg:destroy()
      IF oPrinter <> NIL
         // Neuen Presentation-Space erzeugen
         oPS   := XbpPresSpace():new()
         // Bedruckbarer Bereich auf dem Papier
         aSize := oPrinter:paperSize()
         aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4]  }
         oPS:create( oPrinter, aSize, GRA_PU_LOMETRIC )
         // Kleiner Druckjob
         oPrinter:startDoc()
         GraStringAt( oPS, { 0, aSize[2]-50 }, "Hello World" )
         oPrinter:endDoc()
         // Aufräumen
         oPrinter:destroy()
         oPS:destroy()
      ENDIF
   RETURN

wenn das gedruckt wird, scheint der Drucker einen ungewöhnlichen Status zurückzugeben.
Ich nutze ja auch nur die XbpPrinter() Rückmeldung, allerdings habe ich einige als Fehler interpretiert (z.B. Papier einlegen etc)

Das kannst du dann im Quellcode von der Methode prüfen.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon AUGE_OHR » Do, 31. Mär 2016 2:30

brandelh hat geschrieben:Tatsache ist, dass ich mich überhaupt nicht mit Transparenz beschäftigt habe, da brauche ich wohl etwas Nachhilfe ;-)
ist das Thema noch akut ?
Code: Alles auswählen
   oBmp:=XbpBitmap():new():create()
   oBmp:loadFile("logo.bmp")
oBmp:transparentClr := oBmp:getDefaultBGColor() // <- das fehlt
allerdings soll sich mit der v2.x was geändert zu haben s.h.
Showing transparent image
public.xbase++.gui
29. März 2016

It helped me to change the background color of the image when I compiled
the project with Xbase++ 1.9. As far as I can see here every pixel that
has "transparent color" in the picture is replaced by a color given by
oBmp:transparentClr while it is being drawn. However, the result is
quite rough (see the first attachment).

What I've also found that Xbase++ 2.0 now supports transparency of
images in a more elaborate way. I built my sample with 2.0 without
changes and it displayed the image very smoothly. It not only replaced
the fully transparent pixels with the static's background color but also
applied transparency to all other pixels achieving quite a smooth
display (see the second attachment).

(After I read the docs at XbpBitmap() and srutinized my logo.png with
Gimp closely I guess that it works the following way. In my image every
pixel has transparency information additionally to its color value. The
inner parts of the letters are opaque but towards the egdes of the
letters pixels' transparency grows. So when Xbase 2.0 (or Irfanview,
etc...) draws the picture it calculetes the actual color of the pixels
from its original color, its level of transparency and the background
color of the static it is drawn on.)
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10051
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon AUGE_OHR » Do, 31. Mär 2016 3:04

mini990 hat geschrieben:Nun das Problem: Ist der Drucker via Netzwerk mit eigener IP verbunden melden alle
PC's ein .T. bei isprintererror().
meinst du damit das er jetzt als Standalone eine eigene Netzwerkkarte bekomme/aktiviert mit IP 192.168. ... hat ?
Wenn ja "könnte" es daran liegen das er erst aus dem Standby aufwachen muss ...

@Hubert : in der METHOD _HBPrinter:PrinterPS(cPrinterName)
Code: Alles auswählen
    if ! IsPrinterVorgabe
       * Nun haben wir leere Objecte
       oDC:Create(cPrinterName) // <- ohne Prüfung ?
       ::oUseXbpPrinter := oDC
    endif
IMHO geht das bei Standby nicht. ich überprüfe das so
Code: Alles auswählen
IF oDC:Create( cPrinter ) == oDC  // = self
was dazu führt das ich als Status
Code: Alles auswählen
      nStatus := oDC:PrinterStatus()

      DO CASE
         CASE nStatus == 1
            lPFail := .F.                                   // alles OK
         CASE nStatus == - 7
            MSGBOX( "The Printer is Offline !" )
            lPFail := .T.
oft morgens beim 1st Druck einen Eintrag im Logbuch habe. bei "wiederholen" geht es dann.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10051
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon brandelh » Do, 31. Mär 2016 6:51

AUGE_OHR hat geschrieben:
mini990 hat geschrieben:Nun das Problem: Ist der Drucker via Netzwerk mit eigener IP verbunden melden alle
PC's ein .T. bei isprintererror().
meinst du damit das er jetzt als Standalone eine eigene Netzwerkkarte bekomme/aktiviert mit IP 192.168. ... hat ?
Wenn ja "könnte" es daran liegen das er erst aus dem Standby aufwachen muss ...

@Hubert : in der METHOD _HBPrinter:PrinterPS(cPrinterName)
Code: Alles auswählen
    if ! IsPrinterVorgabe
       * Nun haben wir leere Objecte
       oDC:Create(cPrinterName) // <- ohne Prüfung ?
       ::oUseXbpPrinter := oDC
    endif
IMHO geht das bei Standby nicht. ich überprüfe das so ...


das prüfe ich auch, einige Zeilen tiefer ... und fass "es gibt kein Objekt" mit der Statusabfrage zusammen.
Code: Alles auswählen
    if ! IsPrinterVorgabe
       * Nun haben wir leere Objecte
       oDC:Create(cPrinterName)
       ::oUseXbpPrinter := oDC
    endif

    if IsNil(oDC) .or. oDC:Status() = XBP_STAT_FAILURE
       ::_PrinterCreateErr := .t.
    else
       ::_PrinterCreateErr := .f.
    endif
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon brandelh » Do, 31. Mär 2016 7:01

Hier ist die Methode die das regelt:

Code: Alles auswählen
*-------------------------------------------------------------
METHOD _HBPrinter:IsPrinterError(oDC)
   local lIsPrinterError
   DEFAULT oDC TO ::oPS:device()
   do case
      case ::_PrinterCreateErr               // error at create -> there could be nothing
           lIsPrinterError := .t.            // Fehler schon bei create -> da kann nichts sein
      case IsNil(oDC)
           lIsPrinterError := .t.            // NIL !
      case oDC:isDerivedFrom( "XbpPrinter" ) .and. IsMethod(oDC,"printerStatus")
           if (oDC:printerStatus() = XBPPRN_STATUS_READY                       ) .or. ;
              (oDC:printerStatus() = XBPPRN_STATUS_BUSY   .and. ::IgnoreBusy   ) .or. ;
              (oDC:printerStatus() = XBPPRN_STATUS_PAUSED .and. ::IgnorePaused )

              lIsPrinterError := .f.
           else
              lIsPrinterError := .t.
           endif
   endcase
return lIsPrinterError


ich selbst habe standardmäßig "busy" und "paused" als Fehler gemeldet, das kann man aber vor CREATE() selbst ändern in dem die Instanzvariablen anders gesetzt werden:

::IgnoreBusy
::IgnorePaused

Beispiel ... ich will dass beide Zustände NICHT als Fehlermeldung sofort erscheinen ... so kann man auf die Warteschlange drucken, ohne dass der Fehler beseitigt wurde.
Code: Alles auswählen
// einfaches Druckobjekt erstellen ...
oHBP := HBPrinter():New():create(cWindowsDruckerObjekt) // :create() nutzt Standarddrucker
if oHBP:IsPrinterError()             // Fehler verhindern, avoid errors
   msgbox("Drucker ist nicht verfügbar !") // z.B. aber auch Busy oder Paused
else

// Druckerobjekt erstellen, das busy und paused ignoriert:
oHBP := HBPrinter():New()
oHBP:IgnoreBusy          := .t.
oHBP:IgnorePaused        := .t.
oHBP:create(cWindowsDruckerObjekt) // :create() nutzt Standarddrucker
if oHBP:IsPrinterError()             // Fehler verhindern, avoid errors
   msgbox("Drucker ist nicht verfügbar !")
else
   *** hier eventuell noch Status abfragen und busy oder paused warnung anzeigen
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon AUGE_OHR » Fr, 01. Apr 2016 2:10

hi,

aha ... ja ... er gibt ja
Code: Alles auswählen
METHOD _HBPrinter:IsPrinterError(oDC)
...
      case ::_PrinterCreateErr
         lIsPrinterError := .T.
zurück

der Windows Print Spooler wäre ja immer aktiv ...
bei IP Druck wird nun meisten per RAW alles auf den Printserver geschoben.

wenn der Printserver nun im Standby ist muss man den "aufwecken".
ich empfinde es durchaus als normal, nach der Nacht, das er im Standby ist und es beim 1st Mal morgens die Meldung gibt.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10051
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon mini990 » Mo, 25. Apr 2016 10:38

hmmm.....
auch mit den Einstellungen ignorebusy und ignorepaused auf .t. die gleiche Fehlermeldung.
Tritt aber nur bei einzelnen Druckern auf.
Hier bei einem Ricoh Gelsprinter.
Bei mir im Büro (HP Officejet, Oki Laser, Ricoh 3300N) funktioniert alles....

Gruß Stefan
Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 242
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon mini990 » Do, 29. Sep 2016 7:31

Soooo.... nun tritt das Problem auch bei einem Brother Kombigerät auf.
Drucken über Word und Co. ohne Probleme.
Abfrage oHBP:IsPrinterError() ergibt .T.

Auffällig ist dass der Drucker "niedriegen Tonerstand" meldet.
Ob das jetzt damit zusammenhängt weiß ich (noch) nicht.

Gruß Stefan
Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 242
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon brandelh » Do, 29. Sep 2016 8:14

Baue mal DEBUG Code in die Methode

METHOD _HBPrinter:IsPrinterError(oDC)

und erkunde, ob schon create fehlschlägt (falscher Windowsname ??)
oder erst später eine der vielen "Warnungen" von mir als "Fehler" übersetzt wird.

Eigentlich ist der Windowsdruckspooler ja immer ready und hier kann ich das nicht testen.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon mini990 » Do, 29. Sep 2016 8:54

Das Create funktioniert.
Übergehe ich die IsPrinterError Abfrage druckt alles ganz normal...

Gruß Stefan
PS: Wo ich momentan noch ein Problem habe ist die Schachtansteuerung von Druckern...
Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 242
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon brandelh » Do, 29. Sep 2016 9:23

In diesem Code werte ich die verschiedenen Zustände aus:

Code: Alles auswählen
*-------------------------------------------------------------
METHOD _HBPrinter:IsPrinterError(oDC)
   local lIsPrinterError
   DEFAULT oDC TO ::oPS:device()
   do case
      case ::_PrinterCreateErr               // error at create -> there could be nothing
           lIsPrinterError := .t.            // Fehler schon bei create -> da kann nichts sein
      case IsNil(oDC)
           lIsPrinterError := .t.            // NIL !
      case oDC:isDerivedFrom( "XbpPrinter" ) .and. IsMethod(oDC,"printerStatus")
           if (oDC:printerStatus() = XBPPRN_STATUS_READY                       ) .or. ;
              (oDC:printerStatus() = XBPPRN_STATUS_BUSY   .and. ::IgnoreBusy   ) .or. ;
              (oDC:printerStatus() = XBPPRN_STATUS_PAUSED .and. ::IgnorePaused )

              lIsPrinterError := .f.
           else
              lIsPrinterError := .t.
           endif
   endcase
return lIsPrinterError


Könntest du mal prüfen, welcher Status "XBPPRN_STATUS_???" ausgegeben wird ?

Druckerschächte am Besten auswählen lassen und dann abspeichern.
Die Standardzuordnungen funktionieren nicht immer und jeder Drucker macht seinen eigenen Mist.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13181
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Vorherige

Zurück zu Drucken und Export

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast