Seite 1 von 1
Drucken mit XbpPrintDialog
Verfasst: Mo, 11. Dez 2006 11:27
von Rolf Ramacher
Hallo zusammen,
ich drucke über den Printdialog. funktioniert auch soweit. 2 Punkte habe ich hierbei.
1. kann ich vordefinieren das automatisch auf Landscape gedruckt wird ?
oder geht das beim Dialog nicht- wo der Anwender den Drucker auswählt?
setorientation() ? oder geht dies nur bei xpbprinter
2. Bei der Übergabe des Druckjobs kann die zu druckende Seitenzahl von bis nicht eingestellt werden ? Geht das auch nicht? weiß das einer ?
Verfasst: Mo, 11. Dez 2006 12:56
von brandelh
Hi,
der Printdialog hängt stark von den Konfigurationsvariablen :enable... und :mode ab; sowie von der Xbase++ Version. Ich habe in 1.90 nachgesehen.
zu 1. je nach Drucker und Einstellungen sieht der Printdialog sehr unterschiedlich aus.
Aber eine Auswahl für Querdruck müssten alle anbieten. Mit dem Beispiel aus dem Handbuch zu
XbpPrinterDialog() gelang mir sofort die Auswahl der Druckorientierung.
Oder meintest du die Vorbelegung dieses Wertes ?
Da scheint es nichts zu geben, aber wenn du weißt, dass du das brauchst,
stelle es doch einfach im XbpPrinter-Objekt um, bevor du druckst.
Man muss diese Einstellungen allerdings vor der Zuordnung zum Presentationspace vornehmen. Einzelne Seiten kann man auch dazwischen umschalten, siehe hierzu die Hinweise zu :endPage().
zu 2. sieh mal nach XbpPrinterdialog():pageRange
ob dass das Programm aber selbst beachten muss weiß ich nicht.
In meiner Druckerklasse habe ich das intern geregelt, indem ich nicht gewünschte Seiten überspringe. Allerdings kann XbpPrintDialog auch nur einen Bereich, ich lasse bei mir eine Kombination von Bereichen und Seiten zu.
Verfasst: Mo, 11. Dez 2006 15:07
von AUGE_OHR
hi,
Zu deinen Fragen muss ich erst vorweg einen Kommentar abgeben :
Das Sample von Alaska zu XbpPrinter ist unvollständig was "PrinterPS"
angeht. Dort werden alle "vor Einstellungen" vorgenommen.
Es geht da vorallem um "oDC:Create( cPrinterObjectName )" was nicht
immer gehen muss und nicht abgefangen wird !
falsch :
Code: Alles auswählen
FUNCTION PrinterPS( cPrinterObjectName )
LOCAL oPS, oDC := XbpPrinter():New()
...
oDC:Create( cPrinterObjectName )
// keine Prüfung ob "create"d wurde !!!
oPS := XbpPresSpace():New()
richtig :
Code: Alles auswählen
FUNCTION PRINTERPS( cPrinter, nCopies ,nPaperBin,nOrient,lShow)
LOCAL oDC := XbpPrinter():New()
LOCAL oPS
....
DEFAULT nCopies TO 1
DEFAULT nPaperbin TO XBPPRN_PAPERBIN_AUTO
DEFAULT nOrient TO XBPPRN_ORIENT_PORTRAIT
DEFAULT lShow TO .F.
BEGIN SEQUENCE
IF cPrinter != NIL // if NIL use Windows default?
cPrinter := TRIM(cPrinter)
ENDIF
// Hier testen ob "create"d wurde
IF oDC:Create( cPrinter ) == oDC // = self
ELSE
MsgBox( "! Drucker ist Offline !" )
BREAK // raus
ENDIF
// Printer Status abfragen
nStatus := oDC:PrinterStatus()
DO CASE
CASE nStatus == 1
...
1. kann ich vordefinieren das automatisch auf Landscape gedruckt wird ?
ja, nach der "Status" Abfrage kommt dann :
Code: Alles auswählen
ENDCASE nStatus
oDC:setPaperBin(nPaperBin) // welche Kasette
oDC:setNumCopies(nCopies) // Anzahl Kopien
oDC:setOrientation(nOrient) // hoch oder quer
oDC:configure()
// Wenn man einen XbpPrintDialog() haben möchte
IF lShow
oDlg := XbpPrintDialog():new(oDraw)
oDlg:enablePrintToFile := .F.
oDlg:printToFile := .F.
oDlg:enableNumCopies := .T.
oDlg:numCopies := nCopies
oDlg:create()
oPrinter := oDlg:display(oDC) // <<< here use oDC !
oDlg:destroy()
ENDIF
oPS := XbpPresSpace():New()
oPS:Create( )
oPS:configure( oDC, oDC:paperSize(), GRA_PU_LOMETRIC )
RECOVER
oPs := NIL
END
RETURN oPS
oder geht das beim Dialog nicht- wo der Anwender den Drucker auswählt? setorientation() ? oder geht dies nur bei xpbprinter
Wie willst du es ohne XbpPrinter machen ? Du brachst erst den "oDC" !!!
2. Bei der Übergabe des Druckjobs kann die zu druckende Seitenzahl von bis nicht eingestellt werden ? Geht das auch nicht? weiß das einer ?
Wie schon Hubert erwähnte die ":Range" Methode benutzen.
Wenn du es beim "create" vorgibst dann dort wo auch die Anzahl der
"Kopien" eingestellt wird.
gruss by OHR
Jimmy
Drucken
Verfasst: Di, 12. Dez 2006 12:23
von Rolf Ramacher
Hi Jimmy,
vielen Dank für deine Antwort.
agerRange hat funkt. Nur mit dem Landscape habe ich Probleme. Ich kriege eine Runtime-Fehlermeldung
das er setOrientation nicht kennt.
In deinem Beispiel was ist nOrient für eine Variable. Numrerisch.?
Beinhaltet nOrient den Wert wie dieser in xbpdev.ch beschrieben ist ?
Landscape mit 2 ?
Verfasst: Di, 12. Dez 2006 13:51
von brandelh
Hallo Rolf,
ich bin zwar nicht Jimmy, aber ich sende dir mal des leicht abgeänderte Beispiel aus der 1.90 Onlinehilfe.
Dieses funktioniert bei mir einwandfrei.
Wichtig dabei ist,
1. dass man prüft, ob der XbpPrinter <> NIL (abbruch etc.) ist,
2. dass Xbase++ nicht zu alt ist (am Anfang gab es Probleme) und
3. dass man :setOrientation(XBPPRN_ORIENT_LANDSCAPE)
auf ein gültiges XbpPrinter-Object losläßt, welches noch nicht
dem Presentationspace zugeordnet wurde.
Der Parameter entspricht dem aus der XBPDEV.CH, aber man sollte nie die direkten Werte, sondern immer die Platzhalter verwenden, auch wenn die Gefahr einer Änderung eher gering ist.
Die Fehlermeldung 'Methode nicht vorhanden'... läßt nur den Schluss zu, dass das Printerobject nicht richtig erzeugt wurde. Nach oP:create() falls man keinen oDlG:display() benutzt. Eventuell lag ja auch ein Druckerfehler vor !
Code: Alles auswählen
// Konfiguration eines Druckjobs
// Das Beispiel demonstriert die verschiedenen Schritte,
// die für die Konfiguration eines Druckjobs erforderlich sind.
#include "Gra.ch"
#include "Xbp.ch"
#include "XBPDEV.CH"
#pragma Library( "XppUI2.lib" )
PROCEDURE Main
LOCAL oPrinter, oPS, oDlg, aSize
oDlg := XbpPrintDialog():new()
oDlg:create()
// Konfiguriertes Drucker Objekt erzeugen
oPrinter := oDlg:display()
oDlg:destroy()
IF oPrinter <> NIL // wichtig !!!
// VOR oPS:create() !!!
// XBPPRN_ORIENT_PORTRAIT Papier vertikal bedrucken
// XBPPRN_ORIENT_LANDSCAPE Papier horizontal bedrucken
oPrinter:setOrientation(XBPPRN_ORIENT_LANDSCAPE)
// Neuen Presentation-Space erzeugen
oPS := XbpPresSpace():new()
// Bedruckbarer Bereich auf dem Papier
aSize := oPrinter:paperSize()
aSize := { aSize[5] - aSize[3], ;
aSize[6] - aSize[4] }
oPS:create( oPrinter, aSize, GRA_PU_LOMETRIC )
// Kleiner Druckjob
oPrinter:startDoc()
GraStringAt( oPS, { 0, aSize[2]-50 }, "Hello World" )
oPrinter:endDoc()
// Aufräumen
oPrinter:destroy()
oPS:destroy()
ENDIF
RETURN
Drucken Landscape
Verfasst: Di, 12. Dez 2006 17:56
von Rolf Ramacher
Hi Hubert,
Danke nochmal für deinen Hinweis. Genauso habe ich es auch. Aber leider funkt. es nicht. Ich muß manuell auf Landscape umstellen. Das wollte ich eigentlich vermeiden. Die aktuelle Version 1.90 habe ich Einsatz.
Re: Drucken Landscape
Verfasst: Mi, 13. Dez 2006 0:50
von AUGE_OHR
hi,
Rolf Ramacher hat geschrieben:
...Aber leider funkt. es nicht. Ich muß manuell auf Landscape umstellen. Das wollte ich eigentlich vermeiden. Die aktuelle Version 1.90 habe ich Einsatz.
und was passiert bei :
C:\ALASKA\XPPW32\SOURCE\samples\solution\PConfig\PConfig.prg
gruss by OHR
Jimmy
Verfasst: Mi, 13. Dez 2006 8:36
von brandelh
Hi,
sehr seltsam, bei meinem Canon i965 und Samsung CLP-550n funktioniert das (nicht die Anzeige in dem Druckermenü, sondern der Ausdruck im Querformat.).
Bei gleichem Xbase++ Stand, könnte es ja dann eigentlich nur am Druckertreiber liegen ... was hast du denn für einen ?
Sehr seltsam das alles.
Drucken Landscape
Verfasst: Mi, 13. Dez 2006 15:06
von Rolf Ramacher
Hi Jimmi,
also wenn ich meinen Standarddrucker vorab auf Landscape einstelle, dann funktioniert -
C:\ALASKA\XPPW32\SOURCE\samples\solution\PConfig\PConfig.prg
d.h. der nimmt Landscape
Hi Hubert,
also ich habe den HP LaserJet 1100. Wenn ich dieses vordefiniere mit Landscape funkt. das mit meinem Programm auch.
Mein Ziel wäre es im Programm Landscape vorzugeben, egal was der Drucker für eine voreinstellung hat, zumal der Anwender ja den Drucker auswählen kann/muß.
Es ist die Frage, ob dies so überhaupt funktioniert.
Verfasst: Mi, 13. Dez 2006 15:36
von brandelh
Hallo Rolf,
zeig uns doch mal deinen Quellcode, wie gesagt mit meinem Beispiel von oben geht das bei mir - und scheinbar auch bei Jimmy. Eigentlich sollten die Windowsdruckertreiber mittlerweile sowas unterstützen.
Drucken XpbDialog Landscape
Verfasst: Do, 14. Dez 2006 10:24
von Rolf Ramacher
Hi Hubert,
hier ist mein Quellcode:
oDlg := XbpPrintDialog():new()
// Druckausgabe nicht standardmäßig in Datei umleiten
oDlg:enablePrintToFile := .f.
oDlg:printToFile := .f.
oDlg:pageRange:=({1,99})
oDlg:create()
// Konfiguriertes Drucker Objekt erzeugen
oPrinter := oDlg:display()
oDlg:destroy()
IF oPrinter <> NIL
oPrinter:setOrientation:=(XBPPRN_ORIENT_LANDSCAPE)
// Neuen Presentation-Space erzeugen
oPS := XbpPresSpace():new()
// Bedruckbarer Bereich auf dem Papier
aSize := oPrinter:paperSize()
aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4] }
oPS:create( oPrinter, aSize, GRA_PU_LOMETRIC )
oPrinter:startDoc()
// Hier erstelle ich die Info die gedruckt wird.
oPrinter:endDoc()
// Aufräumen
oPrinter:destroy()
oPS:destroy()
ENDIF
Habe ich noch etwas übersehen ?
Verfasst: Do, 14. Dez 2006 10:42
von Martin Altmann
Hallo Rolf,
ich mache es ein wenig anders - erst erzeuge ich das Printer-Objekt mit :create() und danach setze ich mit :SetFormSize() das Papierformat und im Anschluß mit :SetOrientation() die Ausrichtung.
Erst danach übergebe ich das Printerobjekt an den oPS:create()-Aufruf.
Viele Grüße,
Martin
Re: Drucken XpbDialog Landscape
Verfasst: Do, 14. Dez 2006 10:57
von brandelh
Rolf Ramacher hat geschrieben:Habe ich noch etwas übersehen ?
1. den CODE Tag, damit man es besser lesen kann
2. sieh mal die Zeile genau an:
Rolf Ramacher hat geschrieben:oPrinter:setOrientation:=(XBPPRN_ORIENT_LANDSCAPE)
du rufst hier keine Methode auf, sondern versuchst eine Zuweisung an eine Variable, die aber nicht vorhanden ist.
Kleiner Tippfehler große Wirkung.
So geht es :
Drucken xbpPrintDialog
Verfasst: Do, 14. Dez 2006 12:55
von Rolf Ramacher
Hi Hubert,
oohh ja hast Recht. Wer richtig lesen kann ist klar im Vorteil. Aber jetzt habe ich ein weiteres Problem beim Drucken.
Ich muß Hängeetiketten bedrucken, Portrait. Wobei 2 Nebeneinander gehören. Die Texte packe ich in einen String und drucke mit GraStringAt.
Teilweise sind dies Texte, die vom Anwender definiert werden können. also auch unterschiedliche Länge. Nur habe ich das Problem das ich die 2 Texte nicht sauber entsprechend der Vorlage positioniert bekomme.
Mit padr und alltrim auch nicht. Selbst TransForm brachte nicht das gewünschte Ergebnis. Das Auffüllen auf die gleiche Länge habe ich dann mit Chr(255) "geschütztes Zeichen" hinbekommen. Allerdings wird dieses
Zeichen als Y mit ü ausgedruckt. Kann man den Ausdruck unterdrücken?
Oder weißt du eine andere Lösung ?
Re: Drucken xbpPrintDialog
Verfasst: Do, 14. Dez 2006 13:13
von brandelh
Rolf Ramacher hat geschrieben:...Wobei 2 Nebeneinander gehören. ... Das Auffüllen auf die gleiche Länge habe ich dann mit Chr(255) "geschütztes Zeichen" hinbekommen. Allerdings wird dieses
Zeichen als Y mit ü ausgedruckt...
Oder weißt du eine andere Lösung ?
Wir sind hier nicht mehr bei Clipper !
Auffüllen mit Blanks etc. kann nur funktionieren, wenn man einen fixedFont (courier) verwendet,
aber das will doch keiner mehr sehen !
Die Lösung lautet:
Für jede Spalte und Zeile ein GraStringAt() verwenden:
Code: Alles auswählen
Beipiel für 2x7 Etiketten
nSpa1 := 100 // das sind jetzt nur so Beispielswerte aus dem Kopf
nSpa2 := 1000 // abmessen in mm und dann * 10 nehmen
nY := 2000 // erste Druckzeile von unten
... Drucker einrichtung mit startdoc()
for nEtikett := 1 to 7
// erste Zeile
GraStrinAt(oPS,{[b]nSpa1[/b],nY},alltrim(str(nEtikett))+"Etikett links")
GraStrinAt(oPS,{[b]nSpa2[/b],nY},alltrim(str(nEtikett))+"Etikett rechts")
// Vorschub in nächste Zeile
nY -= 40 // 4 mm je Zeile ??
// weitere Zeilen dieses Etiketts
GraStrinAt(oPS,{[b]nSpa1[/b],nY},"...")
GraStrinAt(oPS,{[b]nSpa2[/b],nY},"...")
// am Ende soviel Vorschub, dass man die erste Zeile des nächsten Etiketts erreicht.
nY -= ??? // 4 mm je Zeile ??
next
wenn noch Etiketten zu drucken sind, newPage, ansonsten enddoc...
Wenn man nun rechtsbündig ausrichten will, geht das natürlich auch, aber nicht wirklich schön.
Wie schon öffters geschrieben hat meine Druckerklasse da erhebliche Vereinfachungen, dort kann man bei der Methode gleich noch die Ausrichtung angeben und auch mehrzeilige Texte mit einem Aufruf drucken, sogar im Blocksatz.
Im Quellcode sieht man dann wie die einzelnen Druckausgaben auf GraStringAt() aufgelöst werden.
Ein Beispiel mit Ettikettendruck ist auch dabei und Druckvorschau