在Win98中改变默认打印机的属性(80分)

  • 主题发起人 吴向球
  • 开始时间

吴向球

Unregistered / Unconfirmed
GUEST, unregistred user!
在Win98中改变默认打印机的属性
问题是这样的:
   现在欲打印一个报表,但是纸张大小为自定义,大概width为254 millimeters,
length 为260 millimeters,并且打印控件为QuickReport,如果不改变打印机的纸张
大小属性就不能打出来,在改变了属性之后就搞定了。但是现在想在程序中改变,
在打印完成之后又再改回来。
用下面的语句实现:
//得到纸张的尺寸
Printer.PrinterIndex ;
//选择默认的打印机
if ADeviceMode = 0 then
begin
Printer.GetPrinter(ADevice,ADriver,APort,ADeviceMode);
end;
if ADeviceMode <> 0 then
begin
DevMode := GlobalLock(ADeviceMode);
try
DevMode^.dmFields :=DevMode^.dmFields or DM_PAPERSIZE;
ASize := DevMode^.dmPaperSize ;  //将打印尺寸给一全局变量
finally
GlobalUnlock(ADeviceMode);
end;
end
//更改纸张的尺寸
if ADeviceMode = 0 then
begin
Printer.GetPrinter(ADevice,ADriver,APort,ADeviceMode);
end;
if ADeviceMode <> 0 then
begin
DevMode := GlobalLock(ADeviceMode);
try
DevMode^.dmFields :=DevMode^.dmFields or DM_PAPERSIZE;
DevMode^.dmPaperSize := $100 ;  //改为自定义纸张大小
// DevMode^.dmPaperLength := 260 ;
// DevMode^.dmPaperWidth := 254 ;
finally
GlobalUnlock(ADeviceMode);
end;
end

//恢复纸张的尺寸
if ADeviceMode = 0 then
begin
Printer.GetPrinter(ADevice,ADriver,APort,ADeviceMode);
end;
if ADeviceMode <> 0 then
begin
DevMode := GlobalLock(ADeviceMode);
try
DevMode^.dmFields :=DevMode^.dmFields or DM_PAPERSIZE;
DevMode^.dmPaperSize := ASize;   //恢复默认的设置
finally
GlobalUnlock(ADeviceMode);
end;
end
请问这样做对不对:
如果正确,为什么看不到效果;
如果不正确,应该怎么样写??请各位不赐吝教!!!
 
奇怪,怎么没有人来回答呢???这个问题对高手来说应该不难吧!!
 
我没有细看你的程序,但你的思路是对的,不过有一个问题,这个思路在98/95下可以,
但是在nt或2000下就不行了,也许是这个原因。
 
也可用setprinter(....)
 
to ht99:
我现在是在win98下!!!
请指点!!
 
to zwma:
用setprinter()怎么实现,能写代码吗??
 
var FDevice, FDriver, FPort:array [0..255] of char;
DeviceMode,HPrt:THandle;DevMode:pDeviceMode;
begin
Printer.GetPrinter(FDevice, FDriver, FPort, DeviceMode);
DevMode := GlobalLock(DeviceMode);
OpenPrinter(FDevice, HPrt, nil);
begin
DevMode^.dmFields := DevMode^.dmFields or dm_paperlength;
DevMode^.dmPaperLength := trunc((Sender as TCustomQuickRep).Page.Length);
DevMode^.dmFields := DevMode^.dmFields or dm_paperwidth;
DevMode^.dmPaperWidth := trunc((Sender as TCustomQuickRep).Page.Width);
DevMode^.dmFields := DevMode^.dmFields or dm_papersize;
DevMode^.dmPaperSize := DMPAPER_USER;
end;
SetPrinter(HPrt,2,DeviceMode,PRINTER_CONTROL_SET_STATUS);
do
cumentProperties(DeviceMode,HPrt,FDevice,DevMode^,DevMode^,DM_IN_BUFFER or DM_UPDATE);
GlobalUnlock(DeviceMode);
ClosePrinter(HPrt);
end;
 
使用quickreport直接设置纸张大小即可
 
接受答案了.
 
顶部