Ich versuche mich gerade daran einen eigenen Drucker Dialog zu erstellen, quasi den Dialog der erscheint beim Aufruf von PrintDialog.Execute nach zu bilden.
Das ganze findet mit Delphi 2007 unter Windows XP statt. Bisher sieht alles gut aus nur habe ich noch so meine Probleme mit dem Status des Druckers.
Ich bekomme zwar einen Status abgefragt jedoch nur als Cardinal und da frage ich mich komme ich irgendwie an die entsprechenden Texte oder muss ich die selbst machen?!
Was mich auch stutzig macht ist das diese Drucker quasi 2 Status Informationen bereithält. "Wenig Toner" und "0 Dokumente warten" zu letzterem konnte ich kein Status Flag in der WinSpool.pas finden. (Siehe Anhang)
Ich würde mich wohl schon zufrieden geben wenn ich eine offizielle Liste finden würde mit der ich den Status in deutsch umwandeln könnte.
Delphi-Quellcode:
var
ADevice: array[0..MAX_PATH-1] of Char;
ADriver: array[0..MAX_PATH-1] of Char;
APort: array[0..MAX_PATH-1] of Char;
ADeviceMode: THandle;
procedure TfrmPartsListPrintDialog.cmbPrinterSelect(Sender: TObject);
var
hPrinter: THandle;
BytesNeeded: DWORD;
pInfo: PPrinterInfo2;
begin
//Drucker auswähl ändern
Printer.PrinterIndex := cmbPrinter.ItemIndex;
//Neuen Drucker auswählen
Printer.GetPrinter(ADevice, ADriver, APort, ADeviceMode);
if OpenPrinter(ADevice, hPrinter, nil) then begin
try
GetPrinter(hPrinter, 2, nil, 0, @BytesNeeded);
pInfo := AllocMem(BytesNeeded);
try
GetPrinter(hPrinter, 2, pInfo, BytesNeeded, @BytesNeeded);
//Hier käme sowas wie "StatusToString" hin ...
lblType.Caption := pInfo^.pDriverName;
lblLocation.Caption := pInfo^.pLocation;
lblComment.Caption := pInfo^.pComment;
finally
FreeMem(pInfo);
end;{try..finally}
finally
ClosePrinter(hPrinter);
end;{try..finally}
end;{if}
end;