diff --git a/components/printers/sample/frmselprinter.lrs b/components/printers/sample/frmselprinter.lrs
index 230bd587ee..53f3b7d782 100644
--- a/components/printers/sample/frmselprinter.lrs
+++ b/components/printers/sample/frmselprinter.lrs
@@ -1,4 +1,4 @@
-{ To jest automatycznie wygenerowany plik zasobów lazarusa }
+{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TForm1','FORMDATA',[
'TPF0'#6'TForm1'#5'Form1'#13'ActiveControl'#7#7'Button2'#7'Caption'#6#5'Form1'
diff --git a/components/printers/sample/frmselprinter.pas b/components/printers/sample/frmselprinter.pas
index af99bccb66..b3008e704f 100644
--- a/components/printers/sample/frmselprinter.pas
+++ b/components/printers/sample/frmselprinter.pas
@@ -85,6 +85,11 @@ begin
SGrid.Clean;
with Printer do
begin
+ if Printers.Count=0 then
+ begin
+ AddInfo('printer', 'no printers are installed');
+ exit;
+ end;
AddInfo('Printer',Printers[PrinterIndex]);
case Orientation of
poPortrait : AddInfo('Orientation','Portrait');
@@ -129,7 +134,7 @@ end;
procedure TForm1.Button3Click(Sender: TObject);
begin
- Printer.PrinterIndex := 0;
+ Printer.PrinterIndex := -1;
UpdatePrinterInfo;
end;
diff --git a/components/printers/sample/selectprinter.lpi b/components/printers/sample/selectprinter.lpi
index 54a84071d5..0c87348e47 100644
--- a/components/printers/sample/selectprinter.lpi
+++ b/components/printers/sample/selectprinter.lpi
@@ -16,24 +16,24 @@
-
+
-
+
-
+
-
+
-
+
@@ -41,7 +41,7 @@
-
+
@@ -49,7 +49,7 @@
-
+
diff --git a/components/printers/win32/winprinters.inc b/components/printers/win32/winprinters.inc
index 22de0e5cfc..2b3b360b43 100644
--- a/components/printers/win32/winprinters.inc
+++ b/components/printers/win32/winprinters.inc
@@ -324,6 +324,22 @@ begin
end;
end;
+function TWinPrinter.DoGetPaperName: string;
+var i : Integer;
+ PDev : TPrinterDevice;
+begin
+ Result:=inherited DoGetPaperName;
+
+ if (Printers.Count>0) then
+ begin
+ PDev:=TPrinterDevice(Printers.Objects[PrinterIndex]);
+
+ i:=PaperSize.SupportedPapers.IndexOfObject(TObject(ptrint(PDev.Devmode.dmPaperSize)));
+ if i<>-1 then
+ Result:=PaperSize.SupportedPapers.Strings[i];
+ end;
+end;
+
function TWinPrinter.DoGetDefaultPaperName: string;
var i : Integer;
PDev : TPrinterDevice;
diff --git a/components/printers/win32/winprinters_h.inc b/components/printers/win32/winprinters_h.inc
index 51edb9626e..94dd88c6c7 100644
--- a/components/printers/win32/winprinters_h.inc
+++ b/components/printers/win32/winprinters_h.inc
@@ -28,6 +28,9 @@ uses
Classes, SysUtils,Printers,LCLType,{Forms,}Windows;//,dialogs;
Type
+
+ { TWinPrinter }
+
TWinPrinter = class(TPrinter)
private
//fDefaultPrinter : String;
@@ -51,6 +54,7 @@ Type
procedure DoResetPrintersList; override;
procedure DoEnumPapers(Lst : TStrings); override;
+ function DoGetPaperName: string; override;
function DoGetDefaultPaperName: string; override;
procedure DoSetPaperName(aName : string); override;
function DoGetPaperRect(aName : string; Var aPaperRc : TPaperRect) : Integer; override;
diff --git a/components/printers/win32/winprndialogs.inc b/components/printers/win32/winprndialogs.inc
index c01caf8d65..2bf31bac79 100644
--- a/components/printers/win32/winprndialogs.inc
+++ b/components/printers/win32/winprndialogs.inc
@@ -75,7 +75,7 @@ begin
CopyMemory(@PDev.DevMode,DevMode,sizeof(Pdev.DevMode));
PDev.DevMode.dmSize := SizeOf(PDev.DevMode);
PDev.DevMode.dmDriverExtra := 0;
- PDev.DefaultPaper := DevMode^.dmPaperSize;
+ PDev.DevMode.dmPaperSize := DevMode^.dmPaperSize;
finally
GlobalUnlock(lpp.hDevMode);
end;
@@ -158,7 +158,7 @@ begin
CopyMemory(@PDev.DevMode,DevMode,sizeof(Pdev.DevMode));
PDev.DevMode.dmSize := SizeOf(PDev.DevMode);
PDev.DevMode.dmDriverExtra := 0;
- PDev.DefaultPaper := DevMode^.dmPaperSize;
+ PDev.DevMode.dmPaperSize := Devmode^.dmPaperSize;
TWinPrinter(Printer).Handle := hDC;
finally
GlobalUnlock(lpp.hDevMode);
@@ -261,11 +261,11 @@ begin
CopyMemory(@PDev.DevMode,DevMode,sizeof(Pdev.DevMode));
PDev.DevMode.dmSize := SizeOf(PDev.DevMode);
PDev.DevMode.dmDriverExtra := 0;
- if Printer.PaperSize.SupportedPapers.IndexOfObject(TObject(Integer(DevMode^.dmPaperSize))) <> -1
+ if Printer.PaperSize.SupportedPapers.IndexOfObject(TObject(ptrint(DevMode^.dmPaperSize))) <> -1
then
- PDev.DefaultPaper := DevMode^.dmPaperSize
- else
- PDev.DefaultPaper := Integer(Printer.PaperSize.SupportedPapers.Objects[0]);
+ PDev.DevMode.dmPaperSize := DevMode^.dmPaperSize
+ else
+ PDev.DevMode.dmPaperSize := PDev.DefaultPaper;
if nCopies=1 then Copies := DevMode^.dmCopies
else
Copies := nCopies;
diff --git a/lcl/printers.pas b/lcl/printers.pas
index 8e05b8f8b0..f680edf89d 100644
--- a/lcl/printers.pas
+++ b/lcl/printers.pas
@@ -355,8 +355,25 @@ end;
//Set the current printer
procedure TPrinter.SetPrinter(aName: String);
-var i : Integer;
+var
+ i,oldIndex : Integer;
begin
+ if aName='*' then begin
+ // select default printer
+ OldIndex := FPrinterIndex;
+ fPrinterIndex := -1; // avoid to remember last printer
+ Refresh;
+ if Printers.count>0 then begin
+ i:= doSetprinter(FPrinters[0]); // now first printer is default
+ if i<>0 then begin
+ // something went wrong, try to restore old printer
+ if OldIndex>=0 then
+ FPrinterIndex := doSetPrinter(FPrinters[OldIndex]);
+ raise EPrinter.Create('Unable to set default printer!');
+ end else
+ FPrinterIndex := i;
+ end;
+ end else
if (Printers.Count>0) then
begin
if (aName<>'') then
@@ -511,16 +528,17 @@ begin
CheckPrinting(False);
if Printers.Count>0 then
begin
- aName:='*';
if AValue=-1 then
- AValue:=0 {Default printer}
+ aName:='*'
else
- if AValue=0) and (AValueDefaultPaperName then
fOwnedPrinter.DoSetPaperName(aName)
end
- else raise EPrinter.Create(Format('Paper "%s" not supported !',[aName]));
+ else
+ raise EPrinter.Create(Format('Paper "%s" not supported !',[aName]));
end;
//Return an TPaperRect corresponding at an paper name