![]() |
Druckerstatus
Hallo zusammen,
habe mich nun fast durch die ganze DP gequält und nichts richtiges gefunden. Hat denn niemand eine neue Erkenntnis zum Druckerstatus? In meiner OLE Anwendung drucke ich im Hintergrund. Ist der Drucker nicht eingeschaltet gibt's ein Problem (blablabla... Systemkonfiguration überprüfen). Diese Meldung hätte ich gerne vor dem Hintergrunddruck mit einer sinnvollen Message abgefangen, damit der Anwender noch die Möglichkeit hat seinen Drucker einzuschalten, Papier nachzulegen usw. Nachdem der Anwender mit OK bestätigt, soll dann erst der Hintergrunddruck erfolgen, vorausgesetzt es klappt dann, ansonsten wieder Meldung. Eigentlich müßte das was ich machen möchte doch ganz einfach sein MS merkt doch auch, daß was nicht stimmt, sonst käme ja die Meldung nicht! Gruß Christoph |
Re: Druckerstatus
Die Funktion GetPrinter() mit dem Level 6 aufrufen. Dazu wird die Struktur
PRINTER_INFO_6 (in Unit WinSpool)benötigt. |
Re: Druckerstatus
Huch, hab sowas noch nicht gemacht, wie rufe ich denn so eine Funktion auf?
|
Re: Druckerstatus
Siehe:
![]() In diesem Sourcecode wird mit Level 2 gearbeitet und mit Level 2 erhältst du weit mehr Infos als du eigentlich brauchst. Der Druckerstatus steckt im Feld "Status". |
Re: Druckerstatus
Also, hier geht es ja richtig in die Windows Programmierung. Ich arbeite mit Win98, Printer_Info_6 ist aber für Windows NT.
Habe ich das richtig verstanden, wenn ich die Printer_Info_2 verwende muß ich nur den Status abfragen? Doch was kann ich daraus interpretieren? So ganz ist mir das noch nicht klar. Hat Delphi selbst keine Möglichkeit? |
Re: Druckerstatus
Zitat:
Siehe PRINTER_STATUS_PAUSED, PRINTER_STATUS_WAITING, ... Zitat:
unzureichend und auch QuickReport ist voller Bugs. |
Re: Druckerstatus
Hallo Shima,
erst mal vielen Dank für Deine Hilfe. Leider komme ich mit meinem Problem trotzdem nicht weiter. Habe mich nun die ganzen letzten Tage damit rumgeschlagen. Wahrscheinlich reichen meine Kenntnisse dafür einfach noch nicht aus.
Delphi-Quellcode:
Vielleicht kannst Du mir mal eine kleinen Lehrgang erteilen oder sagen was ich alles machen muß.
// WinWord starten
try MSWord := CreateOleObject('Word.Application'); except ShowMessage('Ich kann Microsoft Word nicht starten.'); end; // WinWord anzeigen nur für Testzwecke := true MSWord.Visible := false; MSWord.Documents.Open(FileName:=Verzeichnis + '\' + 'Standard-Serienbrief.doc'); MSWord.ActiveDocument.MailMerge.OpenDataSource (Name:=Verzeichnis + '\' + 'SelAdressen.txt'); MSWord.Selection.Font.Name := 'Times New Roman'; MSWord.Selection.Font.Size := 12; if Anzahl <> 0 then begin MSWord.ActiveDocument.MailMerge.Destination := 0; MSWord.ActiveDocument.MailMerge.MailAsAttachment := False; MSWord.ActiveDocument.MailMerge.MailAddressFieldName := ''; MSWord.ActiveDocument.MailMerge.MailSubject := ''; MSWord.ActiveDocument.MailMerge.SuppressBlankLines := True; for I := 1 to Anzahl do begin MSWord.ActiveDocument.MailMerge.DataSource.FirstRecord := 1; MSWord.ActiveDocument.MailMerge.DataSource.LastRecord := -16; end; MSWord.ActiveDocument.MailMerge.Execute; end; // Ausdrucken >>>>> Hier möchte ich gerne prüfen, ob der Drucker bereit ist <<<<<< MSWord.Application.PrintOut(Background := false, Range := 0, Item := 0, Copies := 1, PageType := 0); //Dateien schließen MSWord.Documents.Close(SaveChanges := 0); //MSWord schließen MSWord.Application.Quit; MSWord := Unassigned; Gruß Christoph [edit=Matze][delphi]-Tags repariert. Mfg, Matze[/edit] |
Re: Druckerstatus
Du kannst eigentlich auf den Windows-Spooler vertrauen:
dieser sorgt dafür, dass Dokumente ausgedruckt werden, sobald der Drucker zum Druck bereit wird. Dies funktioniert auch nach einem Reboot. Du möchtest wahrscheinlich verhindern, dass ein Benutzer viele Druckjobs absetzt, der Drucker aber nicht bereit ist. Im Extremfall könnte so die Arbeiten von Stunden verlorengehen. Dann wäre es doch ratsamer, nur zu Prüfen, wieviele Druckaufträge gerade im Spooler sind. Sind mehr als 3 Druckaufträge vorhanden dann bringt dein Programm diese Meldung: Zitat:
Delphi-Quellcode:
Jetzt bleibt nur noch das Problem, den aktuell eingestellten Druckername von WinWord
var
info :TPrinterInfo2Easy; begin GetPrinterInfo2(druckername,info); // aus Code-Library; siehe Link aus früherem Posting if info.cJobs > 3 then begin // Meldung ausgeben if MessageDlg(Format('Es sind %d Druckaufträge im Spooler für Drucker "%s".'#13#10, [info.cJobs, info.PrinterName])+ 'Wollen Sie einen weiteren Auftrag hinzufügen ?', mtConfirmation, [mbOK, mbCancel], 0) = mrCancel then Abort; end; zu ermitteln. Das wäre aber eine eigene Frage. |
Re: Druckerstatus
So, ich hab es mal versucht, aber irgend etwas paßt da wohl noch nicht.
Eigentlich will ich nur den Anwender darauf hinweisen seinen Drucker einzuschalten und hatte nun angenommen das über den Status zu erreichen. Ich habe Dir einmal die Inhalte zusammengestellt:
Delphi-Quellcode:
Info.ServerName ''
Info.PrinterName 'EPSON Stylus DX5000 Series' Info.ShareName '' Info.PortName 'EPUSB1:' Info.DriverName 'EPSON Stylus DX5000 Series' Info.Comment '' Info.Location '' Info.SepFile '' Info.PrintProcessor 'EPSON Color Print Processor(70)' Info.Datatype 'RAW' Info.Parameters '' Info.Attributes '2116' Info.Priority '1' Info.DefaultPriority '0' Info.StartTime '0' Info.UntilTime '0' Info.Status '0' Info.cJobs '0' Info.AveragePPM '0' Info.Status und Info.cJobs sind immer gleich '0', ob der Drucker nun eingeschaltet ist oder nicht. Wie gesagt, ich möchte nur den Anwender dazu veranlassen seinen Drucker anzuschalten. Nach Bestätigung versuche ich den Ausdruck noch einmal, klappte es ist's gut, wenn nicht neue Message. |
Re: Druckerstatus
Moin,
der Info.Status ist bei mir auch immer gleich 0. Info.cJobs gibt die Anzahl der aktuellen Druckaufträge an, das funktioniert bei mir jedoch. Folgender Code funktioniert zumindest bei mir unter Win98 mit meinem Drucker:
Delphi-Quellcode:
Ob das immer funktioniert ist natürlich eine andere Sache. Der Code musste ansonsten wohl noch etwas überarbeitet werden.
procedure TForm1.Button1Click(Sender: TObject);
var Needed: DWORD; Device, Driver, Port : array[0..200] of char; hPrinter, hDeviceMode : THandle; Buffer : Pointer; hDevice: cardinal; begin Printer.PrinterIndex := -1; Printer.GetPrinter(Device, Driver, Port, hDeviceMode); if WinSpool.OpenPrinter(@Device, hPrinter, nil) then begin GetPrinter(hPrinter, 2, nil, 0, @Needed); GetMem(Buffer, Needed); if GetPrinter(hPrinter, 2, Buffer, Needed, @Needed) then if TPrinterInfo2A(Buffer^).pPortName <> nil then begin hDevice:= CreateFile(PChar('\\.\'+TPrinterInfo2A(Buffer^).pPortName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); if hDevice <> INVALID_HANDLE_VALUE then begin CloseHandle(hDevice); Showmessage('Der Drucker ist online.'); end else Showmessage('Der Drucker ist offline.') end; FreeMem(Buffer, Needed); WinSpool.ClosePrinter(hPrinter); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 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