Spalten nicht bündig, weil Druckzeichen verrutscht

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

Snoop_Proggy_Prog
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Mi, 01. Aug 2007 15:53
Wohnort: Bärlin

Spalten nicht bündig, weil Druckzeichen verrutscht

Beitrag von Snoop_Proggy_Prog »

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
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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 ;-)
Gruß
Hubert
Snoop_Proggy_Prog
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Mi, 01. Aug 2007 15:53
Wohnort: Bärlin

Erstmal vielen Dank für Eure Tipps

Beitrag von Snoop_Proggy_Prog »

ich werde die Tipps heute abend in Ruhe analysieren (Die Leiterbahnen zur Rübe sind etwas länger als bei anderen) :idea:
Falls noch jemand diesbezüglich ein Kaninchen im Hut hat :
Abrakadabra...
Snoop_Proggy_Prog
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Mi, 01. Aug 2007 15:53
Wohnort: Bärlin

Ich bekomme die Fehlermeldung 1025 vom xbase compiler

Beitrag von Snoop_Proggy_Prog »

Parameter not found.
Welche Dateien muss man einbinden ?
Kannste mal ein lauffähiges Beispiel hier einstellen ?
Snoop_Proggy_Prog
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Mi, 01. Aug 2007 15:53
Wohnort: Bärlin

Ok jetzt hats gefunzt

Beitrag von Snoop_Proggy_Prog »

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 ?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

zum Drucken kann man jeden TrueType Font nutzen, wir leben schließlich unter Windows GUI ;-)

Als Beispiel kann ich

?:\XPPW32\SOURCE\samples\basics\FONT\FONTDB.PRG empfehlen

Dort werden die Schriften zwar auf einem Fenster ausgegeben, das macht aber keinen großen Unterschied.
Gruß
Hubert
Snoop_Proggy_Prog
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Mi, 01. Aug 2007 15:53
Wohnort: Bärlin

Ich würde gern ein Auswahlmenu kreieren

Beitrag von Snoop_Proggy_Prog »

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)
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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 :!:
Gruß
Hubert
Snoop_Proggy_Prog
Cut&Paste-Entwickler
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

Beitrag von Snoop_Proggy_Prog »

Mein Problem sind nun die vielen ? im Quellcode.
Gibt es denn irgendein Konvertier-Utility ?
Snoop_Proggy_Prog
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Mi, 01. Aug 2007 15:53
Wohnort: Bärlin

Wie kann ich die Ausgabe in eine Druckdatei

Beitrag von Snoop_Proggy_Prog »

umleiten ?
Mit set printer to blabla dürfte das ja nicht klappen.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Moin,
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
Viele Grüße,
Martin
:grommit:
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.
Snoop_Proggy_Prog
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Mi, 01. Aug 2007 15:53
Wohnort: Bärlin

Auch mit Grastringat() ?

Beitrag von Snoop_Proggy_Prog »

Präesntationsall an Drucker Device leiten überflüssig ?
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

hi,
Snoop_Proggy_Prog hat geschrieben: str(xy)+space(2)+Str(ab)+space usw.
zu Spalten drucken eignet sich so ein zusammen gesetzter String nur mit
proprotional Fonts, deshalb mein Vorschlag
Snoop_Proggy_Prog hat geschrieben: Gibts praktische Vorschläge ?
du zerlegst den String erstmal in seine Bestandteile
Snoop_Proggy_Prog hat geschrieben: Kann man Tabulatoren setzen ?
nun kann du am Anfang des Moduls per #define eigene Tabulator Werte
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
gruss by OHR
Jimmy
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 393
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Armin »

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
Snoop_Proggy_Prog
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 28
Registriert: Mi, 01. Aug 2007 15:53
Wohnort: Bärlin

Erstmal großes Danke für die Tipps !

Beitrag von Snoop_Proggy_Prog »

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.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

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.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

AUGE_OHR hat geschrieben:hi,
Snoop_Proggy_Prog hat geschrieben: str(xy)+space(2)+Str(ab)+space usw.
zu Spalten drucken eignet sich so ein zusammen gesetzter String nur mit
proprotional Fonts
Hallo Jimmy,

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

hi,
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.
ja klar ... habe das verdreht.
Snoop_Proggy_Prog hat geschrieben: Die Tabulatoren funktionieren nur bei Proportionalschrift,oder sehe ich das falsch
das setzten von eigenen Tabulatoren hat nicht mit einem Font zu tun
unabhängig ob nun per GUI oder VIO druckt.

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: erkläre doch mal genauer was du unter 'eigenen Tabulatoren' meinst.
eigendlich meine ich damit nur die verwendung einer variabel oder so
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
das ist zwar mehr Code aber damit hab ich den Code auch schon für
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 )
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.
Snoop_Proggy_Prog hat geschrieben: Wie druckt man in eine Datei wenn man den PresentationSpace verwendet
Antwort : Nicht in Cl*pper denken sondern in M$ Windows !
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.
Snoop_Proggy_Prog hat geschrieben: ? (Grastringat)
"?" (VIO) und "Gra()" (GUI) kann nicht auf dem selben Device gleichzeitig
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
Antworten