我想用程序设置打印机的纸张类型,代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
  ADevice, ADriver, APort: array[0..255] of Char;
  DeviceHandle: THandle;
  DevMode: PDeviceMode;
begin
    //初始化打印机
    Printer.GetPrinter(ADevice, ADriver, APort, DeviceHandle);
    if DeviceHandle = 0 then
    begin
      Printer.PrinterIndex := Printer.PrinterIndex;
      Printer.GetPrinter(ADevice, ADriver, APort, DeviceHandle);
    end;
    if DeviceHandle = 0 then
      Raise Exception.Create('不能初始化打印机!')
    else
      DevMode := GlobalLock(DeviceHandle);
    if DeviceHandle <> 0 then
    begin
      with DevMode^ do
      begin
        dmFields := dmFields or DM_ORIENTATION;
        //在下面这里设置打印方向
        dmOrientation := DMORIENT_LANDSCAPE; //DMORIENT_PORTRAIT
        Printer.SetPrinter(ADevice, ADriver, APort, DeviceHandle);
        GlobalUnLock(DeviceHandle);
      end;
    end;    PrinterSetupDialog1.Execute; //验证一下设置是否成功了
end;我将打印方向设为了横向,但PrinterSetupDialog对话中显示的仍然是纵向,不知为什么,请问怎么才能使PrinterSetupDialog中的设置随程序设置的改变而改变呢?

解决方案 »

  1.   

    Var
      PrnDevice, PrnDriver, PrnPort: Array[0..255] Of Char;
      PrnHandle: THandle;
      PrnMode: PDeviceMode;
    Begin
      Printer.GetPrinter(PrnDevice, PrnDriver, PrnPort, PrnHandle);
      If PrnHandle = 0 Then
        Raise Exception.Create('无法获取系统打印机信息!')
      Else
        Begin
          PrnMode:= GlobalLock(PrnHandle);
          With PrnMode^ Do
            Begin
              //打印份数
              dmFields:= dmFields Or dmCopies;
              dmCopies:= 1;          //打印方向
              dmFields:= dmFields Or dmOrientation;
              //dmOrientation:= DMORIENT_LANDSCAPE;
              dmOrientation:= DMORIENT_PORTRAIT;          //纸张大小
              dmFields:= dmFields Or dmPaperSize;
              //dmPaperSize:= 162;
              dmPaperSize:= DMPAPER_USER;          dmFields:= dmFields Or dmPaperWidth;
              //dmPaperWidth:= 2100;
              dmPaperWidth:= 1580;          dmFields:= dmFields Or dmPaperLength;
              //dmPaperLength:= 2970;
              dmPaperLength:= 1018;          dmFields:= dmFields Or PrnMode^.dmLogPixels;
              dmLogPixels:= 300;
              ResetDC(Printer.Handle, PrnMode^);
            End;我的代码,你试试看。
    我这边运行没问题。
      

  2.   

    ResetDC(Printer.Handle, PrnMode^);
    你加上了么?