Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bug in printers.pas beim Umstellen des Druckers (https://www.delphipraxis.net/144502-bug-printers-pas-beim-umstellen-des-druckers.html)

DelphiBandit 9. Dez 2009 07:36


Bug in printers.pas beim Umstellen des Druckers
 
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);

BadenPower 1. Dez 2014 10:25

AW: Bug in printers.pas beim Umstellen des Druckers
 
Hallo zusammen,

ich hänge mich einmal an diesen Post, das Problem mit den Druckereinstellungen bei mir immer noch ist.

Delphi2007

Ich habe die printer.pas bereits angepasst.

Die Auswahl des Druckers und die Papiergröße geht über TPrinterSetupDialog.

Wenn ich nun die PrinterSetupDialog.Execute ausführe und die Papiergöße ändere, dann wird die in der devMode-Struktur, welche ich über Printer.GetPrintewr erhalte der Wert von pDevmode^.dmPaperLength nicht geändert.

Rufe ich den SetupDialog nochmals auf und beende ihn, ohne etwas zu ändern, dann sind die Werte plötzlich richtig.


Hat jemand noch eine Idee, was in der printer.pas geändert werden muss, oder liegt das Problem hier irgendwo anderst.

Ein Vergleich einer 2009 oder 2010 printer.pas wäre perfekt, aber leider finde ich im Netz keinen Quellcode der Datei.

viele Grüße
BadenPower

himitsu 1. Dez 2014 10:34

AW: Bug in printers.pas beim Umstellen des Druckers
 
Hab diese Versionen aktuell nicht installiert und kann nicht nachsehn.

Zitat:

Zitat von BadenPower (Beitrag 1281782)
aber leider finde ich im Netz keinen Quellcode der Datei.

Diese Dateien sollte es eigentlich dort auch nicht geben, da man sie ausschließlich beim Kauf eines Delphi (ab Prof) erhält.

DeddyH 1. Dez 2014 10:36

AW: Bug in printers.pas beim Umstellen des Druckers
 
Aber der Lazarus-Code ist AFAIK einsehbar, vielleicht besteht das Problem dort nicht?

Bjoerk 1. Dez 2014 11:03

AW: Bug in printers.pas beim Umstellen des Druckers
 
Mal Printer.Refresh versucht?
Delphi-Quellcode:
var
  Device, Driver, Port: array [0..200] of char;
  DeviceMode: Cardinal;
begin
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  if DeviceMode <> 0 then
  begin
    Result := Device;
    Printer.Refresh; // ***
  end
  else
    Result := 'Druckstatus';
end;

BadenPower 1. Dez 2014 12:34

AW: Bug in printers.pas beim Umstellen des Druckers
 
Hallo zusammen,

Zitat:

Zitat von Bjoerk (Beitrag 1281791)
Mal Printer.Refresh versucht?

Bringt auch keine Änderung.


So, habe nun noch ein bischen herumgepielt.

Wenn ich nur die Papiergröße im Dialog umstelle, dann ist die PaperLength-Angabe immer die, welche 1 zuvor ausgewählt wird.

Wenn ich also den Dialog beim 2. mal beende habe ich die Einstellung vom 1. mal. Rufe ich es ein drittes mal auf, dann habe ich die Einstllung vom 2.mal.

Wenn ich aber auch gleichzeitig die Druckqualität ändere, dann stimmt auch die Papierlänge.

Muss mir mal die printers.pas nochmals genauer vormehmen.

.


EDIT:

So habe noch eine neue Erkenntnis erlangt.

Rufe ich im TPrinterSetupDialog "Einstellungen" für den Drucker auf und ändere dort die Papiergröße, dann wird es auch sofort automatisch richtig übernommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 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