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 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) 3908-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) 84-mal heruntergeladen
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon 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
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 299
Registriert: Sa, 28. Jan 2006 10:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

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

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon 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: 10284
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitragvon 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
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10284
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitragvon 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: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon 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
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10284
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitragvon 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: 299
Registriert: Sa, 28. Jan 2006 10:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

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

Beitragvon 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
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 299
Registriert: Sa, 28. Jan 2006 10:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

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

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon 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
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 299
Registriert: Sa, 28. Jan 2006 10:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

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

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon mini990 » Mo, 20. Mär 2017 10: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
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 299
Registriert: Sa, 28. Jan 2006 10:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

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

Beitragvon brandelh » Mo, 20. Mär 2017 10: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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon mini990 » Mo, 20. Mär 2017 12:32

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

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

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

Beitragvon 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
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 299
Registriert: Sa, 28. Jan 2006 10:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

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

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

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

Super, danke!
Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 299
Registriert: Sa, 28. Jan 2006 10:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

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

Beitragvon 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
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 299
Registriert: Sa, 28. Jan 2006 10:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

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

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon 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
mini990
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 299
Registriert: Sa, 28. Jan 2006 10:44
Wohnort: Berngau bei Neumarkt i.d.Opf.

Vorherige

Zurück zu Drucken und Export

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste