Einzelnen Beitrag anzeigen

Benutzerbild von DelphiBandit
DelphiBandit

Registriert seit: 19. Feb 2007
Ort: In der Lüneburger Heide
165 Beiträge
 
Delphi 10.4 Sydney
 
#1

Bug in printers.pas beim Umstellen des Druckers

  Alt 9. Dez 2009, 08:36
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);
Carsten
  Mit Zitat antworten Zitat