Drucken mit XbpPrintDialog

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

Moderator: Moderatoren

Antworten
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 mit XbpPrintDialog

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

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

Beitrag 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.
Zuletzt geändert von brandelh am Mo, 11. Dez 2006 16:38, insgesamt 1-mal geändert.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

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

Beitrag 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
Gruß
Hubert
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 Landscape

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

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Drucken Landscape

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

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

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

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

Beitrag 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.
Gruß
Hubert
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 XpbDialog Landscape

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

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

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

Re: Drucken XpbDialog Landscape

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

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

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

Re: Drucken xbpPrintDialog

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