AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Druckerstatus

Ein Thema von Christoph Frank · begonnen am 11. Apr 2007 · letzter Beitrag vom 24. Apr 2007
Antwort Antwort
Seite 1 von 3  1 23      
Christoph Frank

Registriert seit: 6. Mär 2007
26 Beiträge
 
#1

Druckerstatus

  Alt 11. Apr 2007, 13:15
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Druckerstatus

  Alt 11. Apr 2007, 13:47
Die Funktion GetPrinter() mit dem Level 6 aufrufen. Dazu wird die Struktur
PRINTER_INFO_6 (in Unit WinSpool)benötigt.
Andreas
  Mit Zitat antworten Zitat
Christoph Frank

Registriert seit: 6. Mär 2007
26 Beiträge
 
#3

Re: Druckerstatus

  Alt 11. Apr 2007, 15:04
Huch, hab sowas noch nicht gemacht, wie rufe ich denn so eine Funktion auf?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Druckerstatus

  Alt 11. Apr 2007, 15:09
Siehe: http://www.delphipraxis.net/internal...ct.php?t=64627
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".
Andreas
  Mit Zitat antworten Zitat
Christoph Frank

Registriert seit: 6. Mär 2007
26 Beiträge
 
#5

Re: Druckerstatus

  Alt 11. Apr 2007, 16:32
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?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Druckerstatus

  Alt 12. Apr 2007, 09:01
Zitat von Christoph Frank:
Habe ich das richtig verstanden, wenn ich die Printer_Info_2 verwende muß ich nur den Status abfragen? Doch was kann ich daraus interpretieren?
Die verschiedenen Statuswerte gibt es als symbolische Konstanten in der Unit WinSpool:
Siehe PRINTER_STATUS_PAUSED, PRINTER_STATUS_WAITING, ...
Zitat von Christoph Frank:
Hat Delphi selbst keine Möglichkeit?
Nein. Die VCL behandelt das Drucken stiefmütterlich. Die Klasse TPrinter ist zum Drucken ja sehr
unzureichend und auch QuickReport ist voller Bugs.
Andreas
  Mit Zitat antworten Zitat
Christoph Frank

Registriert seit: 6. Mär 2007
26 Beiträge
 
#7

Re: Druckerstatus

  Alt 18. Apr 2007, 11:24
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:
// 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;
Vielleicht kannst Du mir mal eine kleinen Lehrgang erteilen oder sagen was ich alles machen muß.
Gruß Christoph

[edit=Matze][delphi]-Tags repariert. Mfg, Matze[/edit]
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Druckerstatus

  Alt 18. Apr 2007, 13:07
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:
Es sind 4 Druckaufträge im Spooler für Drucker "HP Desk 1000".
Wollen Sie einen weiteren Auftrag hinzufügen ?
<Ja> <Nein>
Delphi-Quellcode:
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;
Jetzt bleibt nur noch das Problem, den aktuell eingestellten Druckername von WinWord
zu ermitteln. Das wäre aber eine eigene Frage.
Andreas
  Mit Zitat antworten Zitat
Christoph Frank

Registriert seit: 6. Mär 2007
26 Beiträge
 
#9

Re: Druckerstatus

  Alt 18. Apr 2007, 16:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Druckerstatus

  Alt 18. Apr 2007, 22:20
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:
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;
Ob das immer funktioniert ist natürlich eine andere Sache. Der Code musste ansonsten wohl noch etwas überarbeitet werden.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz