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

Code: Alles auswählen

oPrinter:setOrientation(XBPPRN_ORIENT_LANDSCAPE)

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 :D