Drucken mit HBPrinter - Was geht wie warum ???
Moderator: Moderatoren
- messing
- Rekursionen-Architekt
- Beiträge: 216
- Registriert: Mi, 13. Jan 2010 9:42
- Wohnort: Lauterbach / Hessen
Re: Drucken mit HBPrinter - Was geht wie warum ???
Servus, kann man mit hbprint auch auf Arrays zugreifen?
SAY ?
Gruß Messing
SAY ?
Gruß Messing
Gruß
Bruno
Messing
Bruno
Messing
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hi,
du solltest genauer schreiben, was du meinst, dann fällt die Antwort genauer aus.
1. Xbase++ kann auf alle seine Datentypen zugreifen und diese an :say(...,xData,...) weitergeben.
2. xData vom Typ Array wird als Var2Char(xData) ausgegeben, dies kann man sehr leicht im Quellcode nachsehen !
3. Vermutlich ist das nicht die Ausgabe die du willst, also besser den gewünschten Inhalt übergeben z.B. ein Arrayfeld aData[2,4] ...
4. xData kann jede Kombination sein die Xbase++ erzeugen kann.
du solltest genauer schreiben, was du meinst, dann fällt die Antwort genauer aus.
1. Xbase++ kann auf alle seine Datentypen zugreifen und diese an :say(...,xData,...) weitergeben.
2. xData vom Typ Array wird als Var2Char(xData) ausgegeben, dies kann man sehr leicht im Quellcode nachsehen !
3. Vermutlich ist das nicht die Ausgabe die du willst, also besser den gewünschten Inhalt übergeben z.B. ein Arrayfeld aData[2,4] ...
4. xData kann jede Kombination sein die Xbase++ erzeugen kann.
Gruß
Hubert
Hubert
- messing
- Rekursionen-Architekt
- Beiträge: 216
- Registriert: Mi, 13. Jan 2010 9:42
- Wohnort: Lauterbach / Hessen
Re: Drucken mit HBPrinter - Was geht wie warum ???
Sorry, meinte aEval.brandelh hat geschrieben:Hi,
du solltest genauer schreiben, was du meinst, dann fällt die Antwort genauer aus.
1. Xbase++ kann auf alle seine Datentypen zugreifen und diese an :say(...,xData,...) weitergeben.
2. xData vom Typ Array wird als Var2Char(xData) ausgegeben, dies kann man sehr leicht im Quellcode nachsehen !
3. Vermutlich ist das nicht die Ausgabe die du willst, also besser den gewünschten Inhalt übergeben z.B. ein Arrayfeld aData[2,4] ...
4. xData kann jede Kombination sein die Xbase++ erzeugen kann.
Da in aEval das Array durchgekämmt wird, dachte ich mir, ob es wohl möglich ist, eine SAY Anweisung ausreicht um das Array auszudrucken.
Gruß Messing
Gruß
Bruno
Messing
Bruno
Messing
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hi,
aEval mit richtigem Codeblock geht natürlich auch, aber man muss auch die Zeilen hochzählen.
Ich persönlich finde hier FOR NEXT sinnvoller, aber ...
das hat jetzt aber nicht wirklich etwas mit dem HBPrinter zu tun, das ist normale Xbase++ Logik.
HBPrint ist eine normale Klasse, erzeugt normale Objekte und mit denen kann man alles machen was in Xbase++ normal ist
aEval mit richtigem Codeblock geht natürlich auch, aber man muss auch die Zeilen hochzählen.
Ich persönlich finde hier FOR NEXT sinnvoller, aber ...
Code: Alles auswählen
nZeile := 5
nSpalte := 10
eEval(aData,{|cZeile| oHBP:say(nZeile++,nSpalte,cZeile)})
HBPrint ist eine normale Klasse, erzeugt normale Objekte und mit denen kann man alles machen was in Xbase++ normal ist
Gruß
Hubert
Hubert
- messing
- Rekursionen-Architekt
- Beiträge: 216
- Registriert: Mi, 13. Jan 2010 9:42
- Wohnort: Lauterbach / Hessen
Re: Drucken mit HBPrinter - Was geht wie warum ???
Danke für den Kopfstossbrandelh hat geschrieben:Hi,
aEval mit richtigem Codeblock geht natürlich auch, aber man muss auch die Zeilen hochzählen.
Ich persönlich finde hier FOR NEXT sinnvoller, aber ...
das hat jetzt aber nicht wirklich etwas mit dem HBPrinter zu tun, das ist normale Xbase++ Logik.Code: Alles auswählen
nZeile := 5 nSpalte := 10 eEval(aData,{|cZeile| oHBP:say(nZeile++,nSpalte,cZeile)})
HBPrint ist eine normale Klasse, erzeugt normale Objekte und mit denen kann man alles machen was in Xbase++ normal ist
Ich glaub bei mir hängt noch das Weekend im Schädel,
Hatte so nen Gedanken, doch irgendwie ist die Umsetzung schiefgelaufen.
Nochmals Danke, manchmal hängts einfach.
Gruss Messing
[erledigt]
Gruß
Bruno
Messing
Bruno
Messing
- messing
- Rekursionen-Architekt
- Beiträge: 216
- Registriert: Mi, 13. Jan 2010 9:42
- Wohnort: Lauterbach / Hessen
Re: Drucken mit HBPrinter - Was geht wie warum ???
Servus,
habe folgende Zeilen:
muß ich bei AEval(drkopfarray,{|cZeile,i| oHBPrinter:say(drkopfarray[i,1]...
das Array in der say Anweisung angeben, oder gibt es eine andere Möglichkeit?
Danke
habe folgende Zeilen:
Code: Alles auswählen
AAdd(drkopfarray,{b+4,10,"Tag","L"})
AAdd(drkopfarray,{b+4,13,"Datum","L"})
AAdd(drkopfarray,{b+4,18,"Anfang","L"})
AAdd(drkopfarray,{b+4,23,"Ende","L"})
AAdd(drkopfarray,{b+4,28,"Stunden","L"})
AAdd(drkopfarray,{b+4,34,"Pause","L"})
AAdd(drkopfarray,{b+4,40,"Import","L"})
AAdd(drkopfarray,{b+4,50,"Export","L"})
AAdd(drkopfarray,{b+4,60,"Leergut","L"})
for a=10 to 68
AAdd(drkopfarray,{b+5,a,drzeichen,"L"})
next
drzeichen:= Chr(32) + Chr(179) + Chr(32)
for qwe=4 to 5
AAdd(drkopfarray,{b+qwe,12,drzeichen,"L"})
AAdd(drkopfarray,{b+qwe,17,drzeichen,"L"})
AAdd(drkopfarray,{b+qwe,22,drzeichen,"L"})
AAdd(drkopfarray,{b+qwe,27,drzeichen,"L"})
AAdd(drkopfarray,{b+qwe,33,drzeichen,"L"})
AAdd(drkopfarray,{b+qwe,39,drzeichen,"L"})
AAdd(drkopfarray,{b+qwe,49,drzeichen,"L"})
AAdd(drkopfarray,{b+qwe,59,drzeichen,"L"})
next
aEval(drkopfarray,{|cZeile,i| oHBPrinter:say(drkopfarray[i,1],;
drkopfarray[i,2],drkopfarray[i,3],drkopfarray[i,4])})
das Array in der say Anweisung angeben, oder gibt es eine andere Möglichkeit?
Danke
Gruß
Bruno
Messing
Bruno
Messing
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo,
aEval arbeitet ein Array ab und gibt eine Array Zeile (das kann auch ein Array sein !) als ersten Parameter weiter:
geht zwar, ist aber umständlicher als nötig !
Zunächst cZeile ist kein String, sondern nach deiner Konstruktion selbst ein Array !
Einfacher wäre also ...
sicherer wäre dann die Verwendung von #define ...
der Vorteil läge darin, dass eine nachträgliche Spaltenänderung einfacher ist und die Spalten selbstsprechend sind.
Ist halt zunächst mehr Aufwand.
aEval arbeitet ein Array ab und gibt eine Array Zeile (das kann auch ein Array sein !) als ersten Parameter weiter:
Code: Alles auswählen
aEval(aArray,{|eineArrayZeile,ArrayIndex| ....
Code: Alles auswählen
AAdd(drkopfarray,{b+qwe,59,drzeichen,"L"})
...
aEval(drkopfarray,{|cZeile,i| oHBPrinter:say(drkopfarray[i,1],drkopfarray[i,2],drkopfarray[i,3],drkopfarray[i,4])})
Zunächst cZeile ist kein String, sondern nach deiner Konstruktion selbst ein Array !
Einfacher wäre also ...
Code: Alles auswählen
aEval(drkopfarray,{|aZeile| oHBPrinter:say(aZeile[1],aZeile[2],aZeile[3],aZeile[4])})
Code: Alles auswählen
#define HB_SAY_PosX 1
#define HB_SAY_PosY 2
#define HB_SAY_Info 3
#define HB_SAY_ALIGN 4
aEval(drkopfarray,{|aZeile| oHBPrinter:say(aZeile[HB_SAY_PosX],aZeile[HB_SAY_PosY],aZeile[HB_SAY_Info],aZeile[HB_SAY_ALIGN])})
Ist halt zunächst mehr Aufwand.
Gruß
Hubert
Hubert
- messing
- Rekursionen-Architekt
- Beiträge: 216
- Registriert: Mi, 13. Jan 2010 9:42
- Wohnort: Lauterbach / Hessen
Re: Drucken mit HBPrinter - Was geht wie warum ???
Vielen Dank!brandelh hat geschrieben:Hallo,
aEval arbeitet ein Array ab und gibt eine Array Zeile (das kann auch ein Array sein !) als ersten Parameter weiter:Code: Alles auswählen
aEval(aArray,{|eineArrayZeile,ArrayIndex| ....
geht zwar, ist aber umständlicher als nötig !Code: Alles auswählen
AAdd(drkopfarray,{b+qwe,59,drzeichen,"L"}) ... aEval(drkopfarray,{|cZeile,i| oHBPrinter:say(drkopfarray[i,1],drkopfarray[i,2],drkopfarray[i,3],drkopfarray[i,4])})
Zunächst cZeile ist kein String, sondern nach deiner Konstruktion selbst ein Array !
Einfacher wäre also ...sicherer wäre dann die Verwendung von #define ...Code: Alles auswählen
aEval(drkopfarray,{|aZeile| oHBPrinter:say(aZeile[1],aZeile[2],aZeile[3],aZeile[4])})
der Vorteil läge darin, dass eine nachträgliche Spaltenänderung einfacher ist und die Spalten selbstsprechend sind.Code: Alles auswählen
#define HB_SAY_PosX 1 #define HB_SAY_PosY 2 #define HB_SAY_Info 3 #define HB_SAY_ALIGN 4 aEval(drkopfarray,{|aZeile| oHBPrinter:say(aZeile[HB_SAY_PosX],aZeile[HB_SAY_PosY],aZeile[HB_SAY_Info],aZeile[HB_SAY_ALIGN])})
Ist halt zunächst mehr Aufwand.
Hab dieses Jahr erst mit Arrays angefangen. Muß also noch ordentlich büffeln!
Gruß
Bruno
Messing
Bruno
Messing
-
- Rekursionen-Architekt
- Beiträge: 237
- Registriert: Do, 14. Aug 2008 14:59
- Wohnort: Straelen
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 3 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo Hubert,
ich benutze deine Printer-Klasse und möchte diesmal mit "Class-Code" ein Array
auf Din-A4-Querformat ausdrucken. Die Vorschau für den Druck wird noch
richtig angezeigt. Leider funktioniert das Drucken nicht. Was mache ich
falsch?
Der Code ist folgender:
Wie gesagt, die Vorschau für den Druck wird noch richtig angezeigt. Aber nur
wenn die Zeile //::setOrientation(XBPPRN_ORIENT_PORTRAIT) auch ausgeschaltet
bleibt. Wird die Zeile eingeschaltet entsteht folgender Fehler:
Version : Xbase++ (R) Version 1.90.331 Betriebssystem : Windows XP
05.01 Build 02600 Service Pack 3
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: O CLASS: XbpPresSpace
-> VALTYPE: A VALUE: {}
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Fehler bei der Arrayindizierung
oError:filename :
oError:genCode : 4
oError:operation : graPos
oError:osCode : 0 = Der Vorgang wurde erfolgreich beendet.
oError:severity : 2
oError:subCode : 1012
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von _HBPRINTER:PRINTTEXT(1285)
Aufgerufen von KF_LISTE:PRINTFORM(174)
Aufgerufen von KF_LISTE:PRINT(209)
Aufgerufen von HBPRINTDIALOG:PREVIEWDRAW(623)
Aufgerufen von (B)HBPRINTDIALOG:CREATE(302)
Aufgerufen von HBPRINTDIALOG:EVENTLOOP(365)
Aufgerufen von _HBPRINTER:PRINTINGDIALOG(882)
Aufgerufen von DRUCK_KF(35)
Aufgerufen von (B)NETTOANALYSE(838)
Aufgerufen von MAIN(368)
Beim richtigen Drucken entsteht immer folgender Laufzeitfehler:
oError:args :
-> VALTYPE: U VALUE: NIL
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Parameter hat falschen Typ
oError:filename :
oError:genCode : 2
oError:operation : .not.<NIL>
oError:osCode : 0 = Der Vorgang wurde erfolgreich beendet.
oError:severity : 2
oError:subCode : 3
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von _HBPRINTER:PRINTERPS(1720)
Aufgerufen von HBPRINTDIALOG:PRINT(529)
Aufgerufen von (B)HBPRINTDIALOG:INIT(246)
Aufgerufen von HBPRINTDIALOG:EVENTLOOP(365)
Aufgerufen von _HBPRINTER:PRINTINGDIALOG(882)
Aufgerufen von DRUCK_KF(35)
ich benutze deine Printer-Klasse und möchte diesmal mit "Class-Code" ein Array
auf Din-A4-Querformat ausdrucken. Die Vorschau für den Druck wird noch
richtig angezeigt. Leider funktioniert das Drucken nicht. Was mache ich
falsch?
Der Code ist folgender:
Code: Alles auswählen
FUNCTION Druck_KF()
LOCAL oListe
oListe := KF_Liste():New()
oListe:create()
IF oListe:IsPrinterError()
ErrBox("Druckerfehler!")
RETURN .F.
ELSE
oListe:addFont("14.Arial")
oListe:addFont("12.Arial")
oListe:addFont("9.Arial")
oListe:PrintingDialog( .t. ,; // ESC -> close
.t. ,; // ALT+Enter and Enter will Print
xbeK_ALT_P) // ALT+P will print
ENDIF
RETURN .T.
*----------------------------------------------------------------------
CLASS KF_Liste FROM HBPrinter
EXPORTED:
METHOD Print
METHOD PrintForm
ENDCLASS
*-------------------------------------------------------------
* die folgenden Methoden anpassen
*-------------------------------------------------------------
METHOD KF_Liste:PrintForm()
::HBPrinter:PrintForm()
* in abgeleiteten Klasse - in derived classes
//::setOrientation(XBPPRN_ORIENT_PORTRAIT)
//::setOrientation(XBPPRN_ORIENT_LANDSCAPE)
//::setFormSize(XBPPRN_FORM_A4)
::SetFont(HB_FONT_14Arial)
::PrintText(200,2750, "1.Netto-Kostenfachtabelle vom " + DTOC(DATE()) , "L",,,,90)
::SetFont(HB_FONT_9Arial)
::PrintText(300,2750, "KF","L",,,,90 )
::PrintText(300,2700, "Kostenfachname","L",,,,90 )
::PrintText(300,1650, "Kalkulation","R",,,,90 )
::PrintText(300,1400, "Änderung","R",,,,90 )
::PrintText(300,1150, "Abrechnung","R",,,,90 )
::PrintText(300,900, "Vergabe","R",,,,90 )
::PrintText(300,650, "Prognose BL","R",,,,90 )
::PrintText(300,400, "Abweichung","R",,,,90 )
::PrintText(300,150, "NaVorsteuer","R",,,,90 )
::PrintLine(300,2750,300,150)
RETURN SELF
******-------------------------------------------------------------
METHOD KF_Liste:Print() // Alle variablen Druckausgaben
LOCAL posX
LOCAL i, oKF:=oKF()
::nPageNo := 1
::lFirstPageForm := .f. // Formular 1. Seite noch nicht gedruckt
* Hier folgt ihr Code
::HBPrinter:Print() // möglich, aber eigentlich unnötig
* in abgeleiteten Klasse
::nFirstLine := 350
PosX := ::nFirstLine
//::SetFont(HB_FONT_9Arial)
::PrintForm() // erste Seite Formular drucken
FOR i=1 TO oKF:LastRec(1)
IF posX >= 1900 .or. posX < 0 // Seite voll - page full
::NewPage()
::PrintForm()
if ::IsAfterLastPage() // (spart Zeit, wichtig für Vorschau !)
exit
endif
posX := ::nFirstLine
endif
::PrintText(posx,2750,oKF:aKF[1,i,FI_KF_NR],"L",,,,90)
::PrintText(posx,2700,oKF:aKF[1,i,FI_KF_NAME],"L",,,,90)
::PrintText(posx,1650,Format_FI_KF(1,i,FI_KF_VORGABE),"R",,,,90)
::PrintText(posx,1400,Format_FI_KF(1,i,FI_KF_AENDERUNG),"R",,,,90)
::PrintText(posx,1150,Format_FI_KF(1,i,FI_KF_ABRECHNUNG),"R",,,,90)
::PrintText(posx,900,Format_FI_KF(1,i,FI_KF_VERGABE),"R",,,,90)
::PrintText(posx,650,Format_FI_KF(1,i,FI_KF_PROGNOSE),"R",,,,90)
::PrintText(posx,400,Format_FI_KF(1,i,FI_KF_ABWEICHUNG),"R",,,,90)
::PrintText(posx,150,Format_FI_KF(1,i,FI_KF_SUMNAVST),"R",,,,90)
posX += ::LineFeed()
NEXT
RETURN SELF
wenn die Zeile //::setOrientation(XBPPRN_ORIENT_PORTRAIT) auch ausgeschaltet
bleibt. Wird die Zeile eingeschaltet entsteht folgender Fehler:
Version : Xbase++ (R) Version 1.90.331 Betriebssystem : Windows XP
05.01 Build 02600 Service Pack 3
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: O CLASS: XbpPresSpace
-> VALTYPE: A VALUE: {}
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Fehler bei der Arrayindizierung
oError:filename :
oError:genCode : 4
oError:operation : graPos
oError:osCode : 0 = Der Vorgang wurde erfolgreich beendet.
oError:severity : 2
oError:subCode : 1012
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von _HBPRINTER:PRINTTEXT(1285)
Aufgerufen von KF_LISTE:PRINTFORM(174)
Aufgerufen von KF_LISTE:PRINT(209)
Aufgerufen von HBPRINTDIALOG:PREVIEWDRAW(623)
Aufgerufen von (B)HBPRINTDIALOG:CREATE(302)
Aufgerufen von HBPRINTDIALOG:EVENTLOOP(365)
Aufgerufen von _HBPRINTER:PRINTINGDIALOG(882)
Aufgerufen von DRUCK_KF(35)
Aufgerufen von (B)NETTOANALYSE(838)
Aufgerufen von MAIN(368)
Beim richtigen Drucken entsteht immer folgender Laufzeitfehler:
oError:args :
-> VALTYPE: U VALUE: NIL
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Parameter hat falschen Typ
oError:filename :
oError:genCode : 2
oError:operation : .not.<NIL>
oError:osCode : 0 = Der Vorgang wurde erfolgreich beendet.
oError:severity : 2
oError:subCode : 3
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von _HBPRINTER:PRINTERPS(1720)
Aufgerufen von HBPRINTDIALOG:PRINT(529)
Aufgerufen von (B)HBPRINTDIALOG:INIT(246)
Aufgerufen von HBPRINTDIALOG:EVENTLOOP(365)
Aufgerufen von _HBPRINTER:PRINTINGDIALOG(882)
Aufgerufen von DRUCK_KF(35)
Viele Grüße
Dieter
Was man nicht versteht, besitzt man nicht.
Dieter
Was man nicht versteht, besitzt man nicht.
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hi,
zunächst eine einfache Info
::setOrientation(XBPPRN_ORIENT_PORTRAIT)
::setOrientation(XBPPRN_ORIENT_LANDSCAPE)
::setFormSize(XBPPRN_FORM_A4)
müssen - wenn überhaupt - außerhalb des Printjobs aufgerufen werden.
Eventuell noch in der Klasse :PRINT() keines Falles aber in PRINTFORM().
Ich nutze beide aber überhaupt nicht, sondern drehe die einzelnen Druckausgaben wie du
es auch gemacht hast. Schließlich will man meist nicht alle Seiten bzw. Texte einer Seite
gedreht haben.
Wenn die Druckvorschau keinen Fehler liefert, muss man eventuell an das Ende der Seite blättern,
es könnte sein, dass die Fehler erst auf einer Folgeseite auftreten ...
ich vermute, dass dein Zugriff auf dein DatenArray den Fehler verursacht ...
schließlich ist meine Bibliothek schon lange im Einsatz und ich habe auch ein Beispiel
mit Array ohne Fehler laufen lassen, aber ich schaue es mir mal an.
Fürs Testen, wenn solch ein Array Fehler auftritt, kann man hingehen und
die Arrays kurzfristig durch reinen Text ersetzen z.B.
PrintText(..., MeinDatenArray(x,y)) -> PrintText(..., "MeinDatenArray(x,y)" )
wenn dann das Programm durchläuft ist es ein Zugriffsproblem z.b. weil eine Dimension nicht stimmt oder ein Element nil ist.
Danach eine Anweisung nach der Anderen zurücksetzen, meist erkennt man hier schon den Fehler ...
ansonsten wenn er wieder auftritt.
zunächst eine einfache Info
::setOrientation(XBPPRN_ORIENT_PORTRAIT)
::setOrientation(XBPPRN_ORIENT_LANDSCAPE)
::setFormSize(XBPPRN_FORM_A4)
müssen - wenn überhaupt - außerhalb des Printjobs aufgerufen werden.
Eventuell noch in der Klasse :PRINT() keines Falles aber in PRINTFORM().
Ich nutze beide aber überhaupt nicht, sondern drehe die einzelnen Druckausgaben wie du
es auch gemacht hast. Schließlich will man meist nicht alle Seiten bzw. Texte einer Seite
gedreht haben.
Wenn die Druckvorschau keinen Fehler liefert, muss man eventuell an das Ende der Seite blättern,
es könnte sein, dass die Fehler erst auf einer Folgeseite auftreten ...
ich vermute, dass dein Zugriff auf dein DatenArray den Fehler verursacht ...
schließlich ist meine Bibliothek schon lange im Einsatz und ich habe auch ein Beispiel
mit Array ohne Fehler laufen lassen, aber ich schaue es mir mal an.
Fürs Testen, wenn solch ein Array Fehler auftritt, kann man hingehen und
die Arrays kurzfristig durch reinen Text ersetzen z.B.
PrintText(..., MeinDatenArray(x,y)) -> PrintText(..., "MeinDatenArray(x,y)" )
wenn dann das Programm durchläuft ist es ein Zugriffsproblem z.b. weil eine Dimension nicht stimmt oder ein Element nil ist.
Danach eine Anweisung nach der Anderen zurücksetzen, meist erkennt man hier schon den Fehler ...
ansonsten wenn er wieder auftritt.
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo Dieter,
deine Version von HBPrinter stimmt nicht mit meiner neuesten überein, daher stimmen auch die Zeilenangaben nicht.
Bitte lade zuerst die neue Version, eventuell ist dann der Fehler schon beseitigt.
Wenn nicht, bitte die fehlerhafte Druckdatei als PRG gezippt mit den aktuellen xpperror.log und xppfatal.log an meine eMail-Adresse senden.
Es kann aber dauern bis ich dazu komme - eventuell findest du den Fehler auch früher
VALTYPE: U VALUE: NIL - es wurde ein NIL Wert übergeben, wahrscheinlich aber mit etwas anderem gerechnet.
oError:description : Parameter hat falschen Typ - // sicher mit etwas anderem ...
oError:operation : .not.<NIL> - der Quellcode ... .NOT. .... gibt keinen Sinn für .NOT. NIL, also müsste es eine solche Zeile sein:
Es bleibt wie geschrieben, neue HBPrinter-Version (1.34 - 16.09.2010 ) von meiner homepage laden,
neu kompilieren und testen, eventuelle Fehlerdateien mit der Druckdatei zusenden.
deine Version von HBPrinter stimmt nicht mit meiner neuesten überein, daher stimmen auch die Zeilenangaben nicht.
Bitte lade zuerst die neue Version, eventuell ist dann der Fehler schon beseitigt.
Wenn nicht, bitte die fehlerhafte Druckdatei als PRG gezippt mit den aktuellen xpperror.log und xppfatal.log an meine eMail-Adresse senden.
Es kann aber dauern bis ich dazu komme - eventuell findest du den Fehler auch früher
VALTYPE: U VALUE: NIL - es wurde ein NIL Wert übergeben, wahrscheinlich aber mit etwas anderem gerechnet.
oError:description : Parameter hat falschen Typ - // sicher mit etwas anderem ...
oError:operation : .not.<NIL> - der Quellcode ... .NOT. .... gibt keinen Sinn für .NOT. NIL, also müsste es eine solche Zeile sein:
im aktuellen Code ist aber sichergestellt, dass beide Variablen einen logischen Typ haben bevor es zu der Abfragezeile kommt:if ! IsPrinterVorgabe
...
if ! ::_PrinterCreateErr
Code: Alles auswählen
*-------------------------------------------------------------
METHOD _HBPrinter:PrinterPS(cPrinterName)
LOCAL oPS, oDC, nBreite,nHoehe,aPaperSize, IsPrinterVorgabe
IsPrinterVorgabe := .f.
if IsNil(::oPrinterPS) // erster Aufruf - first Time
if IsNil(::oUseXbpPrinter) // keine Vorgabe - no preselection
oPS := XbpPresSpace():New()
oDC := XbpPrinter():New()
else
oPS := XbpPresSpace():New()
oDC := ::oUseXbpPrinter
IsPrinterVorgabe := .t.
endif
else
oPS := ::oPrinterPS
oDC := oPS:device()
oPS:configure() // oDC freigeben - release oDC
if IsNil(oDC)
oDC := XbpPrinter():New()
endif
if oDC:Status() = XBP_STAT_CREATE // dann zurücksetzen
oDC:destroy()
endif
if oPS:Status() = XBP_STAT_CREATE // dann zurücksetzen
oPS:destroy()
endif
endif
if ! IsPrinterVorgabe
* Nun haben wir leere Objecte
oDC:Create(cPrinterName)
endif
if IsNil(oDC) .or. oDC:Status() = XBP_STAT_FAILURE
::_PrinterCreateErr := .t.
else
::_PrinterCreateErr := .f.
endif
if ! ::_PrinterCreateErr
aPaperSize := oDC:PaperSize() // hier kommen nur 6 Elemente
nBreite := aPaperSize[5] - aPaperSize[3] // laut DOKU sollten es 8 sein.
nHoehe := aPaperSize[6] - aPaperSize[4]
oPS:Create( oDC, {nBreite,nHoehe} , GRA_PU_LOMETRIC )
::SetInternalPageVars(oPS)
endif
RETURN oPS
neu kompilieren und testen, eventuelle Fehlerdateien mit der Druckdatei zusenden.
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 237
- Registriert: Do, 14. Aug 2008 14:59
- Wohnort: Straelen
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 3 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo Hubert,
habe gerade die Version 1.34 deiner HBPrinter-Klasse neu in mein Programm eingebunden. Hätte ich eigentlich auch selber draufkommen müssen, bevor ich Dir deine wertvolle Zeit stehle.
Jetzt funktioniert alles, wie gewünscht. =D>
Vielen Dank
habe gerade die Version 1.34 deiner HBPrinter-Klasse neu in mein Programm eingebunden. Hätte ich eigentlich auch selber draufkommen müssen, bevor ich Dir deine wertvolle Zeit stehle.
Jetzt funktioniert alles, wie gewünscht. =D>
Vielen Dank
Viele Grüße
Dieter
Was man nicht versteht, besitzt man nicht.
Dieter
Was man nicht versteht, besitzt man nicht.
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo Dieter,
freut mich, hast du eigentlich oben schon abgestimmt :-"
freut mich, hast du eigentlich oben schon abgestimmt :-"
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 237
- Registriert: Do, 14. Aug 2008 14:59
- Wohnort: Straelen
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 3 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo Hubert,
ich habe natürlich schon vor geraumer Zeit abgestimmt und kann gar nicht begreifen, warum hier im Forum nur so wenige deine Klasse einsetzen.
ich habe natürlich schon vor geraumer Zeit abgestimmt und kann gar nicht begreifen, warum hier im Forum nur so wenige deine Klasse einsetzen.
Viele Grüße
Dieter
Was man nicht versteht, besitzt man nicht.
Dieter
Was man nicht versteht, besitzt man nicht.
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hi,
ich denke, dass ein Großteil lieber einen Reportgenerator nutzt, bzw. diesen zwingend braucht. Das scheint die größte Gruppe zu sein.
die die Xbase++ pur benutzen, haben entweder eine Abneigung gegen Fremdprodukte oder das gelernt benutzt ohne die Klasse zu kennen ...
Gerade Clipper @ SAY drucker hat das Wort KLASSE abgeschreckt ... dafür habe ich die SAY Methode eingeführt.
Wie auch immer ist das GUI Drucken um Welten einfacher als das Gefummel zu DOS Zeiten.
ich denke, dass ein Großteil lieber einen Reportgenerator nutzt, bzw. diesen zwingend braucht. Das scheint die größte Gruppe zu sein.
die die Xbase++ pur benutzen, haben entweder eine Abneigung gegen Fremdprodukte oder das gelernt benutzt ohne die Klasse zu kennen ...
Gerade Clipper @ SAY drucker hat das Wort KLASSE abgeschreckt ... dafür habe ich die SAY Methode eingeführt.
Wie auch immer ist das GUI Drucken um Welten einfacher als das Gefummel zu DOS Zeiten.
Gruß
Hubert
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2120
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 29 Mal
- Danksagung erhalten: 70 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Servus Hubert,
kann ich mittels HBPRinter auf einen Zebra - Drucker (LP 2844) direkt drucken, oder geht das nur mit EPL-Commandos? Ohne jetzt irgendwas gelesen zu haben, ein Schnelltest mittels HBPrinter oder Word funktionierten nicht, er macht zwar einen Seitenvorschub, druckt jedoch nichts.
Danke.
kann ich mittels HBPRinter auf einen Zebra - Drucker (LP 2844) direkt drucken, oder geht das nur mit EPL-Commandos? Ohne jetzt irgendwas gelesen zu haben, ein Schnelltest mittels HBPrinter oder Word funktionierten nicht, er macht zwar einen Seitenvorschub, druckt jedoch nichts.
Danke.
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2932
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo Werner,
schau mal im Express++ Forum, da waren ein paar Tricks zu Zebra Druckern:
http://bb.donnay-software.com:8080/phpb ... ra&start=0
schau mal im Express++ Forum, da waren ein paar Tricks zu Zebra Druckern:
http://bb.donnay-software.com:8080/phpb ... ra&start=0
Viele Grüße
Wolfgang
Wolfgang
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2120
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 29 Mal
- Danksagung erhalten: 70 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Servus Wolfgang,
danke. Habs durchgelesen, die Tests laufen bei mir nicht, der Drucker ist mit dem aktuellen Windows-Treiber installiert. Aus Wordpad das gleiche Verhalten wie mit HBPrinter, leerer Seitenvorschub.
Wie läuft das grundsätzlich mit solchen Druckern? Muss da erst im Treiber alles eingestellt werden, sind ja massiv viele Optionen (Etikettgröße etc.) und geht dann das Drucken über HBPrinter, oder muss da auf den ASCII-Modus umgestellt und umständlich über EPL-Befehle gedruckt werden?
danke. Habs durchgelesen, die Tests laufen bei mir nicht, der Drucker ist mit dem aktuellen Windows-Treiber installiert. Aus Wordpad das gleiche Verhalten wie mit HBPrinter, leerer Seitenvorschub.
Wie läuft das grundsätzlich mit solchen Druckern? Muss da erst im Treiber alles eingestellt werden, sind ja massiv viele Optionen (Etikettgröße etc.) und geht dann das Drucken über HBPrinter, oder muss da auf den ASCII-Modus umgestellt und umständlich über EPL-Befehle gedruckt werden?
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hi,
HBPrinter() nutzt intern die XbpPrinter() Klasse, somit ist ein normaler Windowsdruckertreiber nötig.
Wenn Word oder Wordpad etc. nicht drucken kann, kann es auch nicht mit XbpPrinter() bzw. HBPrinter gehen.
HBPrinter() nutzt intern die XbpPrinter() Klasse, somit ist ein normaler Windowsdruckertreiber nötig.
Wenn Word oder Wordpad etc. nicht drucken kann, kann es auch nicht mit XbpPrinter() bzw. HBPrinter gehen.
Gruß
Hubert
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2120
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 29 Mal
- Danksagung erhalten: 70 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Servus Hubert,
danke, das war mir schon klar. Es muss doch hier irgendjemand schon diese Drucker kennen? Möchte jetzt ungern das 332seitige englische Programmierhandbuch dazu lesen müssen, nur um 1 Zeile Text und 1 Zeile Barcode darauf auszugeben...
Vielleicht poste ich meine Frage als neues Thema hier in diesem Forum?
danke, das war mir schon klar. Es muss doch hier irgendjemand schon diese Drucker kennen? Möchte jetzt ungern das 332seitige englische Programmierhandbuch dazu lesen müssen, nur um 1 Zeile Text und 1 Zeile Barcode darauf auszugeben...
Vielleicht poste ich meine Frage als neues Thema hier in diesem Forum?
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2120
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 29 Mal
- Danksagung erhalten: 70 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Vielleicht ist einfach auch nur die Thermo-Einheit defekt... der Drucker wurde vom Kunden gebraucht gekauft und ich darf mich jetzt damit rumschlagen
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2120
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 29 Mal
- Danksagung erhalten: 70 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hallo,
Problem gelöst, es waren die falschen Etiketten im Drucker!
Problem gelöst, es waren die falschen Etiketten im Drucker!
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2120
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 29 Mal
- Danksagung erhalten: 70 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Neue Frage: Wie ermittle ich PosY für die nächste Zeile nach einem printmemo (weils auch mehrzeilig sein kann)?
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Drucken mit HBPrinter - Was geht wie warum ???
Hi,
::PrintMemo() erhöht den internen Zeilenzähler bei jeder neuen Zeile die es selbst benötigt.
Danach einfach die Funktion ::LineFeed() aufrufen, deren Rückgabewert ist die neue Zeile, genauso wie nach z.B. PrintText()
::PrintMemo() erhöht den internen Zeilenzähler bei jeder neuen Zeile die es selbst benötigt.
Danach einfach die Funktion ::LineFeed() aufrufen, deren Rückgabewert ist die neue Zeile, genauso wie nach z.B. PrintText()
Code: Alles auswählen
PosY := ::LineFeed()
Gruß
Hubert
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2120
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 29 Mal
- Danksagung erhalten: 70 Mal
Re: Drucken mit HBPrinter - Was geht wie warum ???
Servus Hubert,
dann mache ich was falsch:
Druckt voll in die 2. Zeile des Memos, da es 2zeilig gedruckt wird.
dann mache ich was falsch:
Code: Alles auswählen
oMeinDrucker:PrintMemo(nLinkerRand, nY += oMeinDrucker:LineFeed(), left(cText, len(cText) - 3),,RANDRECHTS - nLinkerRand)
nY += oMeinDrucker:LineFeed()
oMeinDrucker:PrintText(nLinkerRand, nY, "blablabla")
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>