VB6: Fehler durch PrintQuality = 0

Hallo zusammen.

Bei der Programmierung einer Seitenansicht verwende ich zur Berechnung der physikalisch verfügbaren Papier-Fläche die PrintQuality-Eigenschaft des Printer-Objekts.
Scheinbar gibt es Printer-Objekte (hier: „FRITZfax Drucker“ ,v3.04), die den Wert der PrintQuality-Eigenschaft gar nicht bzw. 0 zurückgeben, was dann bei der Berechnung zu dem Fehler „Division durch Null“ führt.

Kennt jemand eine Methode, mit der man den Wert der PrintQuality-Eigenschaft berechnen kann?

Vielen Dank für Eure Hilfe

VG
C. Mehnert

Kennt jemand eine Methode, mit der man den Wert der
PrintQuality-Eigenschaft berechnen kann?

Hallo Carsten,

zeige mal den Code wo es zu Div/0 kommt.

Gruß
Reinhard

Hallo Carsten,

Bei der Programmierung einer Seitenansicht verwende ich zur
Berechnung der physikalisch verfügbaren Papier-Fläche die
PrintQuality-Eigenschaft des Printer-Objekts.
Scheinbar gibt es Printer-Objekte (hier: „FRITZfax Drucker“
,v3.04), die den Wert der PrintQuality-Eigenschaft gar nicht
bzw. 0 zurückgeben, was dann bei der Berechnung zu dem Fehler
„Division durch Null“ führt.

Kennt jemand eine Methode, mit der man den Wert der
PrintQuality-Eigenschaft berechnen kann?

ich weiß nicht, was Du berechnen möchtest.

Wenn Du den wert liest, nicht schreibst, bekommst Du das zurück, was Du zuvor in Windows für diesen Drucker eingestellt hast. Was sich einstellen lässt, hängt vom Drucker ab. Was der kann, weiß der dazugehörige Druckertreiber und mit dem kommunizierst Du.

‚Null‘ habe in diesem Zusammenhang in der Hilfe nicht gefunden.
-1 bis -4 Übergibt ‚Draft‘ bis ‚hohe Qualität‘ an den Drucker.
Du kannst aber auch in positiven Zahlen die Qualität in DPI übergeben, in der der Drucker drucken soll. Ob das dann auch wirklich so gesichert wird, hängt wieder vom Treiber ab.

Jetzt fange ich an zu raten. :smile:
Ich vermute, daß die Null darauf hindeutet, daß die Qualität nicht verändert werden kann. Bei einem PDF-Trieber wird es vermutlich auch keine Einstellmöglichkeit für die Qualität geben, das wird wohl eher dann eingestellt, wenn das PDF-Dokument auf’s Papier soll.

Ungeprüft gleich rechnen wirst Du schon deshalb nicht können, weil der Wert nicht immer in DPI zurückgegeben wird. Minus 1 bedeutet Entwurfsqualität, hat nicht nur mit der Auflösung zu tun und kann auch zurückgegeben werden, wenn das im Druckermenü für diesen Drucker so eingestellt ist. Was ‚Entwurf‘ dann genau bedeutet, hängt wieder von der Hardware und dem Treiber ab. Bei einem alten Nadeldrucker wird da wohl immer nur eine negative Zahl zurückkommen, denn da ließ sich immer nur Draft, NLQ und LQ einstellen. Bei einem noch älteren Nadeldrucker gab es keine unterschiedlichen Qualitäten, da kann der Treiber keine Werte liefern, da waren keine vorgesehen.

Gruß Rainer

Hallo Rainer.

ich weiß nicht, was Du berechnen möchtest.

Ich berechne die Breite und die Höhe des Blattes, quasi die Fläche, die physikalisch bedruckt werden kann. Konkret geht es darum, ein Formular auszudrucken, sei es nun auf einem Drucker, der wirklich ein Stück Papier bedruckt oder z.B. als PDF. Der Unterschied dabei ist ja die „Bürde“ (so nenne ich es ‚mal): Ein Rahmen, den der Drucker braucht, um das Stück Papier „festzuhalten“, was letzten Endes dafür verantwortlich ist, dass der Ausdruck auf allen Druckern unterschiedlich ist. Noch schlimmer ist es bei den Grafik-Methoden: Will man eine Linie drucken, so ist die bei einer Auflösung von 300 dpi doppelt so dick wie bei einer Auflösung von 600 dpi. Ich kann ja aber dem 300-dpi-Drucker nicht sagen: druck‘ 600. Ich muß also auch die DrawWidth-Eigenschaft allgemeingültig berechnen.
Ich habe das für alle auf meinem PC installierten Drucker ausprobiert und sofern ich selber keine Werte festlege, stellt mir der jeweils momentan aktive Standard-Drucker diese Werte zur Verfügung ( Sogar ein alter OKI Nadeldrucker mit 120* 144 dpi ). Nur „Fritz“ hat mir die Null ( also: die Zahl Null! ) zurückgegeben, und damit stehe ich natürlich ziemlich doof da.

Ich vermute, daß die Null darauf hindeutet, daß die Qualität
nicht verändert werden kann. Bei einem PDF-Trieber wird es
vermutlich auch keine Einstellmöglichkeit für die Qualität
geben, das wird wohl eher dann eingestellt, wenn das
PDF-Dokument auf’s Papier soll.

Ob die Qualität geändert werden kann, weiß ich auch nicht. FreePDF XP gibt mit aber alle benötigten Werte zurück.

Ungeprüft gleich rechnen wirst Du schon deshalb nicht können,
weil der Wert nicht immer in DPI zurückgegeben wird. Minus 1
bedeutet Entwurfsqualität, hat nicht nur mit der Auflösung zu
tun und kann auch zurückgegeben werden, wenn das im
Druckermenü für diesen Drucker so eingestellt ist. Was
‚Entwurf‘ dann genau bedeutet, hängt wieder von der Hardware
und dem Treiber ab. Bei einem alten Nadeldrucker wird da wohl
immer nur eine negative Zahl zurückkommen, denn da ließ sich
immer nur Draft, NLQ und LQ einstellen. Bei einem noch älteren
Nadeldrucker gab es keine unterschiedlichen Qualitäten, da
kann der Treiber keine Werte liefern, da waren keine
vorgesehen.

Damit muß ich mich noch 'mal beschäftigen.

VG
Carsten

Hallo Reinhard,

zeige mal den Code wo es zu Div/0 kommt.

Geht momentan nicht, ich bin nicht an meinem Laptop.

VG
Carsten

Hallo Carsten,

Ich berechne die Breite und die Höhe des Blattes, quasi die
Fläche, die physikalisch bedruckt werden kann.

hmmm. Was spricht dagegen, die Angaben in Millimeter an den Drucker zu übergeben? Der Druckertreiber rechnet das dann so um, daß es passt.

Printer.ScaleMode = vbMillimeters

Wenn Du dann mit verschiedenen Druckern einen Kreis auf’s Papier druckst, hat der Eine ‚Treppchen‘, der ander ist rund, aber beide sind gleich groß.

Gruß Rainer

Hallo Rainer.

hmmm. Was spricht dagegen, die Angaben in Millimeter an den
Drucker zu übergeben? Der Druckertreiber rechnet das dann so
um, daß es passt.

Das habe ich schon so

Die DrawWidth-Eigenschaft „auflösungsunabhängig“ zu berechnen, scheint mit folgender Formel zu funktionieren:

Printer.DrawWidth = Printer.PrintQuality / 100 \* (Printer.TwipsPerPixelY \* Printer.PrintQuality) / (Printer.TwipsPerPixelX \* Printer.PrintQuality)

Ob das jetzt für alle Drucker funktioniert, kann ich natürlich nicht sagen, insbesondere deshalb, weil mir nicht bekannt ist, ob es Drucker gibt, bei denen TwipsPerPixelX kleiner ist als TwipsPerPixelY.
Jedenfalls habe das mit allen mir zur Verfügung stehenden Druckern und jeweils allen möglichen Einstellungen für die Auflösung getestet und Linien werden bei allen Ausdrucken auf Papier gleich dick dargestellt.

Aber das eigentliche Problem ist ja noch PrintQuality = 0.

Ich habe „Fritz“ jetzt 'mal aktualisiert und mir wird auch die PrintQuality zurückgegeben. Der Unterschied ALT / NEU: 196 dpi / 200 dpi.

Leider habe ich bei der alten Version nicht darauf geachtet, ob TwipsPerPixelX zurückgegeben wurde oder nicht. Schätze, ich muß die nochmal installieren, um das zu testen.

VG
Carsten

Hallo Reinhard.

Hier jetzt der Code

Printer.Width / Printer.TwipsPerPixelX / Printer.PrintQuality \* 25.4

VG
Carsten

Printer.Width / Printer.TwipsPerPixelX / Printer.PrintQuality
* 25.4

hallo Carsten,

sorry, ich hab ja mitgelesen, ich kann dir da leider nicht helfen.

Wenn Rainer auf keine Idee kommz sieht es finster aus :frowning:

Gruß
Reinhard

Hi Carsten,

Das habe ich schon so

Die DrawWidth-Eigenschaft „auflösungsunabhängig“ zu berechnen,
scheint mit folgender Formel zu funktionieren:

Printer.DrawWidth = Printer.PrintQuality / 100 *
(Printer.TwipsPerPixelY * Printer.PrintQuality) /
(Printer.TwipsPerPixelX * Printer.PrintQuality)

so aufnahmefähig bin ich gerade nicht. Den Code versuche ich mal nicht nachzuvollziehen. Die verwendeten Parameter sind plausibel.

Ob das jetzt für alle Drucker funktioniert, kann ich natürlich
nicht sagen, insbesondere deshalb, weil mir nicht bekannt ist,
ob es Drucker gibt, bei denen TwipsPerPixelX kleiner ist als
TwipsPerPixelY.

Ich kenne keinen. Das muss aber nichts bedeuten. Bei Scannern weiß ich, daß es so etwas gibt.

Jedenfalls habe das mit allen mir zur Verfügung stehenden
Druckern und jeweils allen möglichen Einstellungen für die
Auflösung getestet und Linien werden bei allen Ausdrucken auf
Papier gleich dick dargestellt.

Ja verstanden.

Aber das eigentliche Problem ist ja noch PrintQuality = 0.

In der Hilfe habe ich gefunden, daß ‚.DrawWidth‘ in Pixel angegebne wird. Das bedeutet dann ja wohl, daß Du da die Strichbreite nicht in Millimeter angeben kannst. Ich hätte gesagt, da ist das Problem. Ich hatte fälschlicher Weise angenommen, daß Du die Strichstärke ebenfalls in Millimeter angeben kannst, daher mein Unverständnis.

Zu Printquality = 0

Klar kannst Du damit nicht rechnen.
Ich erzähl mal eine Idee, weil ich gerade nicht testen kann. Mein Drucker ist defekt und ich bin krank, komme also auch nicht in die Firma …

Wäre es eine Möglichkeit, die druckqualität in DPI in den Druckertreiber zu schreiben und anschließend auszulesen, was da steht, falls per default eine Null kommt?
Wenn ich die Hilfe richtig verstanden habe, lässt sich kein Wert eintragen, der nicht unterstützt wird.

Ich habe „Fritz“ jetzt 'mal aktualisiert und mir wird auch die
PrintQuality zurückgegeben. Der Unterschied ALT / NEU: 196 dpi
/ 200 dpi.

Leider habe ich bei der alten Version nicht darauf geachtet,
ob TwipsPerPixelX zurückgegeben wurde oder nicht. Schätze, ich
muß die nochmal installieren, um das zu testen.

Mir geht dabei durch den Kopf, was ich beim Drucken von Barcodeetiketten getan habe. Alle Linien sind eigentlich gefüllte Boxen in Millimeterangabe. So wird ein 0,3 Millimeter breiter Strich eine 0,3 Millimeter breite Box.

Gruß Rainer

Hallo Reinhard.

sorry, ich hab ja mitgelesen, ich kann dir da leider nicht
helfen.

Wenn Rainer auf keine Idee kommz sieht es finster aus :frowning:

Ist nicht so schlimm, trotzdem danke.

Ich schmeiß 'mal ohne weitere Erklärung in den Raum: Die Zahl, die scheinbar mein Problem löst, könnte 1440 sein. Ich probier einfach weiter.

VG
Carsten