Druck

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

Moderator: Moderatoren

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:

Druck

Beitrag von Rolf Ramacher »

Hallo zusammen

bei einem Kunden ist der Druck von Etiketten etwas verschoben. HP Laserjet 1300. Bei anderen Kunden ist alles OK
Auch bei mir HP- Laserjet 1100 und OKI C7200

Ich hole mir mit Xpbprintdialog den Drucker und die Papiergröße - danach wird berechnet. Er fängt von Vorne zu weit rechts an.
Ich kann das bei mir nicht nachvollziehen. Auch beim Kunden vor Ort im Druckertreiber habe ich nichts gefunden, wo man etwas verschieben kann.

Es gibt keine RTF-Vorlage oder ähnliches.

Code: Alles auswählen

   oDlg := XbpPrintDialog():new() 

   // Druckausgabe nicht standardmäßig in Datei umleiten 
   oDlg:enablePrintToFile := .f. 
   oDlg:printToFile       := .f. 
   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()
		// Abfrage Startposition bei empty von Anfang an.
		If empty(cDruckPos) 
			aPos:={aSize[1]-2683,aSize[2]-161}
			aZPos:={aSize[1]-2690,aSize[2]-51}		// 2713
			aNrPos:={aSize[1]-2723,aSize[2]-116}

			nSeitenZaehler:=0
			nCounter:=1
		Else
			aZPos:={aSize[1]-2690,aSize[2]-51}			// 2713
                                                ..... usw. 
                                EndIf
Das Array aZpos ist das Array der Zeilen.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Druck

Beitrag von Jan »

Rolf,

wenn ich Deinen Code richtig interpretiere vergisst Du eine ganz wichtige Sache: Den nicht bedruckbaren Seitenrand! Du musst den von der gewünschten Druckposition immer abziehen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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:

Re: Druck

Beitrag von Rolf Ramacher »

Hi Jan,

aber :papersize() gibt doch den druckbaren Bereich zurück
Gruß Rolf

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

Re: Druck

Beitrag von brandelh »

Hi,

genau - darum verwende ich meine Druckerklasse, einmal eingebaut weiß die das immer ;-)

Code: Alles auswählen

aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4]  } 
oPS:create( oPrinter, aSize, GRA_PU_LOMETRIC ) 
damit legst du den Druckbaren Bereich fest. 0,0 ist die linke untere Ecke des druckbaren Bereichs !

wenn du nun 100,100 vom RAND drucken möchtest, und nur das macht Sinn,
dann musst du bei jeder Druckposition bei X papersize()[3] und bei Y papersize()[3] abziehen.

Vergleich mal die Rückgabewerte der Drucker ...
papersize()[3] und papersize()[4] sind normalerweise bei Lasern auf 5 bis 6 mm.
Je nach eingestellter Emulation oder Druckermodell können es aber auch 7 oder 8 mm sein.
Bei Tintenstrahlern kommt es dann unten meist zu 15 mm was das Druckbild bei der Berechnung
völlig über den Haufen schmeißt.

Ich verwende bei meiner Druckerklasse den linken oberen Blattrand als Bezugspunkt beim programmieren und erledige intern die Umrechnungen. Allerdings kommt es ab und zu vor, dass ein Druckertreiber falsche Angaben macht ;-(

PS:

ich würde nSizeX, nSizeY, nMarginLeft und nMargin... in Variablen hinterlegen, wer soll bei den aSize[?] später noch durchblicken was gemeint ist ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
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 Jan,
aber :papersize() gibt doch den druckbaren Bereich zurück
ja und du druckst ab diesem dann ...

aber wenn der sich ändert, ändert sich auch dein Ausdruck ...

Linker Rand: 5mm zu 10mm -> 5 mm Versatz nach Rechts in dem Ausdruck !

Um das auszugleichen könnte man auch mit dem Transformieren spielen, allerdings konnte ich mich damit nie anfreunden: setViewPort()

Ich weiß nicht wie eine schöne Schrift nach dem automatischen Transformieren aussieht ...
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Druck

Beitrag von Jan »

Moin Rolf,

stimmt. Aber mit der Zeile aSize := ... rechnest Du den bedruckbaren Bereich aus. Und wenn Du von dem aus rechnest, dann fehlen Dir die Ränder. Und Du rutschst zu weit nach rechts.

Ich lese mir deswegen immer die Ränder in eine Variable ein (nRandLinks und nRandOben), und ziehe die in jeder Ausgabezeile von meiner gewollten Druckposition ab. Dann passt das immer, egal welcher Drucker das ist.

Schau Dir mal die Rückgabewerte von :papersize an. Besonders dir Rückgabewerte 3 bis 6. Und vergleich das mit Deiner aSize-Zeile.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Druck

Beitrag von Jan »

Hey Hubert,

das ist unfair :angry1: ! 2 Artikel veröffentlichen, wärend ich den einen hier schreibe (OK, mit Unterbrechungen durch Kundentelefonate). [-X

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

Re: Druck

Beitrag von brandelh »

Hi Jan,

Ich sag nur 10 Finger Schreibmaschinen Kurs in der Wirtschaftsschule (Note sage ich jetzt nicht ;-) ) ... 8)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Druck

Beitrag von Jan »

Hubert,

hatte ich auch mal (so vor 15 Jahren in meiner Reha). Hab sogar halbwegs gut abgeschnitten. Und vieles wieder verlernt/aufgegeben/wasauchimmer.

Aber vielleicht sollten wir im Zusammenhang mit der Druckausgabe (wieder einmal) darauf hinweisen, daß es die undokumentierte Möglichkeit gibt, mit TopLeft statt BottomLeft zu drucken. Was in meinen Augen die Druckausgabe wesentlich erleichtert.

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

Re: Druck

Beitrag von brandelh »

Hi Jan,

ich hatte es in Kombination mit Steno und Schreibmaschine ohne Korrekturband.
Ab 6 Tippfehlern je A4 Seite war der 5er vorprogrammiert ... und dann noch
das Abschreiben vom Stenodiktat - grauenvoll. Aber am PC nützt es mir enorm :-)

Wegen TOP Left, klar für alle die meine Druckerklasse (die macht das intern schon immer) nicht nutzen, bringt das Vorteile ...
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:

Re: Druck

Beitrag von Rolf Ramacher »

Hi,

aber

Code: Alles auswählen

# aSize := oPrinter:paperSize() 
      aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4]  } 
      oPS:create( oPrinter, aSize, GRA_PU_LOMETRIC ) 
hiermit habe ich doch den zu druckbaren Bereich- oder etwa nicht.

Mit

Code: Alles auswählen

aZPos:={aSize[1]-2690,aSize[2]-51}    
gebe ich doch den Befehl, ab wo genau gedruckt werden soll - oder bin ich da wirklich auf dem Holzweg.??
Gruß Rolf

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

Re: Druck

Beitrag von brandelh »

Hi,

nehmen wir mal an, die Ränder geben alle 60 zurück.
Also 6 mm ...
Das Druckfenster wird von 6mm bis 21.. etc.
Also 6 mm von links wird als 0 angenommen !
6+nDeinePositionsbestimmung ...

nun geht es also auf 10mm ...
10+nDeinePositionsbestimmung ...

ist nun klar, warum die Druckausgaben unterschiedlich sind ?

Drucke doch mal auf {0,0} - wenn die Druckposition im Blatt liegt und nichts abgeschnitten wird,
haben wir Recht (ehrlich gesagt ist es schon Jahre her, dass ich mich damit rumschlagen musste).
Wenn du aber deine Messungen auf einen variablen Punkt legst, wird das Druckergebnis immer variabel sein. Nur die Blattkante ist fix.
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:

Re: Druck

Beitrag von Rolf Ramacher »

Hi Hubert,

ich muß aber doch irgendeinen Wert von dem berechneten aSize (wie oben angebeben )

Code: Alles auswählen

aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4]  } 
angeben.

Wie kann ich diesen denn variabel gestalten. Hierbei muß es genau passen, denn es sind 48 Klebeetiketten auf einer Seite
die bedruckt werden müssen.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Druck

Beitrag von Jan »

Rolf,

nehmen wir an, Du möchtest bei 10 cm vom linken und vom oberen PAPIERrand drucken. oPrinter:paperSize hat Dir im 3. Rückgabewert ein 3 mm breiten Rand zurückgegeben. Machst Du das wie bislang, dann wir der Druck bei 10,3 cm von links starten, das ist die verschiebung, die Du festgestellt hast. Ich selber mache das immer so:

Code: Alles auswählen

aSize := oPrinter:paperSize()                          // Diese Zeile hast Du schon
nRandLinks := aSize[3]                                 // Diese Zeile musst Du zwischen den beiden vorhanden Zeilen einfügen
nRandOben := aSize[6]                                  // Diese Zeile musst Du zwischen den beiden vorhanden Zeilen einfügen
aSize := {aSize[5] - aSize[3], aSize[6] - aSize[4]}    // Diese Zeile hast Du schon
GraStringAt(oPs, ;
            {100 - nRandLinks, 100 - nRandOben}, ;
            cText1)
Da der 3. und 6 Wert vom jeweiligen Printerobjekt zurückgegeben wird, ist der immer passend zu dem jeweiligen Drucker. Also egal, ob das 0 oder 5 oder 10 mm sind: Dadurch, daß Du genau den für diesen Drucker passenden Wert von der gewünschten Papierposition abziehst, wird das an der gewünschten Papierposition gedruckt.

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

Re: Druck

Beitrag von brandelh »

Hi,

beim Erzeugen des Printerobjects bleibt alles gleich.
Nur beim Ausdruck - wie Jan ja auch geschrieben hat, wird vom RAND gemessen und die Hardwareränder abgezogen. Der Y Wert ist dann abhängig ob TopLeft oder BottomLeft eingestellt ist, standardmäßig misst man von unten und zieht den unteren Rand ab.

Somit ist die Ausdruckposition immer gleich, egal wie groß die HardwareRänder sind.

Die Zeilen bei oPS:create() bleiben, nur muss man sich vorher die Ränder merken und bei GraStringAt() wird von der Blattkante gemessen und der Rand als Variable abgezogen.

Code: Alles auswählen

aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4]  } 
oPS:create( oPrinter, aSize, GRA_PU_LOMETRIC ) 
Jans Beispiel geht von TopLeft aus (was sehr sinnvoll ist !):

Code: Alles auswählen

GraStringAt(oPs, {100 - nRandLinks, 100 - nRandOben}, cText1)
weil man sonst von unten messen und den nRandUnten verwenden muss.
Wehe wenn dann aber Papier mit einer anderen Länge im Papierfach liegt ;-)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Druck

Beitrag von Jan »

Hubert,

sorry, das mit dem TopLeft in meinem Beispiel hätte ich erwähnen sollen. Das ist mir inzwischen so normal geworden, daß ich das leider übersehen habe.

Danke fürs klar stellen. Hätte ansonsten doch für ein wenig Verwirrung sorgen können :?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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:

Re: Druck

Beitrag von Rolf Ramacher »

Hi

dann wäre das in meinem Fall so richtig ?

Code: Alles auswählen

aZPos:={aSize[1]-nRadnlinks,aSize[2]-nRandoben}
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Druck

Beitrag von Jan »

Rolf,

das kommt drauf an. Was steht denn in aZPos drin? Wenn das aus die Zeile aSize := .. aus Deinem Code ist, dann natürlich nicht. Weil da ja der bedruckbare Bereich drin steht. Und links davon geht eben halt technisch nicht. Weil das ja eben der nicht bedruckbare Rand ist.

Wenn das aber die oberen linken Ecken Deiner Etiketten sind, dann müsste das passen. Vorausgesetzt, Du arbeitest mit Topleft. Was Du mit

Code: Alles auswählen

   oPS:create(oPrinter, aSize, GRA_PU_LOMETRIC + GRA_PO_TOPLEFT)
einstellst.

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

Re: Druck

Beitrag von brandelh »

Hi,

ich mach jetzt mal einen Schnellschuss :

Code: Alles auswählen

// diese Werte stehen im Druckertreiber 
aSize := oPrinter:paperSize()
nRandLinks := aSize[3] 
nRandOben := aSize[6]

// diese Werte müssen an das Format angepaßt werden ...
nLabelZeilen := 7
nLabelSpalten := 3
nLabelBreite := 600  // 6cm von einem Label zum Nächsten ...
nLabelHoehe := 280 // 2,8 cm von einem Label zum Nächsten ...
// hier von linker oberer Seitenkante messen
nPosErstesLabel := 100
nPosErsteZeile   := 100 // Position des Textes meist auf Unterkante Normalschrift z.B. A

// aTxt mit Inhalt laden ...

aTxt := ... {nLabelZeilen,nLabelSpalten,nDruckZeilen} // Wertebereich beachten

// gleicher Text je Etikett ist natürlich einfacher ;-)

**** warum überschreibst du die Seiteninfos ???? Mache ich nie !
*** aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4]  }
oPS:create(oPrinter, { aSize[5] - aSize[3],aSize[6] - aSize[4]  }, GRA_PU_LOMETRIC + GRA_PO_TOPLEFT)

for nZeile := 1 to nLabelZeilen
   for nSpalte := 1 to nLabelSpalten
        nPosX := (nSpalte-1)*nLabelBreite + nPosErstesLabel - nRandLinks
        nPosY := (nZeile-1)*nLabelHoehe + nPosErsteZeile - nRandOben
        for x := 1 to 6
             GraStringAt(oPS,{nPosX,nPosY},aTxt[nZeile,nSpalte,x])
             nPosY += nZeilenVorschub
        next
    next
next
nur so als Beispiel.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Druck

Beitrag von AUGE_OHR »

hi,

ich bin mir nicht mehr sicher warum, aber das Thema mit dem "Rand" kommt ja immer wieder vor.

Ich habe deshalb einfach einen Spinbutton in meine Preview gebaut womit ich den "Rand" einstelle,
egal was mir PaperSize sagt ...je nach Drucker immer wieder neu anpassen, nein danke.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Druck

Beitrag von brandelh »

Hi Jimmy,

wenn man es richtig macht und der Druckertreiber stimmt dann braucht man das ganze gerade nicht für jeden Drucker ändern !
Weil aber ab und zu das Papier sich ändert, der Einzug auch nicht immer gleich eingestellt ist und manche Druckertreiber falsche Werte enthalten ... kann eine dynamische Einstellmöglichkeit im Programm nix schaden ;-)
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:

Re: Druck

Beitrag von Rolf Ramacher »

Hi Jan,

ich muß nochmal nachhaken.

wenn ich doch nehme

Code: Alles auswählen

aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4] }
so habe ich doch den bedruckbaren Bereich. Die Ränder sind bereits abgezogen.
Meine Array aZPos beinhaltet die Druckpositionen der Zeilen.

Hierbei ziehe ich doch so ab:

Code: Alles auswählen

aZPos:={aSize[1]-2690,aSize[2]-51}
aus aSize(inkl. abgezogene Ränder) Minus meiner berechneten Zahl.

Wie gesagt ich habe bei mir 2 verschiedene Drucker - und das klappt. Bei einem Kunden nicht.
Bei anderen Kunden HP Laserjet 1200, Kyocrea - klappt wunderbar.
Also muß doch die vorgehensweise im Quellcode richtig sein.
Gruß Rolf

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

Re: Druck

Beitrag von brandelh »

Hallo Rolf,

drucke doch einfach auf 0,0 und schau wo es steht !

Lies dir bitte bei die Beschreibung von XbpPresSpace() durch.
aPageSize gibt die Größe des beschreibbaren Bereiches an.
Dort ziehst du die Ränder ab, denn darein kann man nicht schreiben.
0,0 ist die linke untere Ecke der Seite. ABER DER BESCHREIBBAREN FLÄCHE !

Es steht nirgends, dass Xbase++ intern die Ränder wieder dazuzählt oder abzieht.
0,0 ist links unten in der beschreibaren Fläche und die ist so groß, wie nach Abzug der Ränder übrig bleibt. Das ist auch nur nötig, da die rechten und oberen Ränder inkl. der linken und unteren Ränder vom Druckertreiber geliefert werden. Hier gibt es (zum Glück) keine Transformation !

Das 2 Drucker gleich drucken liegt also nur daran, dass sie zufällig die gleichen linken und unteren Ränder haben !

Ich gebe dir insoweit Recht, dass diese Lösung von Xbase++ ziemlich dämlich ist !
Genauso wie 0,0 links unten !

Beim Drucken kann es nur einen richtigen Bezugspunkt geben und das ist links oben die Blattkante.
Da aber Xbase++ nunmal mit 0,0 im bedruckbaren Bereich beginnt, muss man die Ränder abziehen.
Und genau darum (und wegen mächtigerer Befehle) habe ich meine Druckerklasse geschrieben, die kümmert sich um den ganzen Sch.... automatisch.

PS:

Der Vollständigkeit halber möchte ich erwähnen, dass VO hier noch schlechter war, dort war die Druckausgabe sogar von der Druckauflösung abhängig (300dpi Drucker -> 600 dpi = 1/4 Druckgröße). Andere sparen sich die Druckausgabe komplett ...
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:

Re: Druck

Beitrag von Rolf Ramacher »

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

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
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 »

Kinners :!:
Hört doch auf, aneinander vorbei zu reden 8)
Rolf, ich mach Dir folgenden Vorschlag:
Rechne doch einfach mal aus, was bei Benutzung Deiner Formel rauskommt, wenn der unbedruckbare linke Rand 15 ist.
Und dann rechne mit den selben Werten nach der Formel von Hubert/Jan/...
Wenn in beiden Fällen das gleiche rauskommt, dann ist es egal, wie Du rechnest!
Ansonsten ist Dein Weg falsch :!: :whistle:

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.
Antworten