Thread View: borland.public.delphi.language.objectpascal
1 messages
1 total messages
Started by zeina
Wed, 19 Sep 2007 00:14
Change Printer settings
Author: zeina
Date: Wed, 19 Sep 2007 00:14
Date: Wed, 19 Sep 2007 00:14
112 lines
4339 bytes
4339 bytes
I have the adobe printer installed into my system, in the Adobe
Acrobat profitional 8 the printer has a settings such as (view pdf
result, pdf output folder) I need to change them from my program, I
did some research over the net and I found this code, when I try it I
had an error (Abstract Error) so what I'm missing?? And is there
another way to achieve my goal??
thanks
code :
procedure TForm1.LoadPrinterInfo(APrinterName: PChar; ASourceStream:
TStream);
var
HPrinter : THandle;
InfoSize,
BytesNeeded: Cardinal;
PI2: PPrinterInfo2;
PrinterDefaults: TPrinterDefaults;
begin
with PrinterDefaults do
begin
DesiredAccess := PRINTER_ACCESS_USE;
pDatatype := nil;
pDevMode := nil;
end;
if OpenPrinter(APrinterName, HPrinter, @PrinterDefaults) then
try
SetLastError(0);
//Determine the number of bytes to allocate for the PRINTER_INFO_2
construct...
if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then
begin
//Allocate memory space for the PRINTER_INFO_2 pointer
(PrinterInfo2)...
PI2 := AllocMem(BytesNeeded);
try
InfoSize := SizeOf(TPrinterInfo2);
if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded)
then
begin
PI2.pSecurityDescriptor := nil;
ASourceStream.ReadBuffer(PChar(PI2)[InfoSize], BytesNeeded -
InfoSize); // the error line
// Apply settings to the printer
if DocumentProperties(0, hPrinter, APrinterName,
PI2.pDevMode^,
PI2.pDevMode^, DM_IN_BUFFER or
DM_OUT_BUFFER) = IDOK then
begin
SetPrinter(HPrinter, 2, PI2, 0); // Ignore the result of
this call...
end;
end;
finally
FreeMem(PI2, BytesNeeded);
end;
end;
procedure TForm1.SetPrinterSettings(FPrinter: TPrinter);
var
FDevice: PChar;
FDriver: PChar;
FPort: PChar;
DeviceMode: THandle;
DevMode: PDeviceMode;
begin
{to get a current printer settings}
FPrinter.GetPrinter(FDevice, FDriver, FPort, DeviceMode);
{lock a printer device}
DevMode := GlobalLock(DeviceMode);
{set a paper size as A4-Transverse}
if ((DevMode^.dmFields and DM_PAPERSIZE) = DM_PAPERSIZE) then
begin
DevMode^.dmFields := DevMode^.dmFields or DM_PAPERSIZE;
DevMode^.dmPaperSize := DMPAPER_A4_TRANSVERSE;
end;
{set a paper source as Tractor bin}
if ((DevMode^.dmFields and DM_DEFAULTSOURCE) = DM_DEFAULTSOURCE)
then
begin
DevMode^.dmFields := DevMode^.dmFields or DM_DEFAULTSOURCE;
DevMode^.dmDefaultSource := DMBIN_TRACTOR;
end;
{set a Landscape orientation}
if ((DevMode^.dmFields and DM_ORIENTATION) = DM_ORIENTATION) then
begin
DevMode^.dmFields := DevMode^.dmFields or DM_ORIENTATION;
DevMode^.dmOrientation := DMORIENT_LANDSCAPE;
end;
{set a printer settings}
FPrinter.SetPrinter(FDevice, FDriver, FPort, DeviceMode);
{unlock a device}
GlobalUnlock(DeviceMode);
end;
finally
ClosePrinter(HPrinter);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
s:Tstream;
begin
s:= Tstream.Create;
LoadPrinterInfo(pchar('Adobe PDF'),s);
end ;
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads