Drucken von ganzen Seiten
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Drucken von ganzen Seiten
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?
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?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16508
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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
Viele Grüße,
Martin
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
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: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
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.
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.
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
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.
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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
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
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.
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
das ist eher eine Frage des Bedarfs als des Könnens, die anderen Möglichkeiten sind kaum schwerer - falls überhaupt.Die Ausdrucke werden komplett von mir vorgegeben, sind also nicht beeinflussbar. (Bis ich mehr kann)
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.
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,
gruss by OHR
Jimmy
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" )
Jimmy
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
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.
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.
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
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:
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
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Hubert,
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.// 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
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Manfred,
dann halt ein blumiges Beispiel
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()
Gruß
Hubert
Hubert