Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Anmeldungen zum Forentreffen 2018 sind auf der Anmeldeseite möglich
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Mi, 09. Sep 2015 9: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) 4623 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) 101-mal heruntergeladen
Gruß
Hubert

Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 330
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Mi, 30. Mär 2016 9: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
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Mi, 30. Mär 2016 12: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
AUGE_OHR
Marvin
Marvin
Beiträge: 10657
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Do, 31. Mär 2016 3: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: 10657
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Do, 31. Mär 2016 4: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
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Do, 31. Mär 2016 7: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: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Do, 31. Mär 2016 8: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
AUGE_OHR
Marvin
Marvin
Beiträge: 10657
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Fr, 01. Apr 2016 3: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
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 330
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Mo, 25. Apr 2016 11: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: 330
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Do, 29. Sep 2016 8: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
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Do, 29. Sep 2016 9: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
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 330
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Do, 29. Sep 2016 9: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
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Do, 29. Sep 2016 10: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
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 330
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Mo, 20. Mär 2017 9:16

Hallo Hubert,
kannst Du mir die Funktionsweise von:

METHOD _HBPrinter:setPrintFile( cFileName )

kurz erläutern?
Ist es möglich, einen erstellten "Druckauftrag" statt zu drucken auch zu speichern?

Danke im Voraus

Gruß Stefan

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Mo, 20. Mär 2017 9:28

Ich gebe hier nur den Zugriff auf die Methode von XbpPrinter() frei, selbst nutze ich diese Methode nicht.
Nach der Hilfe zu urteilen:
:setPrintFile()- Druckausgabe in Datei umleiten.
Klasse
XbpPrinter()
Syntax

:setPrintFile( [<cFileName>] ) --> cOldFileName | NIL

Parameter

<cFileName>

Für <cFileName> muß eine Zeichenkette angegeben werden, die einen gültigen Dateinamen beinhaltet, oder es ist die #define Konstante XBPPRN_FILE_PROMPT zu verwenden. Wird für den Parameter ein Nullzeichen ("") angegeben, so erfolgt die Druckausgabe wieder auf dem Drucker und nicht mehr in einer Datei.

Rückgabe

Die Methode gibt den zuvor eingestellten Wert zurück. Wenn der Drucker diese Einstellung nicht unterstützt, wird NIL zurückgegeben.

Beschreibung

Die Methode wird verwendet, um die Druckausgabe in eine Datei umzuleiten. Falls für <cFileName> die Konstante XBPPRN_FILE_PROMPT angegeben ist, erscheint nach Aufruf der Methode :startDoc() ein Dialogfenster, in dem der Anwender einen Dateinamen auswählen kann.
macht es genau was der Name vermuten lässt. Den Binären (?) Datenstrom statt zur Druckerschnittstelle in eine Datei speichern.
Unter DOS habe ich sowas schon getan und danach mit COPY cPrintDatei.bin LPT1 ausgedruckt.

Aber oben steht, der Drucker muss das unterstützen und das ist mir zu unsicher. Was wenn ich später einen anderen Drucker nutzen will ?

In diesen Fällen würde ich persönlich die Druckausgabe entweder auf einen PDF Druckertreiber senden oder eventuell den Windows eigenen (XPS ?).
PDF Dateien kann man dann leicht speichern, ansehen oder auf jedem Drucker ausdrucken.
Gruß
Hubert

Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 330
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Mo, 20. Mär 2017 11:32

Danke Dir, Du hast mir den Tag gerettet.... :-)

Gruß Stefan

Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 330
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Mi, 29. Mär 2017 19:05

Sorry Hubert, noch eine dumme Frage.....
Man kann bei HBPrinter ja auch mit "Say" arbeiten analog zu @ xx,yy say.
Gibt es eine einfache Möglichkeit diese xx,yy Werte in PrintText Angaben umzurechnen?

Gruß Stefan

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Do, 30. Mär 2017 7:04

Innerhalb von der Methode SAY mache ich genau das (wobei ich mit 1 anfange, nicht mit 0).
Siehe nPosY und nPosX Berechnung

Code: Alles auswählen

*-------------------------------------------------------------
METHOD _HBPrinter:say(nRow,nCol,xData,cAusrichtung,nCPI,nLPI) // -> @nRow,nCol SAY ...
   local cTxt,nPosX,nPosY, uReturn, lAltPrintTextAlltrim
   if IsNil(nCPI) .or. nCPI < 10
      nCPI := 10     // normal 10, 12, 16
   endif
   if IsNil(nLPI) .or. nLPI < 1
      nLPI :=  6     // normal 6 or 8
   endif
   nPosY := nRow * (254/nLPI)  // 2.54 cm -> 1/10 mm => 254 // +1 wegen Unterkante
   if cAusrichtung == "R"
      nPosX :=  nCol * (254/nCPI)  // 2.54 cm -> 1/10 mm => 254 // rechts vom Zeichen.
   else
      nPosX := (nCol-1) * (254/nCPI)  // 2.54 cm -> 1/10 mm => 254 // links vom Zeichen.
   endif

   do case
      case IsNil(xData)
           cTxt := "NIL"
      case ValType(xData) $ "CM"
           cTxt := xData
      case ValType(xData) $ "N"  // BESSER MIT TRANSFORM() // better use Transform()
           cTxt := alltrim(str(xData))
      case ValType(xData) $ "L"
           cTxt := iif(xData," Ja ","Nein")
      otherwise
           cTxt := Var2Char(xData)
   endcase
   lAltPrintTextAlltrim := ::PrintTextAlltrim
   ::PrintTextAlltrim   := .f.   // Blanks mitdrucken !
   uReturn := ::PrintText( nPosX, nPosY,cTxt, cAusrichtung)
   ::PrintTextAlltrim   :=  lAltPrintTextAlltrim
return uReturn
Gruß
Hubert

Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 330
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Do, 30. Mär 2017 11:23

Super, danke!

Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 330
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Mi, 26. Apr 2017 16:18

Bitte nicht lachen: Anfängerfrage!
Ich verwende den :Printbox befehl bei HBPrinter.
Wie kann ich die Farbe beeinflussen wenn nFill auf 1 steht?

Gruß Stefan

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13811
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Do, 27. Apr 2017 15:25

nach dem ich genug gelacht habe ... ne im Ernst, ich spiele mal den Oberlehrer ... im Zweifel schauen wir im Quellcode nach:

Code: Alles auswählen

*-------------------------------------------------------------
METHOD _HBPrinter:PrintBox(nLeftX,nTopY,nSizeX, nSizeY,cRelativAbsolut,nFill, nHRadius, nVRadius)
    local lSuccess := .t.
    if ::IsPageToPrint()
       DEFAULT cRelativAbsolut to "R"  // Relativ: nSizeX and nSizeY are the length and width relative to
                                       //          nLeftX and nTopY
                                       // Absolut: Just the right, bottom Values as used in GraBox
                                       // nFill, nHRadius, nVRadius -> in Onlinehilfe nachsehen - look in Manual for GraBox

       cRelativAbsolut := upper(left(cRelativAbsolut,1))

       if cRelativAbsolut = "R"
          nSizeX += nLeftX
          nSizeY += nTopY
       endif

       lSuccess := GraBox( ::oPS,::PosHBtoXPP(nLeftX,nTopY),::PosHBtoXPP(nSizeX,nSizeY),nFill,nHRadius,nVRadius)
    endif
return lSuccess
Die Ausgabe erfolgt über GraBox() ... nun sehen wir in der Hilfe von Xbase++ nach ...
Zitat aus der Hilfe ... hat geschrieben: Mit der Funktion GraBox() werden Rechtecke gezeichnet.
Sie werden standardmäßig nur als Umrandung ausgegeben, wobei die Farbe und die Strichstärke ... durch die Funktion GraSetAttrLine() eingestellt werden können.
Soll ein Rechteck gefüllt sein, kann das Füllmuster und die Füllfarbe durch GraSetAttrArea() ausgewählt werden.
Das Standardfüllmuster entspricht der #define-Konstante GRA_SYM_SOLID.
vor dem Aufruf muss man also GraSetAttrArea() aktivieren, aber die Klasse kümmert sich ja um alles und die ::oPS ist intern, daher gibt es eine Methode die das macht:

Code: Alles auswählen

*-------------------------------------------------------------
METHOD _HBPrinter:SetAttrArea( aAttribNeu )
   local aAttrib, aAttribAlt
   aAttrib := Array( GRA_AA_COUNT )
   aeval(aAttribNeu,{|aAttNeuWert| aAttrib[(aAttNeuWert[1])] := (aAttNeuWert[2]) } )
   aAttribAlt := GraSetAttrArea( ::oPS, aAttrib )
return aAttribAlt
Diese Methode rufst du vor dem Befehl auf ... im Quellcode findet man noch das Gegenstück:

Code: Alles auswählen

*-------------------------------------------------------------
METHOD _HBPrinter:ReSetAttrArea( aAttribAlt )                   // VER 1.02
return GraSetAttrArea( ::oPS, aAttribAlt )
*-------------------------------------------------------------
Es gibt auch noch GraSetColor() bzw. die Methode SetColor() von der Klasse XbpPresSpace() ... ::oPS ist so ein Objekt.

Code: Alles auswählen

*-------------------------------------------------------------
METHOD _HBPrinter:SetColor(nForeground, nBackground)
return ::oPS:SetColor(nForeground, nBackground)
Ich vermute, dass :SetColor() genauso genutzt werden könnte, wobei hierbei die Vordergrundfarbe die Umrandung und die Hintergrundfarbe die Füllung ist, kann mich da aber auch täuschen.
Auf jeden Fall wirkt die Methode auf Boxen, Linien und Schrift. Wenn man also nur eine Box oder eine Schrift färben will nimmt man die spezielle Methode für alle eher diese.
Bei den PrintText() Befehlen habe ich die Schriftfarbe abgefragt, weil das häufig der Fall ist, bei der Box hielt ich dies wohl für unnötig, da man meist mehrere Aufrufe braucht.

Grundsätzlich sollte man den Quellcode durchgehen und nachsehen was ich wie gemacht habe ... vor vielen Jahren ... daher muss ich das auch ab und zu wieder tun :-)

Somit ist der wahre Grund für die ausführliche Erläuterung, dass ich es auch erst nachlesen musste :D
Ich hoffe es hat dennoch geholfen. ;-)
Gruß
Hubert

Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 330
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

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

Beitrag von mini990 » Fr, 28. Apr 2017 8:18

Die Lösung so einfach.....
...wenn man denn lesen kann!

Danke und scgönes Wochenende!

Gruß Stefan

Benutzeravatar
uwe.24
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 32
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück

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

Beitrag von uwe.24 » Mi, 06. Sep 2017 8:48

Hallo.

Ich hab nun schon einiges mit der Druckerklasse von Hubert erfolgreich umgesetzt.
Im Moment bin ich dabei Etiketten mit Infos aus den Sicherheitsdatenblättern für Labormusterdosen zu drucken.
Dabei nutze ich für einen Teil die :PrintMemo Funktion, um je nach Schriftart vernünftig umzubrechen.
Dabei kann die resultierende Zeilenanzahl sehr unterschiedlich lang werden.
Ich möchte gerne den Druck beim Erreichen einer Maximalposition oder Zeilenanzahl abbrechen.

Die gelingt mir leider nicht. Geht das doch und wie?

Ich drucke um 270° gedreht, wegen der Etikettenvorlage.

Im Bild 1 ist alles i.O.
Im Bild 2 ist die Länge zu groß.

Uwe aus OS
Bild1.JPG
Bild1.JPG (32.55 KiB) 248 mal betrachtet
Bild2.JPG
Bild2.JPG (47.1 KiB) 248 mal betrachtet
Uwe aus OS

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1303
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

Beitrag von Werner_Bayern » Mi, 06. Sep 2017 17:25

Servus Uwe,

irgendwie ist meine Antwort verschwunden, also nochmal:

Nimm die aktuelle Version von HBPrinter, dann ist

Code: Alles auswählen

PrintMemoCountLines
Dein Freund. 8)
es grüßt euch

Werner

Benutzeravatar
uwe.24
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 32
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück

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

Beitrag von uwe.24 » Do, 07. Sep 2017 11:30

Hallo Werner.

Das hatte ich mir schon mal angesehen, war aber voller Hoffnung das einfacher zu lösen.
Jetz hab ich vorab eine Schleife eingebaut, die so lange Buchstaben kürzt, bis der Text eine maximal Anzahl Zeilen ergibt.
Dank für den Anstoß.

Code: Alles auswählen

                  cTemp = cPTemp
                  For i = len(cPTemp) to 1 step -1
                     cTemp = left(cTemp,i)
                     nTemp = oHBPrinter:PrintMemoCountLines(cTemp, 600)
                     IF nTemp <= 10
                        cPTemp = cTemp
                        exit
                     ENDIF
                  next
Uwe aus OS
Uwe aus OS

Antworten