想通过程序设置在一台打印机上打印不同尺寸的纸张,現在的做法是在QuickReport中设定好报表的尺寸后还要在本机的“打印机和传真->打印首选项->布局->高级”中将纸张规格改成报表设计时相应的尺寸,这样做比较麻烦,不知该怎么直接在程序中设定打印机的纸张规格,请大家帮助给个方法~

解决方案 »

  1.   

    首先你要知道你用哪个打印机,一般的是首选打印机,然后参考下面文章
    http://wenku.baidu.com/view/e608321d59eef8c75fbfb369.html
      

  2.   


    var
    PrtInfo2: PPrinterInfo2;//具体的内容 查查MSDN
    DeviceMode: PDeviceMode;//具体的内容 查查MSDN
    strPrintName:string;//打印机名称
    .............
        Printer.SetPrinter(pchar(Printer.Printers[Printer.PrinterIndex]), PrtInfo2.pDriverName, PrtInfo2.pPortName, 0);//不修改系统默认打印机,仅修改当前程序所使用的打印机
    .......
        DeviceMode^.dmPaperSize := 256; //要设为其它可查API中的DevMode,自定义纸张
        DeviceMode^.dmPaperLength :=        Trunc(StrToFloat(XMLPrintM.DocumentElement.AttributeNodes[3].text) * 100);
        DeviceMode^.dmPaperWidth := Trunc(StrToFloat(XMLPrintM.DocumentElement.AttributeNodes[2].text) * 100);
        DeviceMode^.dmFields := DeviceMode^.dmFields or DM_ORIENTATION;
        DeviceMode^.dmFields := DeviceMode^.dmFields or DM_PAPERSIZE;
        DeviceMode^.dmFields := DeviceMode^.dmFields or DM_PAPERLENGTH;
        DeviceMode^.dmFields := DeviceMode^.dmFields or DM_PAPERWIDTH;
        StrPCopy(DeviceMode^.dmDeviceName, strPrintName);
        ResetDC(Printer.Handle, DeviceMode^);原来做过几个程序跟打印机有关的
      

  3.   

    问题已经解决了,2楼讲得对但未说详细,DeviceMode^.dmPaperSize := 256中的自定义纸张编号256只在Win98.me中生效,在Win2000、XP中自定义纸张的编号不是固定的256,第将次新加自定义纸张时都会变化的。具体步骤:
    在“打印机和传真”中点菜单“文件->服务器属性”
    在格式选项卡中选择“创建新格式”创建一个所需尺寸的自定义纸张
    将自定义纸张设为当前打印机的默认值
    通过如下代码获取当前自定义纸张的编号:
    [code=Delphi(Pascal]
    procedure TMainForm.Button1Click(Sender: TObject);
    var
      Device : array[0..cchDeviceName - 1] of Char;
      Driver : array[0..(MAX_PATH-1)] of Char;
      Port : array[0..32]of Char;
      hDMode : THandle;
      pDMode : PDevMode;
    begin
      Printer.GetPrinter(Device,Driver,Port,hDMode);// 获取打印机DevMode结构的句柄值,存放在hDMode中
      if hDMode <> 0 then
      begin
        pDMode := GlobalLock(hDMode); // 获取指向打印机DevMode结构的指针
        ShowMessage('纸张尺寸编号:' + IntToStr(pDMode^.dmPaperSize));  //打印机默认纸张尺寸编号
        GlobalUnlock(hDMode);
      end;
    end;
    [/code]
    之后的设定可按2楼的来处理。