Spalten nicht bündig, weil Druckzeichen verrutscht
Moderator: Moderatoren
-
- Cut&Paste-Entwickler
- Beiträge: 28
- Registriert: Mi, 01. Aug 2007 15:53
- Wohnort: Bärlin
Spalten nicht bündig, weil Druckzeichen verrutscht
Ich bin ein lausiger Programmierer, also verlangt nicht zuviel intellektuelles Verständnis von mir. Immerhin habe ich ein Reporting System für Fonds zusammengeschustert, welches sogar seit einiger Zeit in xbase als vio funktioniert.
Ein Problem gibt es bei der Ausgabe der Tabellen in eine Txt Datei
Wenn das ZEichen nicht Proportionalschrift ist , haben die irgendwie
eine unterschiedliche Pixelbreite (Windowsmäßig) und das
Druckbild gerät zu einem impressionistischen Muster.
str(xy)+space(2)+Str(ab)+space usw.
Kann man Tabulatoren setzen ? Gibts praktische Vorschläge ?
MfG
SPP
Ein Problem gibt es bei der Ausgabe der Tabellen in eine Txt Datei
Wenn das ZEichen nicht Proportionalschrift ist , haben die irgendwie
eine unterschiedliche Pixelbreite (Windowsmäßig) und das
Druckbild gerät zu einem impressionistischen Muster.
str(xy)+space(2)+Str(ab)+space usw.
Kann man Tabulatoren setzen ? Gibts praktische Vorschläge ?
MfG
SPP
- Martin Altmann
- Foren-Administrator
- Beiträge: 16511
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo und herzlich willkommen,
wenn Du das mit txt machst, hast Du nicht wirklich viele Möglichkeiten. Du könntest doch einfach beim Öffnen der txt-Datei unter Windows den gesamten Text mit der Schrift Courier New formatieren - dann ist jedes Zeichen gleich breit...
Viele Grüße,
Martin
wenn Du das mit txt machst, hast Du nicht wirklich viele Möglichkeiten. Du könntest doch einfach beim Öffnen der txt-Datei unter Windows den gesamten Text mit der Schrift Courier New formatieren - dann ist jedes Zeichen gleich breit...
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo,
das Drucken mit dem alten ? geht nur und ausschließlich mit Schriften mit gleicher Breite aller Zeichen (FixedFonts z.B. Courier NEW etc.) diese muss der Drucker auch noch standardmäßig verwenden und da hört der Spaß auf. Heutige Drucker arbeiten nur noch unter Windows nach Windows Regeln.
Zum Glück ist das Drucken mit XbpPrinter() gar nicht so schlimm
Zuerst musst du in der Projektdatei (GUI=YES) setzen bzw. beim Linken /PM=PM angeben. Das Programm selbst wird nahezu gleich aussehen.
Dann sieh dir mal das Beispiel von XbpPrintDialog() oder XbpPrinter() an. Sieht zwar vielleicht etwas kompliziert aus, das ist es aber gar nicht.
Mit der Zeile
GraStringAt( oPS, { 0, aSize[2]-50 }, "Hello World" )
siehst du den neuen Druckbefehl. Alle Texte kannst du damit überall hinschreiben. Zahlen vorher in Text umwandeln und naja rechtsbündig setzen...
Probiere mal damit rum es ist nicht so schwer
das Drucken mit dem alten ? geht nur und ausschließlich mit Schriften mit gleicher Breite aller Zeichen (FixedFonts z.B. Courier NEW etc.) diese muss der Drucker auch noch standardmäßig verwenden und da hört der Spaß auf. Heutige Drucker arbeiten nur noch unter Windows nach Windows Regeln.
Zum Glück ist das Drucken mit XbpPrinter() gar nicht so schlimm
Zuerst musst du in der Projektdatei (GUI=YES) setzen bzw. beim Linken /PM=PM angeben. Das Programm selbst wird nahezu gleich aussehen.
Dann sieh dir mal das Beispiel von XbpPrintDialog() oder XbpPrinter() an. Sieht zwar vielleicht etwas kompliziert aus, das ist es aber gar nicht.
Mit der Zeile
GraStringAt( oPS, { 0, aSize[2]-50 }, "Hello World" )
siehst du den neuen Druckbefehl. Alle Texte kannst du damit überall hinschreiben. Zahlen vorher in Text umwandeln und naja rechtsbündig setzen...
Probiere mal damit rum es ist nicht so schwer
Gruß
Hubert
Hubert
-
- Cut&Paste-Entwickler
- Beiträge: 28
- Registriert: Mi, 01. Aug 2007 15:53
- Wohnort: Bärlin
Erstmal vielen Dank für Eure Tipps
ich werde die Tipps heute abend in Ruhe analysieren (Die Leiterbahnen zur Rübe sind etwas länger als bei anderen)
Falls noch jemand diesbezüglich ein Kaninchen im Hut hat :
Abrakadabra...
Falls noch jemand diesbezüglich ein Kaninchen im Hut hat :
Abrakadabra...
-
- Cut&Paste-Entwickler
- Beiträge: 28
- Registriert: Mi, 01. Aug 2007 15:53
- Wohnort: Bärlin
Ich bekomme die Fehlermeldung 1025 vom xbase compiler
Parameter not found.
Welche Dateien muss man einbinden ?
Kannste mal ein lauffähiges Beispiel hier einstellen ?
Welche Dateien muss man einbinden ?
Kannste mal ein lauffähiges Beispiel hier einstellen ?
-
- Cut&Paste-Entwickler
- Beiträge: 28
- Registriert: Mi, 01. Aug 2007 15:53
- Wohnort: Bärlin
Ok jetzt hats gefunzt
Kann man weiterhin die ? für die Bildschirmausgabe benutzen
Wie bekommt man ein Menu hin, wo fonts für die
Druckerausgabe angezeigt werden ? Gibts da was zu kopieren ?
Wie bekommt man ein Menu hin, wo fonts für die
Druckerausgabe angezeigt werden ? Gibts da was zu kopieren ?
-
- Cut&Paste-Entwickler
- Beiträge: 28
- Registriert: Mi, 01. Aug 2007 15:53
- Wohnort: Bärlin
Ich würde gern ein Auswahlmenu kreieren
mittels dem der User die verfügbare Schrift auswählt.
Wie stellt sich der Presentation Space auf dem Display dar,
Können "?" weiter verwendet werden ? (habe einen Haufen
davon in meinem Quellcode)
Wie stellt sich der Presentation Space auf dem Display dar,
Können "?" weiter verwendet werden ? (habe einen Haufen
davon in meinem Quellcode)
- Martin Altmann
- Foren-Administrator
- Beiträge: 16511
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Moin,
also wenn Du unbedingt ? und ?? weiterverwenden willst, hast Du mit Schriftauswahl sicherlich ein Problem - dafür musst Du (denke ich) auf XbpPrinter umstellen.
Viele Grüße,
Martin
also wenn Du unbedingt ? und ?? weiterverwenden willst, hast Du mit Schriftauswahl sicherlich ein Problem - dafür musst Du (denke ich) auf XbpPrinter umstellen.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo,
mit ? "123456" werden genau die Zeichen übertragen. Damit das passt muss:
1. Der Drucker diese direkt drucken können (USB und GDI können das meist nicht)
2. Jedes Zeichen gleich breit sein (die schönen Windowsschriften sind das nicht)
3. Die Texte über die Anzahl der Zeichen formatiert werden (wer will das heute noch machen )
also wie Martin schon sagte, mit ? drucken ist heute schwieriger als zu DOS Zeiten und kann auf keinen Fall mehr als damals Clipper.
Die Zeit ist reif für XbpPrinter !
Das gilt übrigens auch für Basic und andere Programmiersprachen.
Das Ermitteln und die Auswahl der Schriften, sowie die Anzeige von Text auf dem Fenster zeigt das erwähnte FontDB Beispiel. Hast du das angesehen ?
Der Presentationspace ist eine art von allgemeingültigem (nicht hardware abhängigem) Zeichenbrett. Dieses wird in einer gewissen Größe (z.B. A4) definiert und dann dem hardware device (z.B. Drucker) zugewiesen. Im Beispiel von XbpPrinter() oder XbpPrintDialog() kann man das sehen.
Auf dieser Zeichenfläche kannst du dann z.B. auf Position 100,200 ( bei Drucker normal 1/10 mm Einheit) einen Text ausgeben. Dieser wird gleich aussehen egal ob ein 300 oder 1200 DPI Drucker verwendet wird.
Wenn die Zeichenfläche auf ein Window eingerichtet wird, wird dieses unter 800x600 größer sein als bei 1280x1024 (man will auf einem größeren Monitor ja mehr sehen und nicht einzelne Programme größer ). Klingt jetzt etwas umständlich, aber das ist der Grund warum man den Presentationspace braucht. Sieh dir die Beispiele an und du wirst sehen, dass es nichts schwer ist.
DER GROßE VORTEIL ist aber, dass die Reihenfolge was man wann wohin druckt völlig egal ist. Auch übereinander Drucken oder Schriften verschiederer Größe oder Drehung ist möglich.
Der einzige Nachteil von XbpPrinter() ist die blöde Vorgabe, dass 0,0 unten links der druckbare Bereich ist. Dieser Punkt ist jedoch von Drucker zu Drucker verschieden (Bei Lasern meist 7/7 mm vom Rand +/- 1mm, bei Tintenstrahler aber zwischen 6/6 und 9/25 mm).
Auch aus diesem Grunde habe ich meine eigene Druckerklasse (HBPrinterX - bei Alaska download oder hier Wissensbasis oder auf meiner Homepage) geschrieben. Diese ermöglicht auch gleich beim Drucken die Angabe der Ausrichtung. Solange du keinen Druckerauswahldialog brauchst ist meine Klasse sogar einfacher zu benutzen als XbpPrinter() direkt.
Ganz wichtig ist aber auch die Betrachtung deiner Zielpersonen.
Wenn du lediglich Bestandslisten ausdrucken willst und die Zielperson keine Ansprüche stellt, kann man sicher einen Nadeldrucker an LPT1 hängen, ansonsten gilt ? ist out
mit ? "123456" werden genau die Zeichen übertragen. Damit das passt muss:
1. Der Drucker diese direkt drucken können (USB und GDI können das meist nicht)
2. Jedes Zeichen gleich breit sein (die schönen Windowsschriften sind das nicht)
3. Die Texte über die Anzahl der Zeichen formatiert werden (wer will das heute noch machen )
also wie Martin schon sagte, mit ? drucken ist heute schwieriger als zu DOS Zeiten und kann auf keinen Fall mehr als damals Clipper.
Die Zeit ist reif für XbpPrinter !
Das gilt übrigens auch für Basic und andere Programmiersprachen.
Das Ermitteln und die Auswahl der Schriften, sowie die Anzeige von Text auf dem Fenster zeigt das erwähnte FontDB Beispiel. Hast du das angesehen ?
Der Presentationspace ist eine art von allgemeingültigem (nicht hardware abhängigem) Zeichenbrett. Dieses wird in einer gewissen Größe (z.B. A4) definiert und dann dem hardware device (z.B. Drucker) zugewiesen. Im Beispiel von XbpPrinter() oder XbpPrintDialog() kann man das sehen.
Auf dieser Zeichenfläche kannst du dann z.B. auf Position 100,200 ( bei Drucker normal 1/10 mm Einheit) einen Text ausgeben. Dieser wird gleich aussehen egal ob ein 300 oder 1200 DPI Drucker verwendet wird.
Wenn die Zeichenfläche auf ein Window eingerichtet wird, wird dieses unter 800x600 größer sein als bei 1280x1024 (man will auf einem größeren Monitor ja mehr sehen und nicht einzelne Programme größer ). Klingt jetzt etwas umständlich, aber das ist der Grund warum man den Presentationspace braucht. Sieh dir die Beispiele an und du wirst sehen, dass es nichts schwer ist.
DER GROßE VORTEIL ist aber, dass die Reihenfolge was man wann wohin druckt völlig egal ist. Auch übereinander Drucken oder Schriften verschiederer Größe oder Drehung ist möglich.
Der einzige Nachteil von XbpPrinter() ist die blöde Vorgabe, dass 0,0 unten links der druckbare Bereich ist. Dieser Punkt ist jedoch von Drucker zu Drucker verschieden (Bei Lasern meist 7/7 mm vom Rand +/- 1mm, bei Tintenstrahler aber zwischen 6/6 und 9/25 mm).
Auch aus diesem Grunde habe ich meine eigene Druckerklasse (HBPrinterX - bei Alaska download oder hier Wissensbasis oder auf meiner Homepage) geschrieben. Diese ermöglicht auch gleich beim Drucken die Angabe der Ausrichtung. Solange du keinen Druckerauswahldialog brauchst ist meine Klasse sogar einfacher zu benutzen als XbpPrinter() direkt.
Ganz wichtig ist aber auch die Betrachtung deiner Zielpersonen.
Wenn du lediglich Bestandslisten ausdrucken willst und die Zielperson keine Ansprüche stellt, kann man sicher einen Nadeldrucker an LPT1 hängen, ansonsten gilt ? ist out
Gruß
Hubert
Hubert
-
- Cut&Paste-Entwickler
- Beiträge: 28
- Registriert: Mi, 01. Aug 2007 15:53
- Wohnort: Bärlin
Vielen Dank für die Mühe , war sehr aufschlussreich
Mein Problem sind nun die vielen ? im Quellcode.
Gibt es denn irgendein Konvertier-Utility ?
Gibt es denn irgendein Konvertier-Utility ?
-
- Cut&Paste-Entwickler
- Beiträge: 28
- Registriert: Mi, 01. Aug 2007 15:53
- Wohnort: Bärlin
Wie kann ich die Ausgabe in eine Druckdatei
umleiten ?
Mit set printer to blabla dürfte das ja nicht klappen.
Mit set printer to blabla dürfte das ja nicht klappen.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16511
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Moin,
wieso sollte das nicht gehen?
Alternativ:
Viele Grüße,
Martin
wieso sollte das nicht gehen?
Alternativ:
Code: Alles auswählen
set alternate to c:\bla.txt
set alternate on
set console off
...
? Die ganzen Ausgaben...
...
set alternate to
set alternate off
set console on
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
-
- Cut&Paste-Entwickler
- Beiträge: 28
- Registriert: Mi, 01. Aug 2007 15:53
- Wohnort: Bärlin
- Martin Altmann
- Foren-Administrator
- Beiträge: 16511
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Nun, mit GraStringAt() zusammen funktioniert das nicht!
Also: Entweder richtig (unter GUI mit GraStringAt())
oder halt mit Set Printer to bzw. Set Alternate...
Ich rate zu ersterem, auch wenn der Aufwand (erstmal) nicht zu verachten ist...
Am besten mal die Printerklasse von Hubert herunterladen und damit arbeiten - vereinfacht wahrscheinlich einiges... Du findest sie unter dem Forum Links und Demos
Viel Erfolg,
Martin
Also: Entweder richtig (unter GUI mit GraStringAt())
oder halt mit Set Printer to bzw. Set Alternate...
Ich rate zu ersterem, auch wenn der Aufwand (erstmal) nicht zu verachten ist...
Am besten mal die Printerklasse von Hubert herunterladen und damit arbeiten - vereinfacht wahrscheinlich einiges... Du findest sie unter dem Forum Links und Demos
Viel Erfolg,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Spalten nicht bündig, weil Druckzeichen verrutscht
hi,
proprotional Fonts, deshalb mein Vorschlag
definieren die du dann für deine Teil- Strings benutzen kannst.
gruss by OHR
Jimmy
zu Spalten drucken eignet sich so ein zusammen gesetzter String nur mitSnoop_Proggy_Prog hat geschrieben: str(xy)+space(2)+Str(ab)+space usw.
proprotional Fonts, deshalb mein Vorschlag
du zerlegst den String erstmal in seine BestandteileSnoop_Proggy_Prog hat geschrieben: Gibts praktische Vorschläge ?
nun kann du am Anfang des Moduls per #define eigene Tabulator WerteSnoop_Proggy_Prog hat geschrieben: Kann man Tabulatoren setzen ?
definieren die du dann für deine Teil- Strings benutzen kannst.
Code: Alles auswählen
#define TAB1 20
#define TAB1 40
#define TAB1 50
#define TAB1 60
#define TAB1 70
SET CONSOLE OFF
SET PRINTER ON
IF FILEFLAG() // print to File
SET PRINTER TO C:\Temp\MyText.TXT
ELSE
SET PRINTER TO LPT1 // or what you want
ENDIF
/*
zum umschalten wurden früher oft solche Sequenzen benötigt
*/
* ? D_RESET
* D_CPI10 := CHR(27) + CHR(80)
* ? D_CPI10
SET PRINTER OFF
SET DEVICE TO PRINT
@line, 0 SAY field->...
@line, TAB1 SAY field->...
...
@line, TAB7 SAY field->...
SET DEVICE TO SCREEN
SET PRINTER OFF
SET PRINTER TO
SET CONSOLE ON
Jimmy
- Armin
- Rekursionen-Architekt
- Beiträge: 393
- Registriert: Mo, 26. Sep 2005 12:09
- Wohnort: 75331 Engelsbrand
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Hallo SPP,
ich drucke zuerst alle Listen in Dateien. Diese drucke ich mittels xbpPrinter... an den Windowsdrucker. Hierzu verwende ich meistens erst mal einen fixen-Font - meist Lucida-Console.
Wenn Zahlen untereinanderstehen sollen, finde ich eine fixe Schrift übersichtlicher.
Somit kann ich auch Proportionalschrift verwenden - die Spalte, bzw. waagrechte Position kann ich auch durch Addieren der entsprechenden fixen Zeichen ermitteln und mit einem kleineren proportionalen Font relativ gute Ergebnisse erzielen. Ansonten empfiehlt sich eben über ein Report-Generator zu drucken oder z.B. Word-Vorlagen verwenden.
Grüsse, Armin
ich drucke zuerst alle Listen in Dateien. Diese drucke ich mittels xbpPrinter... an den Windowsdrucker. Hierzu verwende ich meistens erst mal einen fixen-Font - meist Lucida-Console.
Wenn Zahlen untereinanderstehen sollen, finde ich eine fixe Schrift übersichtlicher.
Somit kann ich auch Proportionalschrift verwenden - die Spalte, bzw. waagrechte Position kann ich auch durch Addieren der entsprechenden fixen Zeichen ermitteln und mit einem kleineren proportionalen Font relativ gute Ergebnisse erzielen. Ansonten empfiehlt sich eben über ein Report-Generator zu drucken oder z.B. Word-Vorlagen verwenden.
Grüsse, Armin
-
- Cut&Paste-Entwickler
- Beiträge: 28
- Registriert: Mi, 01. Aug 2007 15:53
- Wohnort: Bärlin
Erstmal großes Danke für die Tipps !
Hallo Ohr,
Die Tabulatoren funktionieren nur bei Proportionalschrift,oder sehe ich das falsch ? (sonst gibts wieder Ziffern Tutti Frutti)
An Armin :
Wenn Du alle Listen in Dateien druckst musst Du doch Pproportionalschrift
verwenden , oder ?
To @all
Wie druckt man in eine Datei wenn man den PresentationSpace verwendet
? (Grastringat) Ich lese nur was von metadatei. Würde gerne
eine lange Tabelle (mehrere Seiten) mit einem optional wählbaren Fonds (z. Bsp Times New Roman) in eine .txt Datei (d.h. von Word lesbar) übertragen, ohne daß die Schrift verrutscht (Tabulatoren sind gut, nur die kann man im Grafikmodus wohl nicht so gut einsetzen) und man den ganzen Käse mühsam neu formatieren muss.
Thanks, und immer tippen
PS. Meine altes Programm ist gut, nur die ? machen im neuen
System Stress, ich kann aus der erstellten Textdatei nur Porportionalschrift
drucken.
Die Tabulatoren funktionieren nur bei Proportionalschrift,oder sehe ich das falsch ? (sonst gibts wieder Ziffern Tutti Frutti)
An Armin :
Wenn Du alle Listen in Dateien druckst musst Du doch Pproportionalschrift
verwenden , oder ?
To @all
Wie druckt man in eine Datei wenn man den PresentationSpace verwendet
? (Grastringat) Ich lese nur was von metadatei. Würde gerne
eine lange Tabelle (mehrere Seiten) mit einem optional wählbaren Fonds (z. Bsp Times New Roman) in eine .txt Datei (d.h. von Word lesbar) übertragen, ohne daß die Schrift verrutscht (Tabulatoren sind gut, nur die kann man im Grafikmodus wohl nicht so gut einsetzen) und man den ganzen Käse mühsam neu formatieren muss.
Thanks, und immer tippen
PS. Meine altes Programm ist gut, nur die ? machen im neuen
System Stress, ich kann aus der erstellten Textdatei nur Porportionalschrift
drucken.
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Hallo SPP,
drucken mußt du mit GraStringAT - dies verwende ich, wenn ich Etiketten drucken muß, da hier Barcodes enthalten sind. Meine Listen drucke ich mittels RTF-Vorlage. Hierin dürfen die user die Schriftart + größe bearbeiten. Den Ausdruck der RTF-Datei mache ich dann mit Word über die axtive-x Komponente.
drucken mußt du mit GraStringAT - dies verwende ich, wenn ich Etiketten drucken muß, da hier Barcodes enthalten sind. Meine Listen drucke ich mittels RTF-Vorlage. Hierin dürfen die user die Schriftart + größe bearbeiten. Den Ausdruck der RTF-Datei mache ich dann mit Word über die axtive-x Komponente.
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Spalten nicht bündig, weil Druckzeichen verrutscht
Hallo Jimmy,AUGE_OHR hat geschrieben:hi,zu Spalten drucken eignet sich so ein zusammen gesetzter String nur mitSnoop_Proggy_Prog hat geschrieben: str(xy)+space(2)+Str(ab)+space usw.
proprotional Fonts
genau umgekehrt. Proportional ist ein Font, der jedem Zeichen nur den Platz einräumt, den es wirklich braucht. Ein I also kleiner als ein M ist. Mit solchen Fonts kann ein Ausdruck in Spalten nicht mit TAB(xx) realisiert werden. FIXED FONTS sind die die man für sowas benutzen kann, falls der Drucker diese noch beherrscht. Es gab zwar Drucker denen man Tabulatorpositionen auf x/254 inch festelegen konnte und dann mit chr(9) gesprungen ist, das ist aber eher ungewöhnlich und wird heute wohl nicht mehr unterstützt. Alle TAB(x) ausgaben von Programmiersprachen senden nur mehrere Blanks, das passt aber nur bei Fixed Fonts (gleiche Breite).
Auch PCL Drucker (als Seitendrucker) konnten sowas bestimmt, aber die mit ? zu programmieren ist mehr als veraltet.
Um den alten code kaum ändern zu müssen muss man auf dem Drucker ausprobieren, ob er überhaupt mit ? gesendete Druckausgaben übernimmt. Danach muß man ermitteln wie man auf einen FIXED FONT umstellt - eventuell kann man das ja auch im Druckermenü. Wenn das funktioniert müsste das Drucken wie zu Clipperzeiten auch gehen. Mit allen Nachteilen die das hat.
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
hier ist ein verkürztes Beispiel wie man mit meiner Druckerklasse ohne Druckdialog auf den Standarddrucker Adressetiketten druckt. Das dürfte recht ähnlich zu der Liste von Artikeln sein, wobei die Spalten Zeilen Berechnung angepasst werden müsste (eine Liste ist einfacher )
Code: Alles auswählen
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"
#define DBF_Name 1
#define DBF_Street 2
#define DBF_PLZ 3 // Postal code - I don't know the english word
#define DBF_Town 4
#define DBF_State 5
procedure main
local oHBPrinter
local x,nSeite,nSpalte,nBox,nZeile,nBox1X,nBoxToNext_X,nBoxToNext_Y,nBoxPerLine,nBoxPerCol
* Programm simuliert den Ausdruck von Adressetiketten.
* Statt einer DBF wird jedoch eine Funktion verwendet, welches Testdaten enthält.
* Gedacht sind 2 Seiten je 14 Adressen in 7 Zeilen und 2 Spalten.
* Ausdruck kann sowohl mit als auch ohne GUI durchgeführt werden
oHBPrinter := HBPrinter():New():create()
// nötige Fonts einmal laden
oHBPrinter:addFont("10.Arial") // mehrere wären möglich
nBox1X := 200 // 20 mm
nBoxToNext_X := 1000 // 100 mm
nBoxToNext_Y := 380 // 38 mm
nBoxPerLine := 2 // 2 Labels per Line
nBoxPerCol := 7 // 7 Labels per Col
x := 1 // counter -> recno()
nSeite := 1 // page
nSpalte := 0 // colume 0 -> 1
nBox := 0 // Adressfield per col
// aktuellen Font auswählen
oHBPrinter:setFont(1)
oHBPrinter:nFirstLine := 150 // erste Druckzeile Basislinie auf 1,5 cm von Oben
oHBPrinter:startDoc("Adressliste") // manche Drucke zeigen den Text an ;-)
do while .t. // ! eof () ?
* Filterbedingungen ?
* Eine Adresse drucken, wir wissen, dass diese auf die Seite passt !
nZeile := oHBPrinter:nFirstLine + oHBPrinter:linefeed() + ; // erste Druckzeile des Labels
nBox * nBoxToNext_Y
oHBPrinter:PrintText( nBox1X + nSpalte * nBoxToNext_X , ; // x Value
nZeile , ; // y Value
AdressDBF(x,DBF_Name) )
nZeile += oHBPrinter:linefeed()
oHBPrinter:PrintText( nBox1X + nSpalte * nBoxToNext_X , ; // x Value
nZeile , ; // y Value
AdressDBF(x,DBF_Street) )
nZeile += oHBPrinter:linefeed()
oHBPrinter:PrintText( nBox1X + nSpalte * nBoxToNext_X , ; // x Value
nZeile , ; // y Value
AdressDBF(x,DBF_PLZ) + " " +;
AdressDBF(x,DBF_Town) )
nZeile += oHBPrinter:linefeed(2)
oHBPrinter:PrintText( nBox1X + nSpalte * nBoxToNext_X , ; // x Value
nZeile , ; // y Value
AdressDBF(x,DBF_State) )
x++
if x > 28 // END ?
exit
endif
* whats the next
nSpalte++
if nSpalte >= nBoxPerLine // 0 and 1 is ok but 2 is next boxline
nSpalte := 0
nBox++
endif
if nBox >= nBoxPerCol // 0 to 6 is ok but 7 is next page
nSpalte := 0
nBox := 0
oHBPrinter:PrintText( 1050,100,"- "+ntrim(nSeite)+" -","C" ) // centered
nSeite++
oHBPrinter:newPage()
endif
enddo
oHBPrinter:EndDoc()
endcase
return
*---------------------------------------------------------------------------
function AdressDBF(nRecNo,nField)
local cValue
do case
case nField = DBF_Name
cValue := "Name " + ntrim(nRecNo)
case nField = DBF_Street
cValue := "Street " + ntrim(nRecNo)
case nField = DBF_PLZ
cValue := "PLZ" + ntrim(nRecNo)
case nField = DBF_Town
cValue := "Town " + ntrim(nRecNo)
case nField = DBF_State
cValue := "State " + ntrim(nRecNo)
endcase
return cValue
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Ok wenn ich schon dabei bin, das Beispiel kurz abgewandelt (ohne kompilertest ) für eine Liste... hier mit festgelegter Zeilenanzahl. Man kann natürlich auch einen gewissen Rand einhalten z.B. bei flexibler Zeilenzahl, dann fragt man die mm Position ab. Für Fortlaufende Kopf und Fußzeilen nutzt man die dazugehörigen Methoden, aber ich wollte das Beispiel hier einfach halten:
Code: Alles auswählen
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"
procedure main
local oHBPrinter
local nSeite,nZeile,nPosY, nMaxZeile
* DBF öffnen etc. ...
oHBPrinter := HBPrinter():New():create()
// nötige Fonts einmal laden
oHBPrinter:addFont("10.Arial") // mehrere wären möglich
nSeite := 1 // page
nZeile := 1 // hier Zeilennummer, nicht Druckposition !
nMaxZeile := 60 // maximale Zeilennummer, Druckposition wäre auch möglich
// aktuellen Font auswählen
oHBPrinter:setFont(1)
oHBPrinter:nFirstLine := 150 // erste Druckzeile Basislinie auf 1,5 cm von Oben
oHBPrinter:startDoc("Adressliste") // manche Drucke zeigen den Text an ;-)
do while ! eof()
* Filterbedingungen ?
if nZeile > nMaxZeile // Neue Seite nötig
nZeile := 1
nPosY := 200 // 2 CM oberer Rand
nSeite++
oHBPrinter:newPage()
// hier könnten Druckausgaben wie Seitennummer stehen etc...
// oder z.B. auch ein LOGO ...
// oHBPrinter:PrintBmp(2000,300,,,cLogoName)
else
nZeile++
nPosY += oHBPrinter:linefeed()
endif
oHBPrinter:PrintText( 200, nPosY, field->name ) // linksbündig bei 2cm
oHBPrinter:PrintText( 600, nPosY, transform(field->anzahl,"9,999"),"R") // rechtsbündig bei 6cm
...
enddo
oHBPrinter:EndDoc()
endcase
return
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Spalten nicht bündig, weil Druckzeichen verrutscht
hi,
unabhängig ob nun per GUI oder VIO druckt.
gruss by OHR
Jimmy
ja klar ... habe das verdreht.brandelh hat geschrieben: genau umgekehrt. Proportional ist ein Font, der jedem Zeichen nur den Platz einräumt, den es wirklich braucht. Ein I also kleiner als ein M ist.
das setzten von eigenen Tabulatoren hat nicht mit einem Font zu tunSnoop_Proggy_Prog hat geschrieben: Die Tabulatoren funktionieren nur bei Proportionalschrift,oder sehe ich das falsch
unabhängig ob nun per GUI oder VIO druckt.
gruss by OHR
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hi Jimmy,
erkläre doch mal genauer was du unter 'eigenen Tabulatoren' meinst.
Alle TAB() Befehle von Programmiersprachen die ich kenne nutzen lediglich eine gewisse Anzahl von Blanks um zu formatieren.
MS Word oder andere Textsysteme machen das natürlich über interne Routinen auf genaue cm/mm/inch Positionen, das ist aber nicht das Gleiche.
erkläre doch mal genauer was du unter 'eigenen Tabulatoren' meinst.
Alle TAB() Befehle von Programmiersprachen die ich kenne nutzen lediglich eine gewisse Anzahl von Blanks um zu formatieren.
MS Word oder andere Textsysteme machen das natürlich über interne Routinen auf genaue cm/mm/inch Positionen, das ist aber nicht das Gleiche.
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
hi,
für die Positionen in der x-Achse. Dies gilt ja im Prinzip so auch schon
bei Cl*pper das man bei "formatierungen" (=TAB) besser den String
zerlegt und einzeln auf den Positionen ausdruckt.
Der Rest ist mehr für "Snoop_Proggy_Prog"
das ist zwar mehr Code aber damit hab ich den Code auch schon für
Xbase++ GUI Druck vorbereitet der ja so aussieht
Damit ändert sich bei der migrierung das "Format" nicht und man muss
"nur" noch die neuen Positionen angeben.
Der grösste Unterschied bei GUI sind ja die Koordinaten. Beim drucken
mit GraStringAt() wird oben links mit dem "maximal Wert" (DIN A4=2540)
anfangen und nach "unten kleiner" wird... aber so ist M$ Windows eben.
a.) Es gibt einen "Nur Text" Drucker
b.) Es gibt PDF Drucker Treiber
c.) Der Inhalt eines Presentationspace kann als ganzes in einer Metadatei
abgespeichert werden.
benutzt werden.
Und nun der Vorteil des PresSpace :
du kannst es ja auf verschiedene Device anwenden. Schau dir mal das
Sample :
C:\ALASKA\XPPW32\SOURCE\samples\solution\Preview\Preview.prg
an. Da wird der PresSpace zunächst als Preview angezeigt und man
kann ihn dann zum Drucker schicken.
gruss by OHR
Jimmy
eigendlich meine ich damit nur die verwendung einer variabel oder sobrandelh hat geschrieben: erkläre doch mal genauer was du unter 'eigenen Tabulatoren' meinst.
für die Positionen in der x-Achse. Dies gilt ja im Prinzip so auch schon
bei Cl*pper das man bei "formatierungen" (=TAB) besser den String
zerlegt und einzeln auf den Positionen ausdruckt.
Der Rest ist mehr für "Snoop_Proggy_Prog"
Code: Alles auswählen
statt :
@line, 0 SAY a+" "+b+" "+c
besser :
#define TAB1 20
#define TAB1 40
#define TAB1 50
//
// line = Y Achse
// TAB = X Achse
//
@line, TAB1 SAY a
@line, TAB2 SAY b
@line, TAB3 SAY c
Xbase++ GUI Druck vorbereitet der ja so aussieht
Code: Alles auswählen
//
// Erst nX Achse
// dann nY Achse
//
// "TAB"s im Array aPosi
//
GraStringAt(oPrinter, { nX+aposi[1] ,nY }, a )
GraStringAt(oPrinter, { nX+aposi[2] ,nY }, b )
GraStringAt(oPrinter, { nX+aposi[3] ,nY }, c )
"nur" noch die neuen Positionen angeben.
Der grösste Unterschied bei GUI sind ja die Koordinaten. Beim drucken
mit GraStringAt() wird oben links mit dem "maximal Wert" (DIN A4=2540)
anfangen und nach "unten kleiner" wird... aber so ist M$ Windows eben.
Antwort : Nicht in Cl*pper denken sondern in M$ Windows !Snoop_Proggy_Prog hat geschrieben: Wie druckt man in eine Datei wenn man den PresentationSpace verwendet
a.) Es gibt einen "Nur Text" Drucker
b.) Es gibt PDF Drucker Treiber
c.) Der Inhalt eines Presentationspace kann als ganzes in einer Metadatei
abgespeichert werden.
"?" (VIO) und "Gra()" (GUI) kann nicht auf dem selben Device gleichzeitigSnoop_Proggy_Prog hat geschrieben: ? (Grastringat)
benutzt werden.
Und nun der Vorteil des PresSpace :
du kannst es ja auf verschiedene Device anwenden. Schau dir mal das
Sample :
C:\ALASKA\XPPW32\SOURCE\samples\solution\Preview\Preview.prg
an. Da wird der PresSpace zunächst als Preview angezeigt und man
kann ihn dann zum Drucker schicken.
gruss by OHR
Jimmy