怎样取得PrinterSetupDialog的PageSeze,(30分)

  • 主题发起人 主题发起人 typer
  • 开始时间 开始时间
T

typer

Unregistered / Unconfirmed
GUEST, unregistred user!

要设置QuickReport的Page.PageSize属性,不知
怎样取得PrinterSetupDialog的PageSeze,
 
function GetPagesize: integer;
// 如果为0表示自定义纸张
// -1表示出错
var
sDrv: Pchar;
sPrt: Pchar;
DevAdr: THandle;
p: PDeviceModeA;
begin
result := -1;
sdrv := allocmem(256);
sprt := allocmem(64);
devadr := 0;
try
printer.GetPrinter(sdrv, sdrv, sprt, devadr);
p := ptr(devadr);
// if p^.dmSize = 0
// p^.dmPageWidth 页宽 -- 0.1mm
// p^.dmPageLength 页高 -- 0.1mm
result := p^.PageSize;
finally
freemem(sdrv, 256);
freemem(sprt, 64);
end;
end;
 
上面的函数返回的是整形,
而QuickRep.Page.PaperSize
是TQRPaperSize
另外p^.PageSize好像应是P^.dmPapersize
 
:o
抱歉写错了
返回当然是整形.
试试强制类型转换吧. (除非qr用的不是windows标准的页定义).
 
强制类型转换不行,真奇怪这应是个很简单的
问题,我就是找不到答案!!
 
试试word型的强制转换.
qr的pagesize是个enumerated type,实际也就是个integer(or byte, or word).
如果不行:
告诉你个笨办法啦, 把qr里面的pagesize项一个一个抄下来, 放到一个TList中, list的顺序
按照标准windows的pagesize排列. :)
list.items[0] := pointer(integer(Custom)) // 如果编译通不过就直接
// list.items[0] := pointer(Custom) 或者 @Custom
......
使用时根据返回的integer到list中找相应的项附给qr
 
如果不怕运行时出错的话,还有个办法:
var
x: TQRPageSize;
i: Integer;
begin
i := getpagesize;
// 上面的例子
move(i, x, sizeof(TQRPageSize));
quickrep1.Page.PageSize := x;
end;
 
PrinterSetupDialog没有任何属性返回,她只跟系统打交道.请在
PrinterSetupDialog运行后访问TPrinter 变量的属性.
 
to Another_eYes:
我也觉得qr的papersize是个枚举类型,但这应该
跟机器有关的,如果把qr里面的papersize项一个一个
抄下来, 放到一个TList中,好像并不准确.
to kellgates:
PrinterSetupDialog确实没有任何属性返回,但
TPrinter 变量的属性好像也没有与qr的papersize
属性一样的属性.
 
强制类型转换用我上面的方法试试. 也许可行.
TPrinter中可以得到pagesize, 不过vcl help中没有.
 
接受答案了.
 
后退
顶部