Problem: Ansteuerung eines Papiereinzugschachts bis Version 3.5<p>
Wenn im Druckersetup-Dialog ein anderer Schacht ausgewählt wird, so
interessiert das Quickreport herzlich
wenig. Er druckt immer aus dem Standardschacht.
Nach Wühlen in den Quellen habe ich festgestellt, dass an bestimmten
Stellen die Druckereinstellungen zurückgesetzt werden -
ich weiss bis heute nicht warum. Dies führte aber zu dem Problem. Ich habe
die entsprechenden Stellen angepaßt und arbeite
schon ein paar Monate ohne Probleme mit dieser Version. Es kann natürlich
sein, dass bei einem bei mir nicht vorkommenden
Einsatzfall QuickReport fehlerhaft reagiert - das muss einfach getestet
werden.
Hier die Problemlösung:
<pre>
1. Um die Änderungen bei Bedarf leicht ungeschehen machen zu können,
einfach einen Compilerschalter in QRDEFS.INC eintragen, z.B.
{$DEFINE BINPATCH}
2.Änderungen in QRPRNTR.PAS:
procedure TPrinterSettings.ApplySettings;
begin
{$IFDEF BINPATCH}
Exit;
{$ENDIF}
FPrinter.GetPrinter(FDevice, FDriver, FPort, DeviceMode);
DevMode := GlobalLock(DeviceMode);
if PaperSize = Custom then
begin
if Supported(dm_paperlength) then
begin ........
....
procedure ResetDriver(aPrinter : TPrinter);
var
Device, Name, Port: array[0..255] of Char;
DevMode: THandle;
begin
aPrinter.GetPrinter( Device, Name, Port , DevMode );
{$IFNDEF BINPATCH}
aPrinter.SetPrinter( Device, Name, Port , 0 );
{$ENDIF}
end;
...
constructor TQRPrinter.Create;
begin
{$ifdef EvalVersion}
if not DelphiRunning then
begin
ShowMessage('This evaluation copy of QuickReport only works while Delphi is running. '+
'Please contact QuSoft to order a full version');
Application.Terminate;
end;
{$endif}
FPrinterOK := Printer.Printers.Count > 0;
{$IFDEF BINPATCH}
aPrinter := Printer;
{$ELSE}
aPrinter := TPrinter.Create;
{$ENDIF}
aPrinterSettings := TPrinterSettings.Create;
if PrinterOK then
begin .............
destructor TQRPrinter.Destroy;
begin
if Status <> mpReady then
Cleanup;
if FCloseControl <> nil then
FCloseControl.Free;
{$IFNDEF BINPATCH}
aPrinter.Free;
{$ENDIF}
aPrinterSettings.Free;
PageList.Free...............
3. Änderungen in QuickRpt.pas
procedure TCustomQuickRep.PrinterSetup;
var
aDialog : TQRPrintDialog;
Device,
Driver,
Port : array[0..255] of char;
hDMode : THandle;
begin
aDialog := TQRPrintDialog.Create(Application);
aDialog.Printer := Printers.Printer;
aDialog.Printer.GetPrinter(Device, Driver, Port, hDMode);
{$IFNDEF BINPATCH}
aDialog.Printer.SetPrinter(Device, Driver, Port, 0);
{$ENDIF}
aDialog.Printer.PrinterIndex := PrinterSettings.PrinterIndex;
with aDialog do
try...................................
</pre>
Das wars.
Der bei QuSoft angebotene Patch hilft nicht weiter, wenn der User den Schacht selbst auswählen soll.
Wenn im Druckersetup-Dialog ein anderer Schacht ausgewählt wird, so
interessiert das Quickreport herzlich
wenig. Er druckt immer aus dem Standardschacht.
Nach Wühlen in den Quellen habe ich festgestellt, dass an bestimmten
Stellen die Druckereinstellungen zurückgesetzt werden -
ich weiss bis heute nicht warum. Dies führte aber zu dem Problem. Ich habe
die entsprechenden Stellen angepaßt und arbeite
schon ein paar Monate ohne Probleme mit dieser Version. Es kann natürlich
sein, dass bei einem bei mir nicht vorkommenden
Einsatzfall QuickReport fehlerhaft reagiert - das muss einfach getestet
werden.
Hier die Problemlösung:
<pre>
1. Um die Änderungen bei Bedarf leicht ungeschehen machen zu können,
einfach einen Compilerschalter in QRDEFS.INC eintragen, z.B.
{$DEFINE BINPATCH}
2.Änderungen in QRPRNTR.PAS:
procedure TPrinterSettings.ApplySettings;
begin
{$IFDEF BINPATCH}
Exit;
{$ENDIF}
FPrinter.GetPrinter(FDevice, FDriver, FPort, DeviceMode);
DevMode := GlobalLock(DeviceMode);
if PaperSize = Custom then
begin
if Supported(dm_paperlength) then
begin ........
....
procedure ResetDriver(aPrinter : TPrinter);
var
Device, Name, Port: array[0..255] of Char;
DevMode: THandle;
begin
aPrinter.GetPrinter( Device, Name, Port , DevMode );
{$IFNDEF BINPATCH}
aPrinter.SetPrinter( Device, Name, Port , 0 );
{$ENDIF}
end;
...
constructor TQRPrinter.Create;
begin
{$ifdef EvalVersion}
if not DelphiRunning then
begin
ShowMessage('This evaluation copy of QuickReport only works while Delphi is running. '+
'Please contact QuSoft to order a full version');
Application.Terminate;
end;
{$endif}
FPrinterOK := Printer.Printers.Count > 0;
{$IFDEF BINPATCH}
aPrinter := Printer;
{$ELSE}
aPrinter := TPrinter.Create;
{$ENDIF}
aPrinterSettings := TPrinterSettings.Create;
if PrinterOK then
begin .............
destructor TQRPrinter.Destroy;
begin
if Status <> mpReady then
Cleanup;
if FCloseControl <> nil then
FCloseControl.Free;
{$IFNDEF BINPATCH}
aPrinter.Free;
{$ENDIF}
aPrinterSettings.Free;
PageList.Free...............
3. Änderungen in QuickRpt.pas
procedure TCustomQuickRep.PrinterSetup;
var
aDialog : TQRPrintDialog;
Device,
Driver,
Port : array[0..255] of char;
hDMode : THandle;
begin
aDialog := TQRPrintDialog.Create(Application);
aDialog.Printer := Printers.Printer;
aDialog.Printer.GetPrinter(Device, Driver, Port, hDMode);
{$IFNDEF BINPATCH}
aDialog.Printer.SetPrinter(Device, Driver, Port, 0);
{$ENDIF}
aDialog.Printer.PrinterIndex := PrinterSettings.PrinterIndex;
with aDialog do
try...................................
</pre>
Das wars.
Der bei QuSoft angebotene Patch hilft nicht weiter, wenn der User den Schacht selbst auswählen soll.
Comment