![]() |
Änderungen an Druckeren erkennen (neu, gelöscht)
Hallo,
ich nutze die StringList Printer.Printers aus der Unit Vcl.Printers. Delphi füllt diese bei der ersten Nutzung und danach wird sie nicht mehr geändert. Wenn mein Programm nun ausgeführt wird und der Anwender währenddessen einen neunen Drucker installiert oder einen löscht, passt der Inhalt von Printer.Printers nicht mehr zu den real vorhandenen Druckern. Entweder klappt das Drucken dann gar nicht oder der Ausdruck findet auf dem falschen Drucker statt. Wie kann ich diese Liste neu einlesen? Und wie kann ich erkennen, ob an den Drucker etwas geändert wurde? Gibt es da ein Event/Message? Im schlimmsten Fall würde ich dem Anwender dann einfach eine Meldung anzeigen, dass er mein Programm neu starten soll. Da bei nächsten Start die Drucker dann neu eingelesen werden. Danke! |
AW: Änderungen an Druckeren erkennen (neu, gelöscht)
Hast du statt der glorifizierten globalen Variable
Delphi-Quellcode:
mal
Vcl.Printers.Printer()
Delphi-Quellcode:
versucht? Da sollte dann die aktuelle Druckerliste drinstehen.
Vcl.Printers.TPrinter.Create()
|
AW: Änderungen an Druckeren erkennen (neu, gelöscht)
Eigentlich reagiert Delphi an vielen Stellen auf System-Messages (Broadcasts) und aktualisiert Vieles.
Nur scheinbar hier nicht. Ich finde auch sonst nirgendwo ein efresh in der Printers-Unit, sowie sonst nirgendwo ein Printer.Refresh im Delphi-Code. Überall im Code findet man Kommentare ala
Delphi-Quellcode:
.
with Printers do // <- this rebuilds the FPrinters list
An dieser Stelle weitergesucht, kannst du also
Delphi-Quellcode:
ausführen und beim nächsten Zugriff [s]ist[/] wird diese Liste aktuell.
Printer.FreePrinters;
Bzw. ginge dann auch direkt
Delphi-Quellcode:
.
Printer.Refresh;
![]() ![]() Lieferte jetzt nichts, aber du kannst ja mal via TApplicationEvents.OnMessage schauen, ob bei dir eine spezifische Message eintrifft, wenn du an den Druckern was änderst. |
AW: Änderungen an Druckeren erkennen (neu, gelöscht)
Zitat:
Delphi-Quellcode:
klappt es schon mal immer den aktuellen Stand einzulesen.
Vcl.Printers.TPrinter.Create()
Jetzt brauche ich nur noch ein Event/Message, mit dem ich erkennen kann, dass sich bei den Druckern was geändert hat. Ich habe ganz dunkel in Erinnerung, dass es da eine Windows-Message gab. Ich meine das war irgendwas indirektes. Also so eine allgemeine Message wie "Irgendwas an den Systemeinstellungen" wurde geändert. Mehr fällt mir aber nicht ein und ich finde mit Google auch nichts. |
AW: Änderungen an Druckeren erkennen (neu, gelöscht)
Probiers mal mit WM_DEVICECHANGE. Dann über den Devicenamen prüfen, ob die Änderung relevant ist (auch USB beachten!)
Code:
if DeviceName.StartsWith('\\?\HID#') then
begin // Ein HID-Gerät wurde ein-/ausgehängt, das kann ein Digitizer sein: // Flag setzen, sodass wir via Timer die Geräte neu einlesen können. _ProcessDeviceChange(paASHIDDeviceChanged); end else if DeviceName.StartsWith('\\?\USB#') then begin // Ein USB-Gerät wurde ein-/ausgehängt: Flag setzen, sodass wir OnIdle die Geräte neu einlesen können. _ProcessDeviceChange(paASUsbDeviceChanged); end else if DeviceName.StartsWith('\\?\SWD#PRINTENUM') then begin // Ein Drucker wurde neu eingerichtet oder gelöscht: Druckerliste aktualisieren. _ProcessDeviceChange(paASPrinterDeviceChanged); end; |
AW: Änderungen an Druckeren erkennen (neu, gelöscht)
Zitat:
Code:
DeviceName.StartsWith('\\?\SWD#PRINTENUM')
|
AW: Änderungen an Druckeren erkennen (neu, gelöscht)
Zitat:
![]() ![]() ![]() vielleicht? PAnsiChar(pDBT_DEVNODES_CHANGED(wParam).lParam) |
AW: Änderungen an Druckeren erkennen (neu, gelöscht)
Wie wäre es mit WM_SETTINGCHANGE? Das Ereignis sollte glaube ich immer gefeuert werden und hier zeig ich wie Du den aktuellen Basis-Druckernamen bekommen könntest:
Delphi-Quellcode:
Hilft das?
uses ...Vcl.Printers...
... procedure WMSettingChange(var Message: TMessage); message WM_SETTINGCHANGE; ... implementation procedure TForm12.WMSettingChange(var Message: TMessage); begin Printer.PrinterIndex := -1; Label1.Caption := Printer.Printers[Printer.PrinterIndex]; end; |
AW: Änderungen an Druckeren erkennen (neu, gelöscht)
Es gibt dazu den Ansatz, das über einen Thread zu lösen.
Auf einer französichen Delphiseite findet sich dazu ein sehr gutes Beispiel. Unter der Überschrift "Surveillance d'un serveur d'impression" und dem direkten Link: ![]() |
AW: Änderungen an Druckeren erkennen (neu, gelöscht)
Wozu ein Thread?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz