Reputation: 159
I have been looking for a way of retrieving the papers supported by an specific printer and their sizes (width and height) in millimeters if possible.
I have seen and "Studied" many posts and sites about using Printer.Getprinter
and Printer.SetPrinter
but I am really far from understanding the whole process to make that work, I learnt that I have to use DeviceCapabilities
in order to retrieve data that is specific to one printer but I really don't know how to use those structures. I need something similar to this but for a specific printer and using the DeviceCapabilities
.
I use Delphi VCL.
In the question linked, they use EnumForms
which I understand is for all the printers, they also mention that DeviceCapabilities
is for a specific printer, and that is what I need, to get the supported paper names and sizes but only for the selected printer and not all of them.
lets say I select my printer: Printer.PrinterIndex:= Printer.Printers.IndexOf(MyPrinter);
I would like to get the papers and paper sizes for those supported by that printer.
Thank you so much for any help provided!
Upvotes: 0
Views: 1456
Reputation: 54772
Here is an example that calls DeviceCapabilities
for the currently selected printer and outputs supported paper names for "the current default initialization values for the specified printer driver" to a memo. The quoted part in the previous sentence is from the documentation of the function and I'm not absolutely positive that I understand what it means. That happens because a DevMode
is not passed.
procedure TForm1.Button1Click(Sender: TObject);
var
PrinterName: string;
HPrinter: THandle;
Ret: DWORD;
Buf: array of array [0..63] of Char;
i: Integer;
begin
PrinterName := Printer.Printers[Printer.PrinterIndex];
if OpenPrinter(PChar(PrinterName), HPrinter, nil) then begin
Ret := DeviceCapabilities(PChar(PrinterName), nil, DC_PAPERNAMES, nil, nil);
if Ret > 0 then begin
SetLength(Buf, Ret);
DeviceCapabilities(PChar(PrinterName), nil, DC_PAPERNAMES, Pointer(Buf), nil);
for i := 0 to Ret - 1 do
Memo1.Lines.Add(Buf[i]);
end;
ClosePrinter(HPrinter);
end;
end;
Explaining the code is kind of pointless, I'd be duplicating the documentation. I included the link above.
Upvotes: 2