win2k不可以打印设置自定义页面。我的针式打印机打出来的总是一页打两页,hp6l的就没问题

解决方案 »

  1.   

    http://borland.mblogger.cn/aiirii/posts/3412.aspx
      

  2.   

    兄弟你真走运,我今天刚解决这个问题.如下.新加一个打印机: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