1、如何循环取出系统中打印机所支持的所有纸张类型?
2、如何取出系统打印机所能支持纸张的最大宽度?
3、我在打印机中添加了一自定义纸张(控制面板-〉打印机-〉文件-〉服务器属性)
我如何用程序判断我添加的这张自定义纸张是否被当前打印机所支持?谢谢

解决方案 »

  1.   

    http://borland.mblogger.cn/aiirii/posts/3412.aspx
    修改下,看能行不??
      

  2.   

    procedure find_nt_zyprint;
    var
       handle:hwnd;
       hPrinter: THandle;
       pForm : PFormInfo1;
       Forms :array[1..999] of FORM_INFO_1;
       cbBuf,pcbNeeded1,pcReturned : DWord;
       ii : integer;
       PTestOut : PDeviceMode;
       testout : array[1..3000]of byte;
       Device, Driver, Port: array[0..80] of Char;
       DMode : THandle;
       m_string:string;
       m_byte:dword;
       PRINTINFO:PPRINTERINFO1;
    begin
          try
          PaperSizeNum:= -1;
          //打开发票打印机,以获得打印机句柄
         if not(openprinter('qs_zyfp',HPRINTER,NIL)) THEN
              MessageDlg('无法打开打印机设置纸张,qs_zyfp!',mtError,[mbOK],0);
          pForm := @Forms[1];
          cbBuf := sizeof(FORM_INFO_1)*999;
          //敉举所有的纸张类型
          EnumForms(hPrinter,1,pForm,cbBuf,pcbNeeded1,pcReturned);
          if pcReturned <> 0 then
             For ii := 0 to pcReturned - 1 do
              //  if Forms[ii + 1].pName = 'qsPaper' then
                begin
                   if Forms[ii + 1].pName = 'qs_zyfp' then
                     begin
                      PaperSizeNum:=2 ;
                      break;
                     end;
                   //break;
                end;
         //如果没有找到我设的自定义纸张类型,让使用者加上去
          if PaperSizeNum = -1 then
          begin
             //AddMyForm;//加纸张类型的方法
             messagedlg('请在发票打印机的打印首选项里将纸张类型设置为''qs_zyfp''',mtWarning,[mbOK],0);
            // Halt;
          end;
          //use DocumentProperties function to get PaperSize Number
          pTestout := @testout;
          Printer.GetPrinter(Device, Driver, Port, DMode);
          getmem(printinfo,1024);
          getprinter(hprinter,1,printinfo,1024,@papersizenum);
          m_byte:=DocumentProperties(Handle,hprinter,printinfo.pdescription,PTestOut^,PTestOut^,0);
          getmem(ptestout,m_byte);
          DocumentProperties(Handle,hPrinter,printinfo.pdescription,PTestOut^,PTestOut^,DM_OUT_BUFFER);
          PaperSizeNum:=PTestout^.dmPaperSize;
          m_string:=ptestout^.dmFormName    ;
          //DocumentProperties最后一个参数为DM_OUT_BUFFER时从打印机中读取设备状态
      except
          on E:Exception do
             MessageDlg('打印机设置失败'+#13+E.Message,mtError,[mbOK],0);
       end;
    end;
      

  3.   

    兄弟你真走运,我今天刚解决这个问题.如下.新加一个打印机:qs_little,首先你要在打印服务器中设置一张你定义的张如'qs_littlepaper' .然所把打印机默认纸张设为这:
    procedure find_xp_qs_little;//nt2000中小纸打印机
    var
    handle:hwnd;
    hPrinter: thandle;
       pForm : PFormInfo1;
       Forms :array[1..999] of FORM_INFO_1;
       cbBuf,pcbNeeded1,pcReturned : DWord;
       ii : integer;
       PTestOut : PDeviceMode;
       testout : array[1..3000]of byte;
       Device, Driver, Port: array[0..80] of Char;
       DMode : THandle;
       m_string:string;
       m_byte:dword;
       PRINTINFO:PPRINTERINFO1;
    begin
      try
          PaperSizeNum:= -1;
          //打开发票打印机,以获得打印机句柄
         if not(openprinter('qs_little',HPRINTER,NIL)) THEN
              MessageDlg('无法打开打印机设置纸张,qs_little!',mtError,[mbOK],0);
          pForm := @Forms[1];
          cbBuf := sizeof(FORM_INFO_1)*999;
          //敉举所有的纸张类型
          EnumForms(hPrinter,1,pForm,cbBuf,pcbNeeded1,pcReturned);
          if pcReturned <> 0 then
             For ii := 0 to pcReturned - 1 do
              
                begin
                   if Forms[ii + 1].pName = 'qs_littlepaper' then
                     begin
                                        PaperSizeNum:=2 ;
                                       break;
                     end;
                   //break;
                end;
         //如果没有找到我设的自定义纸张类型,让使用者加上去
          if PaperSizeNum = -1 then
          begin
             //AddMyForm;//加纸张类型的方法
             messagedlg('请在发票打印机的打印首选项里将纸张类型设置为''qs_littlepaper''',mtWarning,[mbOK],0);
            // Halt;
          end;
          //use DocumentProperties function to get PaperSize Number
          pTestout := @testout;
          Printer.GetPrinter(Device, Driver, Port, DMode);
          getmem(printinfo,1024);
          getprinter(hprinter,1,printinfo,1024,@papersizenum);
          m_byte:=DocumentProperties(Handle,hprinter,printinfo.pdescription,PTestOut^,PTestOut^,0);
          getmem(ptestout,m_byte);
          DocumentProperties(Handle,hPrinter,printinfo.pdescription,PTestOut^,PTestOut^,DM_OUT_BUFFER);
          PaperSizeNum:=PTestout^.dmPaperSize;
          m_string:=ptestout^.dmFormName    ;
          //DocumentProperties最后一个参数为DM_OUT_BUFFER时从打印机中读取设备状态
      except
          on E:Exception do
             MessageDlg('打印机设置失败'+#13+E.Message,mtError,[mbOK],0);
       end;
    end;
    procedure set_xp_littlepaper;
      var
       Device: array[0..255] of char;
       Driver: array[0..255] of char;
       Port: array[0..255] of char;
       hDMode: THandle;
       PDMode: PDEVMODE;
    begin
        Printer.PrinterIndex := Printer.PrinterIndex;
               Printer.GetPrinter(Device, Driver, Port, hDMode);
               if hDMode <> 0 then
                  begin
                   pDMode := GlobalLock(hDMode);
                   if pDMode <> nil then
                    begin
                      pDMode^.dmFields := pDMode^.dmFields or
                      DM_PAPERSIZE or
                       DM_FORMNAME;
                      pDMode^.dmPaperSize :=PaperSizeNum;//PaperSizeNum是一个integer变量,它的取得见下面
                      pDMode^.dmFormName :='qs_littlepaper';//MyPaper是我自定义的纸张类型
                      resetdc(printer.handle,pdmode^);
                      GlobalUnlock(hDMode);
                    end;
                  end;
    end;
    然后在REOPORT 中纸张设置DEFAULT SIZE在QUICKREP1.PRINT前运行
    find_xp_qs_little;
    set_xp_littlepaper;
    就好了.
    我今天已经试用成功在NT/2000/XP