Der ausgewählte Drucker ist ungültig
-
Hallo,
Ich habe gerade ein merkwürdiges Problem in meinem Code (BCB 2007).
Im Programm wird eine Druckvorschau benötigt. Um diese zu initialisieren hole ich mir am Anfang vom gesetzten Drucker die Seiteninformationen.pagewidth = Printer()->PageWidth; pageheight = Printer()->PageHeight; canvas = Printer()->Canvas;
Seit kurzem fliegt bei der ersten Zeile eine Exception (EPrinter) mit der Ausschrift "Der ausgewählte Drucker ist ungültig".
Das kann zwar eigentlich nicht sein aber ok. Ich versuche dann einen TPrinterSetupDialog zu öffnen um den Standarddrucker zu ändern.PrinterSetupDlg->Execute();
Die Zeile wird ohne Fehler abgearbeitet, es öffnet sich aber kein Dialog.
Hat jemand eine Idee was man hier machen könnte?Ciao
-
Könnte es ev daran liegen, das der Standarddrucker bei der Abfrage gerade nicht verfügbar, vlt. also ausgeschaltet ist?
-
Nein, der Drucker ist eingeschaltet und verfügbar.
PS:
Wenn ich über PrinterIndex einen anderen Drucker setze ändert das gar nichts. Auch der wird als ungültig angezeigt.
-
Welche Eigenschaften hat denn das zurückgelieferte
TPrinter
Objekt? Sieht das gesund aus? Was liefert denn die WinAPI FunktionGetDefaultPrinter
?
-
Das TPrinter Objekt sieht ganz Ok aus. Ich kann Printers abfragen und PrinterIndex setzten. Im Debugger wird angezeigt, dass FCanvas, FFonts, DC, DevMode etc 0 ist. Das kommt mir etwas komisch vor.
GetDefaultPrinter liefert true und den korrekten Druckernamen.
-
Ich habe jetzt mal genauer nachgeschaut.
Die Exception kommt von TPrinter.SetState weil nach Aufruf von CreateHandleFunc das DC 0 ist. Fragt sich nur warum.
-
Kannst du über
GetLastError
noch was rausfinden?
-
Wenn ich CreateIC mit dem Printernamen von GetPrinter aufrufe gibt GetLastError Nummer 1801 (The printer name is invalid.) zurück.
Scheinbar stimmt irgendwas an dem Namen nicht. Ich schau mal weiter.
-
So, ich habe mir jetzt die Printer und Driver Namen über EnumPrinters organisiert. Damit erzeugt CreateIC keinen ErrorCode mehr aber auch kein DeviceContext.
-
Noch eine Meldung zum vorläufigen Abschluß.
Wie schon erwähnt bekomme ich mit dem Printernamen keinen DC und auch keinen IC, kann also über GetDeviceCaps nicht rausbekommen.
Ich habe mir also die nötigen Informationen mittels des DEVMODE Feldes, welches ja EnumPrinters auch zurückgibt organisiert. Damit kann ich erstmal wieder die Druckvorschau sehen. Drucken kann ich damit natürlich noch nicht.
-
Ok, letzte Meldung.
Das Drucken geht jetzt auch vom Programm aus, wenn ich es direkt starte aber nicht wenn es vom Builder aus gestartet wird. Das reicht mir jetzt erstmal.
Scheint irgendein Zugriffsproblem zu sein (Win 7 64).Ciao
-
Braunstein schrieb:
Scheint irgendein Zugriffsproblem zu sein (Win 7 64).
BCB mal als Admin gestartet?
-
Ja. Mach ich immer.