Seite 1 von 1

Drucken von ganzen Seiten

Verfasst: Mi, 10. Jan 2007 9:43
von Manfred
Hi,

nachdem ich nun ein paar Erfahrungen in Sachen Drucken gemacht habe, stehe ich nun wieder vor einem Problem:

Wie baut man eigentlich eine komplette Seite zusammen, die dann grafisch gedruckt werden soll? Ich habe mir einmal die Routine von Hubert angesehen, muß aber sagen dass ich nicht so ganz verstehe, was ich damit anfangen kann.

Gebaut werden muß ein Rechnungsausdruck, mit Kopf, Fuß usw. Fängt man da mit dem Formdesigner an, baut sich etwas auf und bohrt dann auf, oder macht man alles schrittweise Zeile für Zeile?

Habe ich irgendwelche Beispiele dsbzgl. übersehen, oder kann mir jemand welche nennen?

Verfasst: Mi, 10. Jan 2007 9:47
von Martin Altmann
Hallo Manfred,
wenn Du GUI machst, bleibt Dir das überlassen.
Mit GraStringAt() kannst Du ja beliebig positionieren - ob Du nun erst Header und Footer machst und dann den Text oder umgekehrt oder durcheinander - völlig egal! Hauptsache es ist alles drauf, bevor Du druckst :D

Viele Grüße,
Martin

Verfasst: Mi, 10. Jan 2007 9:59
von brandelh
Hallo Manfred,

zuerst solltest du entscheiden welcher Weg für dich richtig ist:

1. Das Programm druckt die ganze Seite ohne Fremdprodukte, der Anwender soll nichts ändern können.
2. Reportgenerator nutzen, du 'malst' die Vorgaben, das Programm druckt damit.
3. Der Anwender soll Dokumente als Vorlage mit Platzhalter erstellen können, die dann von der Anwendung gefüllt, gedruckt und/oder gespeichert werden.

zu 1.) sieh dir meine Druckerklasse nochmal an (test.prg) ;-)
Beim Xbase++ Druck (und dazu zählt auch meine Druckerklasse, nur das diese vieles vereinfacht) wird zuerst ein Druckerobject im Programm erzeugt und mit startdoc() die Druckausgabe eröffnet. Dann wird mit Gra-Funktionen oder meinen Methoden alles auf die Seite geschrieben was drauf soll. Die Reihenfolge ist dabei völlig gleichgültig. Wenn die Seite voll ist, und weitere kommen sollen, ruft man newPage() auf, ansonsten enddoc(). Nach Enddoc() druckt der Windowsspooler ...
Meine Druckerklasse bietet neben einer Druckerauswahl mit Vorschau (wenn man das will) auch Vereinfachungen beim Ausrichten oder beim mehrzeiligen Ausdruck.

zu 2.)
gibt es verschiedene Vorlieben, List&Label wird glaube von TOM bevorzugt. Die aktuellen Versionen haben Möglichkeiten eingebaut, die weit über das hinausgehen, was man selbst einbauen kann (PDF Erzeugung, Barcode, Grafiken etc.), wenn man sie beherrscht ... und sie kosten natürlich Geld.

zu 3.)
gibt es die ActiveX Steuerelemente. OpenOffice und MS Word können genutzt werden. Beispiele finden sich hier und in den Beispielen von Alaska. Aber man braucht die 1.90ff.

Verfasst: Mi, 10. Jan 2007 10:08
von Manfred
Hi Hubert, Hi Martin,

es soll GUI werden, das ist schonmal sicher.

Die Ausdrucke werden komplett von mir vorgegeben, sind also nicht beeinflussbar. (Bis ich mehr kann)

Ich möchte auch direkt am Anfang kapieren, was ich da mache und warum. Das habe ich ja bei GraSetFont() gesehen. Bedingt durch die Fragerei, bin ich doch einen großen Schritt weitergekommen, den ich mit fertigen Tools wohl so nicht geschafft hätte.

Na gut, dann werde ich nochmals versuchen mit test.prg den Durchblick zu erlangen.

Verfasst: Mi, 10. Jan 2007 10:30
von brandelh
Hi Manfred,

am besten siehst du dir die Beispiel-EXEs an, um zu sehen was alles geht.

Wenn du den HBPrintDialog zur Druckerauswahl nutzen möchtest, dann musst du dir wie in test.prg (die anderen sind auch interessant) die Klasse ableiten und Print() sowie PrintKopf() mit den nötigen Werten versehen.
Wenn du dann den Printdialog aufrufst und dort Drucken wählst, wird gedruckt.

Wenn du keinen Auswahlbildschrim möchtest, kannst du auch - eventuell am Anfang einfacher - alles per Hand nacheinander machen ...
in TESTLIST.PRG sind die 3 möglichen Anwendungen meiner Druckerklasse aufgezeigt, um z.B. Adressetiketten zu drucken.

cStart="1" mit Druckerauswahldialog
cStart="2" PrintKopf() und Print() wurden definiert, und direkt aufgerufen. (hier nur Print())
cStart="3" Dies entspricht dem Vorgehen eines Clipper Programmierers

Wenn du meine Druckerklasse nicht nutzt, wirst du immer von unten messen müssen und die Hardware Ränder des Druckers sind nie gleich. Die GraStringAt() Funktion kann nur linksbündig drucken und nur eine Zeile. So wird z.B. schon die saubere Darstellung von Zahlen untereinander zur Herausforderung, solange man nicht das hässliche courier nutzt. Deshalb habe ich ja die HBPrinter-Klasse geschrieben, um das Leben (Drucken) einfacher zu machen ;-)
Die Ausdrucke werden komplett von mir vorgegeben, sind also nicht beeinflussbar. (Bis ich mehr kann)
das ist eher eine Frage des Bedarfs als des Könnens, die anderen Möglichkeiten sind kaum schwerer - falls überhaupt.
Wenn die Druckausgabe nachträglich geändert werden soll oder muss, dann muss man DOC-Dokumente erzeugen (AktiveX) und kann mit der Druckerklasse nichts anfangen. Sollen aber Ausdrucke nicht manipulierbar sein, schließt sich die DOC Verwendung aus.

Verfasst: Mi, 10. Jan 2007 10:47
von AUGE_OHR
hi,
brandelh hat geschrieben: Die GraStringAt() Funktion kann nur linksbündig drucken und nur eine Zeile. So wird z.B. schon die saubere Darstellung von Zahlen untereinander zur Herausforderung,

Code: Alles auswählen

   aAttr[GRA_AS_HORIZALIGN] :=   GRA_HALIGN_LEFT
   graSetAttrString(oPrinter, aAttr)
   GraStringAt( oPrinter, {acposi[1],nY}, "hier links")
...
   aAttr[GRA_AS_HORIZALIGN] :=   GRA_HALIGN_CENTER
   graSetAttrString(oPrinter, aAttr)
   GraStringAt( oPrinter, {acposi[1]+100,nY}, "hier center"    )
...
   aAttr[GRA_AS_HORIZALIGN] :=   GRA_HALIGN_RIGHT
   graSetAttrString(oPrinter, aAttr)
   GraStringAt( oPrinter, {acposi[1]+200,nY}, "hier rechts"    )
gruss by OHR
Jimmy

Drucken

Verfasst: Mi, 10. Jan 2007 10:51
von Rolf Ramacher
Hi Manfred,

also bei Listen habe ich es bisher so gemacht, eine RTF-Datei mit Word, als Vorlage erstellt. Dann werden die Variablen entsprechend mit strtran ersetzt. Hier brauche ich mich nicht um Kopf/Fußzeile und nächste Seite
zu kümmern. Auch wie die Auflistung beim Drucken Seite x von gesamt y

Dann wird das Ergebnis als RTF-Datei gespeichert und Word-gestartet.
Hier kann der Anwender dann eingreifen und auch in der Vorlage die entsprechenden Schriftarten wie er sie gerne hätte definieren.

Beim ausdruck von Etiketten darf ich dies nicht machen. Hier gibt es keine Kopf/Fußzeile - und Barcode kommt dazu. Hierbei habe ich dann
dies gemacht mit GraStringAt. Vorher kann ich auch mit GraSetFont die entsprechenden Schriftgrößen,Bold(Fett) definieren.

Verfasst: Mi, 10. Jan 2007 11:00
von brandelh
Hi Jimmy,

schön dass man jetzt mit GraSetAttrString die Ausrichtung setzen kann (entweder das gab es früher nicht, oder ich hatte es nur übersehen). Richtig ist aber, dass die Funktion selbst es nicht kann !

So geht es einfacher:
// oHBP:PrintText( nPosX, nPosY, cTxt, cAusrichtung, nMaxLen, cArt, nFarbe, nDrehen )
oHBP:PrintText( 100,100,cTxt) -> Standard ist Linksbündig
oHBP:PrintText( 100,100,cTxt,"C") -> Zentrieren
oHBP:PrintText( 100,100,cTxt,"R") -> Rechtsbündig
oHBP:PrintText( 100,100,cTxt,"B",1500) -> Blocksatz auf 15cm Druckbreite

Verfasst: Mi, 10. Jan 2007 11:06
von Manfred
Hi Hubert,
// oHBP:PrintText( nPosX, nPosY, cTxt, cAusrichtung, nMaxLen, cArt, nFarbe, nDrehen )
oHBP:PrintText( 100,100,cTxt) -> Standard ist Linksbündig
oHBP:PrintText( 100,100,cTxt,"C") -> Zentrieren
oHBP:PrintText( 100,100,cTxt,"R") -> Rechtsbündig
oHBP:PrintText( 100,100,cTxt,"B",1500) -> Blocksatz auf 15cm Druckbreite
danke für diese Zeilen, ich muß es immer etwas blumiger vor mir haben, bevor ich es kapiere. Jetzt weiß ich schon etwas mehr, wie Deine Klasse klappen soll.

Verfasst: Mi, 10. Jan 2007 12:18
von brandelh
Hallo Manfred,

dann halt ein blumiges Beispiel ;-)

Code: Alles auswählen

oHBPrinter := HBPrinter():New():create() // Druckerobject erzeugen
oHBPrinter:addFont("10.Arial")   // Alle nötigen Fonts hier erzeugen
oHBPrinter:setFont(1)    // 1. definierter Font auswählen (es gibt hier nur einen)
oHBPrinter:startDoc("Blumen Testdruck")  // optionaler Name des Druckjobs
nZeile := 200 // 20mm von oberer Blattkante (nicht Druckerbereich)
for x := 1 to 10
      oHBPrinter:PrintText( nLinkerRand, nZeile, "Hallo Blume"+str(nZeile,3) )
      nZeile += oHBPrinter:linefeed() // Zeilenvorschub abhängig von Schriftart oder einfach z.B. 50 (5mm)
next
oHBPrinter:EndDoc()