Drucken von ganzen Seiten

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
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

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

Beitrag 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
: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: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

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

Beitrag 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.
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: 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
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:

Drucken

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

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag 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
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

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

Beitrag 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()
Gruß
Hubert
Antworten