请问如何在程序中设置打印纸的宽度和高度(即pagewidth,pageheight)(0分)

  • 主题发起人 主题发起人 lfqbl
  • 开始时间 开始时间
L

lfqbl

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何在程序中设置打印纸的宽度和高度(即pagewidth,pageheight).
priters.pagewidth和priters.pageheight这两个属性都是只读的,怎样才能动态地改变
这两个属性.先谢谢了
 
下面这个程序可以实现, 其中用了一点小技巧访问了TPrinter类中的一个私有变量。

procedure InitPrinter(PaperSize, PaperWidth, PaperHeight, Orientation: Integer);
var
p1, p2, p3: string;
ph: PHandle;
hd: THandle;
devmode: PDeviceMode;
md: TDeviceMode;
sz: TSize;
begin
sz.cx := PaperWidth;
sz.cy := PaperHeight;
if PaperSize=0 then
PaperSize := DMPAPER_USER;
Printer.PrinterIndex := -1;
p1 := stringofchar(' ', 32);
p2 := stringofchar(' ', 32);
p3 := stringofchar(' ', 32);
Printer.GetPrinter(@(p1[1]), @(p2[1]), @(p3[1]), hd);
p1 := strpas(@(p1[1]));
p2 := strpas(@(p2[1]));
p3 := strpas(@(p3[1]));
ph := Pointer(Integer(Printer)+ TObject.InstanceSize + // 访问Printer.FPrinterHandle这个私有变量
SizeOf(TCanvas)+
SizeOf(TStrings)+
SizeOf(Integer)+
SizeOf(TStrings)+
SizeOf(Integer)+
SizeOf(string)+
SizeOf(Boolean)+
SizeOf(Boolean)+
SizeOf(TPrinterCapabilities)+
SizeOf(TPrinterState)+
SizeOf(HDC)+
SizeOf(PDeviceMode)+
SizeOf(THandle));

if ph^ = 0 then
raise Exception.Create('找不到打印机');
if hd = 0 then
hd := GlobalAlloc(GHND, DocumentProperties(0, ph^, @(p1[1]), md, md, 0));
devmode := GlobalLock(hd);
if (Win32Platform <> VER_PLATFORM_WIN32_NT) or (sz=DMPAPER_USER) then
devMode^.dmFields := DM_PAPERSIZE or DM_PAPERLENGTH or DM_PAPERWIDTH or DM_ORIENTATION {or DM_COPIES}
else
devMode^.dmFields := DM_PAPERSIZE or DM_ORIENTATION;
devmode^.dmOrientation := Orientation;
devmode^.dmPaperSize := sz;
if (Win32Platform <> VER_PLATFORM_WIN32_NT) or (sz=DMPAPER_USER) then
begin
devmode^.dmPaperLength := PaperHeight;
devmode^.dmPaperWidth := PaperWidth;
end;
try
if DocumentProperties(0, ph^, @(p1[1]), devmode^, devmode^, DM_IN_BUFFER or DM_OUT_BUFFER) <> IDOK then
raise Exception.Create('打印机设置错误');
finally
globalUnlock(hd);
end;
printer.SetPrinter(@(p1[1]), @(p2[1]), @(p3[1]), hd);
end;
 
后退
顶部