HBPRINT und SAY Zentriert
Moderator: Moderatoren
- Bruno
- Rekursionen-Architekt
- Beiträge: 151
- Registriert: So, 16. Apr 2023 23:11
- Wohnort: Lauterbach
- Hat sich bedankt: 47 Mal
- Danksagung erhalten: 12 Mal
HBPRINT und SAY Zentriert
Hallo an Euch,
Ich habe mir den Quellcode von der HBPRINT Klasse mehrfach durchgearbeitet, wenn ich mit SAY drucken will, ist ja Zeile und Spalte anzugeben.
Wie bekomme ich einen zentrierten Druck auf DIN A4, da ja bei verschiedenen FONTS sich die Spaltenzahl verändert. Ebenso verändert sich die Zeilenanzahl, wenn der Font größer sein soll. Beim Aufruf kann man zwar zentriert sagen, benötigt jedoch die richtige Spaltenposition, damit zentriert gedruckt wird. Ich habe bis heute zwar die Klasse benutzt, jedoch noch nie zentriert und mit anderen Schriftarten. Bei meinen bisherigen Versuchen, ist es immer ein Raten, auf welche Spaltenposition ich gehen muß, um ungefähr in die Mitte von 21 cm zu kommen. Die Möglichkeit den Aufruf mit Papierbreite zu machen ist nicht.
Der Ausdruck bei zentriert erfolgt an der Spaltenposition welche angegeben wird ohne Probleme, nur welche Spalte zählt kommt auf den Font an.
Weis einer eine Möglichkeit wie man das mit Font und Papierbreite berechnen kann?
Gruß
Bruno
Ich habe mir den Quellcode von der HBPRINT Klasse mehrfach durchgearbeitet, wenn ich mit SAY drucken will, ist ja Zeile und Spalte anzugeben.
Wie bekomme ich einen zentrierten Druck auf DIN A4, da ja bei verschiedenen FONTS sich die Spaltenzahl verändert. Ebenso verändert sich die Zeilenanzahl, wenn der Font größer sein soll. Beim Aufruf kann man zwar zentriert sagen, benötigt jedoch die richtige Spaltenposition, damit zentriert gedruckt wird. Ich habe bis heute zwar die Klasse benutzt, jedoch noch nie zentriert und mit anderen Schriftarten. Bei meinen bisherigen Versuchen, ist es immer ein Raten, auf welche Spaltenposition ich gehen muß, um ungefähr in die Mitte von 21 cm zu kommen. Die Möglichkeit den Aufruf mit Papierbreite zu machen ist nicht.
Der Ausdruck bei zentriert erfolgt an der Spaltenposition welche angegeben wird ohne Probleme, nur welche Spalte zählt kommt auf den Font an.
Weis einer eine Möglichkeit wie man das mit Font und Papierbreite berechnen kann?
Gruß
Bruno
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Xbase++ 1.9.355 ohne eExpress
- brandelh
- Foren-Moderator
- Beiträge: 15745
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 77 Mal
- Danksagung erhalten: 41 Mal
- Kontaktdaten:
Re: HBPRINT und SAY Zentriert
die SAY Methode ist ja dafür da eine einfache Xbase++ Druckausgabe auf dem neuen Drucker ausgeben zu können ohne alles neu zu berechnen.
Ich meine ich ging davon aus, dass immer 80 Zeichen auf die Zeile passen (10cpi), also müsste 39 oder 40 immer die Mitte sein, ist allerdings schon lange her dass ich das geschrieben habe
schauen wir in den Code:
weiter unten im Quellcode die Berechnung wohin der Text geschrieben wird:
Nur wenn cAusrichtung == "R" ist, wird der Text rechtsbündig an der berechneten Spalte gedruckt (für Zahlen oder Datum etc.)
ansonsten wird immer auf das Ende der linken Spalte ausgerichtet !
Da kurz darauf PrintText() mit cAusrichtung aufgerufen wird, wird bei "C" (zentriert) die Textlänge halbiert und die Position nach links verschoben.
Zentriert um die Spate die angegeben wurde, nicht automatisch auf die Seitenmitte !
Die Seitenmitte ist auch nicht eindeutig, man kann vom Seitenrand bis Seitenrand messen, dann wäre die Mitte von A4 etwa 10,5 cm,
oder man will die Mitte der gedruckten Seite (zentriert im fliesenden Text), das hängt dann vom linken und rechten Rand (nicht Drucker Hardware Rand) ab,
für so eine einfache Funktion viel zu komplex
Nochmal, bei 10 Zeichen Pro Zoll, sollten 80 Zeichen in eine Zeile passen, links 10 oder 15 als Rand vorsehen, rechts meist 10,
dann kann man daraus die benötigte Spalte ermitteln. Blocksatz und SAY passen grundsätzlich nicht zueinander.
Hier noch die dokumentierte PrintText() Methode mit den Ausrichtungen:
Ich meine ich ging davon aus, dass immer 80 Zeichen auf die Zeile passen (10cpi), also müsste 39 oder 40 immer die Mitte sein, ist allerdings schon lange her dass ich das geschrieben habe
schauen wir in den Code:
Code: Alles auswählen
Versionsbeschreibung, es war 2009 ...
1.32 - 13.09.2009 (= 2009-09-13)
NEU: ::say(nRow,nCol,xData,cAlign,nCPI,nLPI) // min == 1,1
Diese Methode bernimmt die Positionsparameter (Zeile,Spalte)
wie der @z,s SAY ... Befehl, um solche Migrationen zu vereinfachen.
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
...
uReturn := ::PrintText( nPosX, nPosY,cTxt, cAusrichtung)
...
ansonsten wird immer auf das Ende der linken Spalte ausgerichtet !
Da kurz darauf PrintText() mit cAusrichtung aufgerufen wird, wird bei "C" (zentriert) die Textlänge halbiert und die Position nach links verschoben.
Zentriert um die Spate die angegeben wurde, nicht automatisch auf die Seitenmitte !
Die Seitenmitte ist auch nicht eindeutig, man kann vom Seitenrand bis Seitenrand messen, dann wäre die Mitte von A4 etwa 10,5 cm,
oder man will die Mitte der gedruckten Seite (zentriert im fliesenden Text), das hängt dann vom linken und rechten Rand (nicht Drucker Hardware Rand) ab,
für so eine einfache Funktion viel zu komplex
Nochmal, bei 10 Zeichen Pro Zoll, sollten 80 Zeichen in eine Zeile passen, links 10 oder 15 als Rand vorsehen, rechts meist 10,
dann kann man daraus die benötigte Spalte ermitteln. Blocksatz und SAY passen grundsätzlich nicht zueinander.
Hier noch die dokumentierte PrintText() Methode mit den Ausrichtungen:
Code: Alles auswählen
*-------------------------------------------------------------
METHOD _HBPrinter:PrintText( nPosX, nPosY, xData, cAusrichtung, nMaxLen, cArt, nFarbe, nDrehen )
local aPos, nTxtLen, lSuccess, aTextBox, nY, aAltColor, aAltAttr := NIL , aAttribNeu := {}
local aBlockSatzWort,aNoBlank, nLenNoBlank, nBlockWordCount, x, nBlankOffset
local aNewPenPos, cTxt, IsPrintTextAlltrim
DEFAULT cAusrichtung to "L" // m”gliche Werte - possible values
#define PrintTextAusrichtung "LCZMRB" // L = links - left - adjustment
// C = center, Z=zentriert, M=mittig
// R = rechts - right
// B = Blocksatz - left and right
// -> braucht nMaxLen fr Zeilenbreite zum Ausrichten oder ::nRightMargin
// -> needs nMaxLen for width of line to adjust or ::nRightMargin
Gruß
Hubert
Hubert
- Bruno
- Rekursionen-Architekt
- Beiträge: 151
- Registriert: So, 16. Apr 2023 23:11
- Wohnort: Lauterbach
- Hat sich bedankt: 47 Mal
- Danksagung erhalten: 12 Mal
Re: HBPRINT und SAY Zentriert
Hallo Hubert,
Danke für die Antwort,
die Beschreibung bezieht sich nur auf 10 Cpi Schriften,
wenn ich eine Schrift mit Größe 20 drucken will, sind deren Maße anders als 10 Cpi.
Darauf wollte ich hinaus, eine Möglichkeit die Spaltenposition und Zeilenposition auf Grundlage der Schriftart zu berechnnen, so das bei einem Fontwechsel eine Anpassung erfolgen kann. Das Blatt ist ja 21 cm breit, wenn dann ein entsprechend großer Font benutzt wird, treffen 80 Zeichen nicht mehr zu. Ich hab in deinem Test_Say, mal Arial 10 , Arial 10 Fett, Arial 12 Fett, Garamond 12, Garamond 12 Fett und Garamond 9 Fett genommen.
Ich hab gesehn, das die SAY Methode auf die PrintText Methode zugreift, Wie müsste ich den Befehl im Programm machen, um im Blatt zentriert zu sein?
Du rechnest ja die Row und Col in graphische Koordinaten um,
0,0 ist die obere linke Ecke?
Dann könnte ich anstatt SAY, PrintText nehmen.
Oder anders gesagt, wie bekomme ich die Fonthöhe und Fontbreite um den Text entsprechend dieser Werte dann drucken zu können?
Die nPosX müsste entsprechend der Fontbreite angepasst werden sowie der Zeilenvorschub die Größe, wenn der zu druckende Text 2 cm hoch wäre.
Da ich noch nie mit den graphischen Möglichkeiten gedruckt habe, wäre ich erfreut, wenn da einer weiter weiß.
Gruß
Bruno
Danke für die Antwort,
die Beschreibung bezieht sich nur auf 10 Cpi Schriften,
wenn ich eine Schrift mit Größe 20 drucken will, sind deren Maße anders als 10 Cpi.
Darauf wollte ich hinaus, eine Möglichkeit die Spaltenposition und Zeilenposition auf Grundlage der Schriftart zu berechnnen, so das bei einem Fontwechsel eine Anpassung erfolgen kann. Das Blatt ist ja 21 cm breit, wenn dann ein entsprechend großer Font benutzt wird, treffen 80 Zeichen nicht mehr zu. Ich hab in deinem Test_Say, mal Arial 10 , Arial 10 Fett, Arial 12 Fett, Garamond 12, Garamond 12 Fett und Garamond 9 Fett genommen.
Ich hab gesehn, das die SAY Methode auf die PrintText Methode zugreift, Wie müsste ich den Befehl im Programm machen, um im Blatt zentriert zu sein?
Du rechnest ja die Row und Col in graphische Koordinaten um,
Code: Alles auswählen
METHOD _HBPrinter:PrintText( nPosX, nPosY, xData, cAusrichtung, nMaxLen, cArt, nFarbe, nDrehen )
Dann könnte ich anstatt SAY, PrintText nehmen.
Oder anders gesagt, wie bekomme ich die Fonthöhe und Fontbreite um den Text entsprechend dieser Werte dann drucken zu können?
Die nPosX müsste entsprechend der Fontbreite angepasst werden sowie der Zeilenvorschub die Größe, wenn der zu druckende Text 2 cm hoch wäre.
Da ich noch nie mit den graphischen Möglichkeiten gedruckt habe, wäre ich erfreut, wenn da einer weiter weiß.
Gruß
Bruno
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Xbase++ 1.9.355 ohne eExpress
- brandelh
- Foren-Moderator
- Beiträge: 15745
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 77 Mal
- Danksagung erhalten: 41 Mal
- Kontaktdaten:
Re: HBPRINT und SAY Zentriert
PrintText() wird bei meiner Klasse mit 1/10 mm gefüttert und berechnet alles intern auf der eingestellten Schriftgröße.
In meinen Beispielen drehe ich einen Schriftkreis wie ein Propeller um einen Punkt, da kannst du sehen, wo der Punkt ist, einfach verschieben in die Mitte.
In meinen Beispielen drehe ich einen Schriftkreis wie ein Propeller um einen Punkt, da kannst du sehen, wo der Punkt ist, einfach verschieben in die Mitte.
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 179
- Registriert: Mi, 09. Jan 2019 16:02
- Wohnort: Neresheim
- Danksagung erhalten: 8 Mal
- Kontaktdaten:
Re: HBPRINT und SAY Zentriert
Hallo Bruno
vielleicht geht das in deine Richtung:
Einige (wichtige) Ausdrucke mache ich im PCL-Format. Da schreibe ich eine Datei die dann einfach auf den Drucker Kopiert wird.
Darin kann ich auch Esc-Sequenzen und HPGL gemischt verwenden. Und habe ein (gekauftes) Programm was dann auch PDF draus macht.
Was Dich interessiert:
zur Berechnung der Zeichen für Positionierung verwende ich eine Tabelle von HP die ich vor langer Zeit bekommen haben.
Da habe ich mir Funktionen geschrieben für z.B. Mittig, Rechtsbündig, Tab, usw.
An PCL(5/6) hat sich schon lange nichts mehr geändert und kann (fast) jeder Drucker ohne besonderen Treiber.
Da gebe ich die gewünschte Schriftgröße an, Fettdruck, Kursiv usw.
Aber eben alles im Rahmen der passenden Schrift die mit HP PCL möglich ist.
Die Positionierung auf dem Blatt messe ich mit dem Lineal und gebe das in cm in meine Funktionen ein.
Im Detail stecke ich da gerade nicht mehr drin, das ist schon lange her wo ich das gemacht habe. Kann ich aber gern offenlegen.
Ergänzung #1
Auch farbige Schrift ist möglich wie Rot ,Grün, Blau,... (natürlich nur auf Farbdruckern zu sehen)
Gruß
Roland
vielleicht geht das in deine Richtung:
Einige (wichtige) Ausdrucke mache ich im PCL-Format. Da schreibe ich eine Datei die dann einfach auf den Drucker Kopiert wird.
Darin kann ich auch Esc-Sequenzen und HPGL gemischt verwenden. Und habe ein (gekauftes) Programm was dann auch PDF draus macht.
Was Dich interessiert:
zur Berechnung der Zeichen für Positionierung verwende ich eine Tabelle von HP die ich vor langer Zeit bekommen haben.
Da habe ich mir Funktionen geschrieben für z.B. Mittig, Rechtsbündig, Tab, usw.
An PCL(5/6) hat sich schon lange nichts mehr geändert und kann (fast) jeder Drucker ohne besonderen Treiber.
Da gebe ich die gewünschte Schriftgröße an, Fettdruck, Kursiv usw.
Aber eben alles im Rahmen der passenden Schrift die mit HP PCL möglich ist.
Die Positionierung auf dem Blatt messe ich mit dem Lineal und gebe das in cm in meine Funktionen ein.
Im Detail stecke ich da gerade nicht mehr drin, das ist schon lange her wo ich das gemacht habe. Kann ich aber gern offenlegen.
Ergänzung #1
Auch farbige Schrift ist möglich wie Rot ,Grün, Blau,... (natürlich nur auf Farbdruckern zu sehen)
Gruß
Roland
Gruß
Roland
Roland
- Bruno
- Rekursionen-Architekt
- Beiträge: 151
- Registriert: So, 16. Apr 2023 23:11
- Wohnort: Lauterbach
- Hat sich bedankt: 47 Mal
- Danksagung erhalten: 12 Mal
Re: HBPRINT und SAY Zentriert
Hallo Hubert,brandelh hat geschrieben: ↑Mo, 21. Okt 2024 13:27 PrintText() wird bei meiner Klasse mit 1/10 mm gefüttert und berechnet alles intern auf der eingestellten Schriftgröße.
In meinen Beispielen drehe ich einen Schriftkreis wie ein Propeller um einen Punkt, da kannst du sehen, wo der Punkt ist, einfach verschieben in die Mitte.
das mit PrintText habe ich probiert, funktioniert gut, Danke !
Verräts Du mir noch, wie ich in einem Dokument 4 verschiedene Schriftarten verwenden kann?
Gruß
Bruno
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Xbase++ 1.9.355 ohne eExpress
- brandelh
- Foren-Moderator
- Beiträge: 15745
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 77 Mal
- Danksagung erhalten: 41 Mal
- Kontaktdaten:
Re: HBPRINT und SAY Zentriert
In den Beispielen verwende ich doch verschiedene Schriftarten.
Die Schriften speichere ich dabei in Variablen, z.B. bei TEST-Bold.prg
Die Schriften speichere ich dabei in Variablen, z.B. bei TEST-Bold.prg
Code: Alles auswählen
*---------------- Fonts nur einmal erzeugen - create fonts only once ------
#define HB_FONT_14Arial 1
#define HB_FONT_12Arial 2
#define HB_FONT_12ArialBold 3
***** die Reihenfolge ist egal, muss aber zu diesen Zeilen passen:
...
oHBPrinter:addFont("14.Arial")
oHBPrinter:addFont("12.Arial")
oHBPrinter:addFont({"Arial",12,.t.,.f.}) // Passender Bold Font !
Code: Alles auswählen
bei die Schriften für eine Seite sortiere ich dann die Ausgabe je nach Schrifttyp, bei Zeilenweiser Ausgabe kann man die Schrift zwischen den Aufrufen wechseln, ohne X, Y Angabe dann auch hinter die letzte Ausgabe in die Zeile setzen.
[code]// da Seitenbeschreibung, erst aktuellen Font sichern (Nummer)
altFont := ::SetFont(HB_FONT_14Arial) // 14. Arial als Überschrift auf jeder Seite
::PrintText( 200,150, "Drucker: "+::devname ,,, "_" )
::PrintText( 200,2800, "Seite:"+str(::nPageNo),,, "box" ) // Text fr alle Seiten - text for all pages
...
// im laufenden Text ist bisherige Schrift egal, daher einfach setzen.
::SetFont(HB_FONT_12Arial)
::PrintText(1500,1050, "::nPaperSizeX: "+ntrim(::nPaperSizeX) )
::PrintText(1500,1100, "::nPaperSizeY: "+ntrim(::nPaperSizeY) )
Gruß
Hubert
Hubert
- Bruno
- Rekursionen-Architekt
- Beiträge: 151
- Registriert: So, 16. Apr 2023 23:11
- Wohnort: Lauterbach
- Hat sich bedankt: 47 Mal
- Danksagung erhalten: 12 Mal
Re: HBPRINT und SAY Zentriert
Vielen Dank.
Jetzt noch eine Frage, wie drucke ich das blöde Euro Symbol, bei mir kommt immer so ein komisches C mit unten dranhängendem "Zipfel". zum Vorschein
Bitte die Frage vergessen, habe gemerkt, das Daten aus Datenbanken anders gedruckt werden als Zeichen im Quellcode.
Wenn ich das Euro Zeichen über eine Datenbank in ein Array lege, und dieses dann an entsprechenden Stellen zuweise, wird das Eurosymbol gedruckt.
Vielen herzlichen Dank für die Hilfe.
Gruß
Bruno
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Xbase++ 1.9.355 ohne eExpress
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2170
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 33 Mal
- Danksagung erhalten: 80 Mal
Re: HBPRINT und SAY Zentriert
Servus Bruno,
Du verwendest offensichtlich noch das alte OEM? Dann ConvToAnsiCP oder / und chr(128).
Du verwendest offensichtlich noch das alte OEM? Dann ConvToAnsiCP oder / und chr(128).
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>