Druck
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Druck
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
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Druck
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.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.Bei meinen Beiden Druckern kommen bei aSize unterschiedliche Werte aus.Code: Alles auswählen
aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4] }
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
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Druck
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
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
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.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Druck
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
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
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Druck
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Druck
Hallo Jan,
darum habe ich ihm ja auch gesagt, er solle das einfach mal nach beiden Formeln durchrechnen - dann sieht er das Problem
Viele Grüße,
Martin
darum habe ich ihm ja auch gesagt, er solle das einfach mal nach beiden Formeln durchrechnen - dann sieht er das Problem
Viele Grüße,
Martin
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.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Drucken mit XppPrint() und Ränder ...
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.
Schlagworte: Ränder Druckränder Druckausgabe Print
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
- Dateianhänge
-
- PrinterTestdruckTopLeft.prg
- (3.43 KiB) 208-mal heruntergeladen
-
- PrinterTestdruck.prg
- (2.91 KiB) 204-mal heruntergeladen
Gruß
Hubert
Hubert