Druck

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

Moderator: Moderatoren

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Druck

Beitrag von Jan »

Ich hätt noch einen Vorschlag: Rolf kommt am 22. November zu unserem XUG-Treffen. Dann können wir das ganze in Ruhe, Aug in Aug besprechen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied 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: Druck

Beitrag von brandelh »

Rolf Ramacher hat geschrieben:Hi Hubert,
da hast du mich nicht ganz verstanden.
Mit diesem Befehl ziehe ich doch die Ränder ab und habe den bedruckbaren Bereich.

Code: Alles auswählen

aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4] }
Bei meinen Beiden Druckern kommen bei aSize unterschiedliche Werte aus.
Ich habe dich schon verstanden und du hast dahingehend Recht, dass du so den bedruckbaren Bereich an die Funktion übergibst, ABER der Ursprungsbezugspunkt 0,0 ist immer noch von dem linken unteren Rand abhängig. Wenn sich der verschiebt (meist, 6 mm aber bei einigen Druckern auch deutlich mehr), hast du z.B. einen kleineren druckbaren Bereich, und einen anderen Ursprung.

Ich versuche es mal andersherum.

Bei einem XbpControl (XbpStatic oder XbpMLE etc.) gibt man mit aSize die Größe des Controls an. Je nach den Werten kann man mehr oder weiniger reinschreiben.
Aber die POSITION auf dem Bildschirm wird mit aPos festgelegt. aPos wird beim Drucker (im Verborgenen) durch den Druckertreiber bestimmt. Bei der Größe des bedruckbaren Bereichs (Rechter Rand - Linker Rand) spielt der Rand zwar eine Rolle (je mehr Rand je weniger Druckfläche), aber beim Drucken mit GraStringAt() wird dieser (da 0,0 ja im druckbaren Bereich liegt) immer intern addiert. Da die Ränder nicht bei allen genau gleich sind, muss man sich einen anderen Bezugspunkt suchen und das ist die Papierkante. Ab dort gemessen zieht man dann den Rand ab und druckt genau dorthin wohin man möchte.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Druck

Beitrag von Martin Altmann »

Hallo Jan,
an sich eine gute Idee (wenn ich das als Gast so sagen darf).
Aber Rolf will ja sicherlich nicht sooo lange warten...

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

Beitrag von brandelh »

Probieren geht ja bekanntlich über studieren, lade dir doch einfach meine Druckerklasse.
Dort gibt es ein TEST.EXE ... (nach dem Kompilieren)

Drucke mit dieser auf den verschiedenen Druckern ACHTUNG 1-2 Seiten aus ...
Standard ist das ganze Dokument und das ist lang.

Wenn sich auch bei diesem Testdruck die Position verschiebt, liegt ein Fehler des Druckertreibers vor.
Zumindest hatte ich schon ewig keine Beanstandungen mehr wegen der Druckposition.

... Bei einigen Citrix/Terminalserver-Druckertreibern wird ab und zu wahllos mitten im Wort eine Leerst elle gedruckt (nicht nur aus Xbase++ heraus), das ist aber ein anderes Problem ;-)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Druck

Beitrag von Jan »

Martin,

naja, sooo lange ist das ja auch nicht mehr hin, 8 1/2 Tage noch. Und außerdem habe ich das Gefühl, das Rolf sich da in etwas gedanklich verrannt hat (Rolf, nicht böse gemeint, ich kenn das Gefühl nur zu gut aus eigener leidvoller Erfahrung), was wir textlich im Forum nicht so einfach entknoten können.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Druck

Beitrag von Martin Altmann »

Hallo Jan,
darum habe ich ihm ja auch gesagt, er solle das einfach mal nach beiden Formeln durchrechnen - dann sieht er das Problem :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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Drucken mit XppPrint() und Ränder ...

Beitrag von brandelh »

Hallo,

ich habe mal ein Testprogramm geschrieben, das die Werte des Druckers andruckt.
Ich hoffe hierbei wird es klarer, warum der nicht fixe Bezugspunkt 0,0 ungeeignet ist um fixe Positionen zu bestimmen:

Ränder Links / unten bei verschiedenen Druckern
Canon i965 (Tintenstrahler): 34 / 49 -> 3,4 mm / 4,9 mm
Samsung CLP-550 Laser PCL: 42 / 42 -> 4,2 mm / 4,2 mm
Samsung CLP-550 Laser PS: 45 / 46 -> 4,2 mm / 4,2 mm (also gleicher Drucker nur andere Emulation)
Lexmark Optra S 1250: 60 / 47 -> 6 mm / 4,7 mm
Ricoh MP 2500: 42 / 42 -> 4,2 mm / 4,2 mm

mein alter IBM Laser hatte fast 8 mm linker Rand.
Bei 0,0 wird also zwischen 3,4 und 8 mm links gedruckt !

Hier der Quellcode einmal mit BottomLeft (Standard) und einmal mit TopLeft, wobei die internen Arraywerte (:papersize()) für oben und unten gleich bleiben. Daher hängt das Druckergebnis weiterhin von korrekten Werten für den unteren Rand ab.

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"

   #pragma Library( "XppUI2.lib" )

   PROCEDURE Main
      LOCAL oPrinter, oPS, oDlg, aSize, aSizeInfo, nPosX, nPosY, oFont, aDruckBereich

      cls

      aSizeInfo := { "1 = Papierbreite  in 1/10 mm (= nXsize)",;
                     "2 = Papierhöhe    in 1/10 mm (= nYsize)",;
                     "3 = Linker Rand   in 1/10 mm (= nLeftMargin)",;
                     "4 = Unterer Rand  in 1/10 mm (= nBottomMargin)",;
                     "5 = Rechter Rand  in 1/10 mm (= nRightMargin)",;
                     "6 = Oberer Rand   in 1/10 mm (= nTopMargin)",;
                     "7 = Breite in Pixel",;
                     "8 = Höhe in Pixel" }

      oDlg := XbpPrintDialog():new()
      oDlg:enablePrintToFile := .f.
      oDlg:printToFile       := .f.
      oDlg:create()

      // Konfiguriertes Drucker Objekt erzeugen
      oPrinter := oDlg:display()
      oDlg:destroy()

      IF oPrinter <> NIL
         // Neuen Presentation-Space erzeugen
         oPS   := XbpPresSpace():new()

         // Bedruckbarer Bereich auf dem Papier

         aSize := oPrinter:paperSize() // diese Werte sollte man nicht überschreiben !
         aDruckBereich := {aSize[5]-aSize[3],aSize[6]-aSize[4]}

         oPS:create( oPrinter, aDruckBereich , GRA_PU_LOMETRIC )
         oFont := XbpFont():new(oPS):Create("12.Arial")
         oPS:setFont(oFont)
         oFont:destroy()

         // Kleiner Druckjob
         oPrinter:startDoc()
         // Text auf Ursprungspunkt !
         GraStringAt( oPS, { 0,0 }, "Hello World auf 0,0 -> Dieser Punkt ändert sich je nach Drucker !!!!" )
                                        // beim Ausdruck verschwinden die
                                        // Unterlängen aus , wird . !!!!

         // Rahmen auf Rand von druckbarem Bereich
         GraBox(oPS,{0,0}, {aDruckBereich[1]-1,aDruckBereich[2]-1} )

         nPosX := 500 - aSize[3]        // Druckanfang konstant auf 5 cm von linker Papierkante
         nPosY := aSize[2]-500-aSize[4] // Erste Zeile (Grundlinie, nicht obere Kante !)
         for x := 1 to len(aSize)
             nPosY -= 40   // 4 mm Zeilenhöhe -> muss an Schrift angepaßt werden !
             GraStringAt(oPS,{nPosX    ,nPosY},str(x,3)+" => "+ltrim(str(aSize[x],5)))
             GraStringAt(oPS,{nPosX+300,nPosY},aSizeInfo[x])
         next
         nPosY -= 80   // 4 mm Zeilenhöhe -> muss an Schrift angepaßt werden !
         GraStringAt(oPS,{nPosX,nPosY},"die Positionierung kann nicht über Blanks gehen !")
         GraStringAt( oPS, {nPosX,(aSize[2]/2)-aSize[4]-40 }, "Druckername:  '"+oPrinter:devName+"'" )

         oPrinter:endDoc()

         // Aufräumen
         oPrinter:destroy()
         oPS:destroy()
      ENDIF
   RETURN
Schlagworte: Ränder Druckränder Druckausgabe Print
Dateianhänge
PrinterTestdruckTopLeft.prg
(3.43 KiB) 205-mal heruntergeladen
PrinterTestdruck.prg
(2.91 KiB) 201-mal heruntergeladen
Gruß
Hubert
Antworten