在程序中已经把打印设置成小纸了,但是在NT下却不行,打印完一页仍然是安A4大小走纸。
同样的程序在98下运行正常,不知是不是两个操作系统中有什么设置不对。另如何把NT中的
打印纸设成自定义格式。打印机是EPSON LQ300K。会不会两个操作系统中的驱动不一样

解决方案 »

  1.   

    现在能执行,但是不论我如何改纸,DMPAPERSIZE一直是9,不知为什么。请指教。
    程序如下:procedure TForm1.Button1Click(Sender: TObject);
     var
       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;
       papersizenum:integer;
       m_string:string;
       m_byte:dword;
       PRINTINFO:PPRINTERINFO1;
    begin  try
          PaperSizeNum := -1;
          //打开发票打印机,以获得打印机句柄
        {  if Not OpenPrinter(PChar(Printer.Printers.Strings[Printer.PrinterIndex]),hPrinter,nil) then
          begin
             
             Exit;
          end;}
          if not(openprinter('EPSON LQ-1600K',HPRINTER,NIL)) THEN
              MessageDlg('无法打开打印机设置纸张!',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
                   listbox1.Items.Add(forms[ii+1].pname);
                   PaperSizeNum:= -2;
                   if Forms[ii + 1].pName = 'A4' then
                     begin
                      showmessage('ok');
                     // PaperSizeNum :=Forms[ii + 1].size ;
                      break;
                     end;
                   //break;
                end;
          //如果没有找到我设的自定义纸张类型,让使用者加上去
          if PaperSizeNum = -1 then
          begin
             //AddMyForm;//加纸张类型的方法
             messagedlg('请在发票打印机的打印首选项里将纸张类型设置为''MyPaper''',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;