Drucken mit HBPrinter - Was geht wie warum ???
Moderator: Moderatoren
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
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 ... 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
Alle direkten Ausdrucke sind einwandfrei (HP und Canon Drucker), auch die PDF vom eDokPrinter ... 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) 560-mal heruntergeladen
Gruß
Hubert
Hubert
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
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:
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.
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
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
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
ist das Thema noch akut ?brandelh hat geschrieben:Tatsache ist, dass ich mich überhaupt nicht mit Transparenz beschäftigt habe, da brauche ich wohl etwas Nachhilfe
Code: Alles auswählen
oBmp:=XbpBitmap():new():create()
oBmp:loadFile("logo.bmp")
oBmp:transparentClr := oBmp:getDefaultBGColor() // <- das fehlt
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
Jimmy
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
meinst du damit das er jetzt als Standalone eine eigene Netzwerkkarte bekomme/aktiviert mit IP 192.168. ... hat ?mini990 hat geschrieben:Nun das Problem: Ist der Drucker via Netzwerk mit eigener IP verbunden melden alle
PC's ein .T. bei isprintererror().
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
Code: Alles auswählen
IF oDC:Create( cPrinter ) == oDC // = self
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.
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
das prüfe ich auch, einige Zeilen tiefer ... und fass "es gibt kein Objekt" mit der Statusabfrage zusammen.AUGE_OHR hat geschrieben:meinst du damit das er jetzt als Standalone eine eigene Netzwerkkarte bekomme/aktiviert mit IP 192.168. ... hat ?mini990 hat geschrieben:Nun das Problem: Ist der Drucker via Netzwerk mit eigener IP verbunden melden alle
PC's ein .T. bei isprintererror().
Wenn ja "könnte" es daran liegen das er erst aus dem Standby aufwachen muss ...
@Hubert : in der METHOD _HBPrinter:PrinterPS(cPrinterName)IMHO geht das bei Standby nicht. ich überprüfe das so ...Code: Alles auswählen
if ! IsPrinterVorgabe * Nun haben wir leere Objecte oDC:Create(cPrinterName) // <- ohne Prüfung ? ::oUseXbpPrinter := oDC endif
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
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hier ist die Methode die das regelt:
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
*-------------------------------------------------------------
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
::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
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
hi,
aha ... ja ... er gibt jazurü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.
aha ... ja ... er gibt ja
Code: Alles auswählen
METHOD _HBPrinter:IsPrinterError(oDC)
...
case ::_PrinterCreateErr
lIsPrinterError := .T.
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
Jimmy
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
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
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
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
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.
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
Hubert
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
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...
Übergehe ich die IsPrinterError Abfrage druckt alles ganz normal...
Gruß Stefan
PS: Wo ich momentan noch ein Problem habe ist die Schachtansteuerung von Druckern...
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
In diesem Code werte ich die verschiedenen Zustände aus:
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.
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
Druckerschächte am Besten auswählen lassen und dann abspeichern.
Die Standardzuordnungen funktionieren nicht immer und jeder Drucker macht seinen eigenen Mist.
Gruß
Hubert
Hubert
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Ich gebe hier nur den Zugriff auf die Methode von XbpPrinter() frei, selbst nutze ich diese Methode nicht.
Nach der Hilfe zu urteilen:
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.
Nach der Hilfe zu urteilen:
macht es genau was der Name vermuten lässt. Den Binären (?) Datenstrom statt zur Druckerschnittstelle in eine Datei speichern.: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.
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
Hubert
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Danke Dir, Du hast mir den Tag gerettet....
Gruß Stefan
Gruß Stefan
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Innerhalb von der Methode SAY mache ich genau das (wobei ich mit 1 anfange, nicht mit 0).
Siehe nPosY und nPosX Berechnung
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
Hubert
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
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
Ich verwende den :Printbox befehl bei HBPrinter.
Wie kann ich die Farbe beeinflussen wenn nFill auf 1 steht?
Gruß Stefan
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
nach dem ich genug gelacht habe ... ne im Ernst, ich spiele mal den Oberlehrer ... im Zweifel schauen wir im Quellcode nach:
Die Ausgabe erfolgt über GraBox() ... nun sehen wir in der Hilfe von Xbase++ nach ...
Diese Methode rufst du vor dem Befehl auf ... im Quellcode findet man noch das Gegenstück:
Es gibt auch noch GraSetColor() bzw. die Methode SetColor() von der Klasse XbpPresSpace() ... ::oPS ist so ein Objekt.
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
Ich hoffe es hat dennoch geholfen.
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
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: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.
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
Code: Alles auswählen
*-------------------------------------------------------------
METHOD _HBPrinter:ReSetAttrArea( aAttribAlt ) // VER 1.02
return GraSetAttrArea( ::oPS, aAttribAlt )
*-------------------------------------------------------------
Code: Alles auswählen
*-------------------------------------------------------------
METHOD _HBPrinter:SetColor(nForeground, nBackground)
return ::oPS:SetColor(nForeground, nBackground)
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
Ich hoffe es hat dennoch geholfen.
Gruß
Hubert
Hubert
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Die Lösung so einfach.....
...wenn man denn lesen kann!
Danke und scgönes Wochenende!
Gruß Stefan
...wenn man denn lesen kann!
Danke und scgönes Wochenende!
Gruß Stefan
- uwe.24
- UDF-Programmierer
- Beiträge: 52
- Registriert: Di, 01. Aug 2006 15:47
- Wohnort: Osnabrück
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
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
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
Uwe aus OS
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2128
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Servus Uwe,
irgendwie ist meine Antwort verschwunden, also nochmal:
Nimm die aktuelle Version von HBPrinter, dann ist
Dein Freund.
irgendwie ist meine Antwort verschwunden, also nochmal:
Nimm die aktuelle Version von HBPrinter, dann ist
Code: Alles auswählen
PrintMemoCountLines
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- uwe.24
- UDF-Programmierer
- Beiträge: 52
- Registriert: Di, 01. Aug 2006 15:47
- Wohnort: Osnabrück
- Danksagung erhalten: 1 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
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ß.
Uwe aus OS
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