Hallo zusammen,
wir haben unsere Anwendung gerade auf RadStudio 2007 umgestellt. Umso überraschter waren wir gestern, als uns das Feedback erreichte, dass die Druckerschachtwahl beim Mehrfachdruckern nicht richtig funktioniert. Auch das Ansteuern mit der unter Windows eingestellten Druckqualität funktioniert nur manchmal.
Dunkel erinnerte ich mich, dass wir seinerzeit in D5 über einen Bug in der printers.pas gestolpert waren und diese gepatched dem Druckprogramm hinzugefügt haben. Also erneut auf die Suche gemacht und hier gefunden:
http://qc.embarcadero.com/wc/qcmain.aspx?d=6725
Dieser ist als Fixed in D6 gekennzeichnet. Nun schaue ich mir die Quelltexte der printers.pas in D2007 an und stelle fest, dass genau diese entscheidenden Stellen eben nicht gefixt sind.
Ist jemand von Euch schon über den gleichen Fehler gestolpert und hat ihn so lösen können?
Des weiteren bleibt für mich die Frage offen, warum Fehler, die seit ~2000 bekannt sind nicht konsequent gefixt werden. Andere Änderungen, wie z.B. das Rücksetzen von Objektzeigern auf Nil wurden übernommen!?
Gruss
Carsten
Delphi-Quellcode:
procedure TPrinter.SetToDefaultPrinter;
var
I: Integer;
ByteCnt, StructCnt: DWORD;
DefaultPrinter: array[0..1023] of Char;
Cur, Device: PChar;
PrinterInfo: PPrinterInfo5;
begin
ByteCnt := 0;
<...>
with Printers do
for I := 0 to Count-1 do
begin
if AnsiSameText(TPrinterDevice(Objects[I]).Device, Device) then
begin
with TPrinterDevice(Objects[I]) do
SetPrinter(PChar(Device), PChar(Driver), PChar(Port), 0);
// ---------------------------------------
[ FPrinterIndex := I; // VERY IMPORTANT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! <- DIESE HIER
// ---------------------------------------
Exit;
Delphi-Quellcode:
procedure TPrinter.SetPrinterIndex(Value: Integer);
begin
CheckPrinting(False);
if (Value = -1) or (PrinterIndex = -1)
then
SetToDefaultPrinter
else
begin
if (Value < 0) or (Value >= Printers.Count)
then RaiseError(SPrinterIndexError);
FPrinterIndex := Value;
SetPrinter(PChar(TPrinterDevice(Printers.Objects[FPrinterIndex]).Device), <- DIESE HIER
PChar(TPrinterDevice(Printers.Objects[FPrinterIndex]).Driver),
PChar(TPrinterDevice(Printers.Objects[FPrinterIndex]).Port), 0);