我用delphi6写的程序,打印两种不同大小的报表(一种是 A4,一种是卡片,打印机是epson lq300),打印时不用每次手动设置打印机的属性,如何自动控制,打印票据时自动为卡片的大小,打印其他报表时自动为A4的大小?

解决方案 »

  1.   

    procedure tfrmPrint.setpr;
    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);
    //以下开始初始化打印机
      with devmode^ do
        begin
    //打印份数
          dmfields:=dmfields or dm_copies;
          dmcopies:=strtoint(maskedit1.Text);
    //打印纸张
          dmfields:=dmfields or dm_papersize;
          dmpapersize:=256;
          dmfields:=dmfields or dm_paperlength;
          dmpaperlength:=dm.rstype['paperlength'];
          dmfields:=dmfields or dm_paperwidth;
          dmpaperwidth:=dm.rstype['paperwidth'];
          resetdc(devicehandle,devmode^);  //加上这句即可
        end;
      if not devicehandle=0 then
        globalunlock(devicehandle);
    end;
      

  2.   

    参考
    procedure setprinter;//设置打印机
    type
      Tpname=array[0..63]of char;
      Tpnames=array[0..0]of Tpname;
    var
      papernames:pointer;
      i,rslt:integer;
      device,driver,port:array[0..255]of char;
      adevmode,PrnHd:Thandle;
      devmode:Pdevicemode;
      a3support:boolean;
      PrnInfo : PPrinterInfo1;
      pcbNeeded,PDevModeBytes : DWORD;
    begin
      printer.PrinterIndex :=printer.PrinterIndex ;
      printer.GetPrinter(device,driver,port,adevmode);
      rslt:=devicecapabilitiesa(device,port,dc_papernames,nil,nil);
      if rslt>0 then
        begin
          getmem(papernames,rslt*64);
          try
            if devicecapabilitiesa(device,port,dc_papernames,papernames,nil)=-1 then
              raise exception.Create('deccap error');
            for i:=0 to rslt - 1 do
              if strpas(Tpnames(papernames^)[i])='A3' then
                a3support:=true;
          finally
            freemem(papernames,rslt*64);
          end;
        end;
      if a3support then
        begin
          printer.PrinterIndex :=printer.PrinterIndex ;
          printer.GetPrinter(device,driver,port,adevmode);
          if adevmode<>0 then
            begin
              devmode:=globallock(adevmode);
              try
                devmode^.dmFields:=devmode^.dmFields or dm_papersize  or dm_orientation;
                devmode^.dmpapersize:=DMPAPER_A3;
                devmode^.dmOrientation :=dmorient_portrait;
    //        devmode^.dmpapersize:=DMORIENT_LANDSCAPE;
                Printer.SetPrinter(Device,Driver,Port,aDevmode);
              finally
                globalunlock(adevmode);
              end;
            end
          else
            raise exception.Create('打印机初始化错误!');  printer.BeginDoc ;
      printer.Canvas.TextOut(5,6,'24efhsdghasjhgjkf');
      printer.EndDoc ;        
        end;
    end;
      

  3.   

    自定义纸张大小    
        
    这样吧,用Delphi举个例子吧,以下程序将打印机纸张设为:114mm*190mm:procedure PreparePrinter;varaDevice: array[0..CCHDEVICENAME-1] of Char;aDriver: array[0..MAX_PATH-1] of Char;aPort: array[0..31] of Char;hDevMode: THandle;pDevMode: PDeviceMode;begin// 获取打印机DeviceMode的句柄Printer.GetPrinter(aDevice, aDriver, aPort, hDevMode);if hDevMode <> 0 thenbegin// 获取指向DeviceMode的指针pDevMode := GlobalLock(hDevMode);if pDevMode <> nil thenbeginpDevMode^.dmPaperSize := DMPAPER_USER;pDevMode^.dmPaperLength := 1140;pDevMode^.dmPaperWidth := 1900;pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERSIZE;pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERLENGTH;pDevMode^.dmFields := pDevMode^.dmFields or DM_PAPERWIDTH;ResetDC(Printer.Handle, pDevMode^);GlobalUnlock(hDevMode);end;end;end;用修改DeviceMode的方法的话,只是改变你程序中的打印机设置,不会影响其他程序打印的。
     
       
      

  4.   

    你用的是win2000吧
    开始---设置----打印机---文件----服务器属性---创建新格式