我的报表有好几页,用针式打印机打印,但打印是总是走纸不对,现在我想实现,除了一页外,其它页再动态定义纸张的长与宽,要怎么实现

解决方案 »

  1.   

    Function ChangePape(const PaperName: string; PaperWidth, PaperLength:integer):Boolean; //改变当前的打印纸张设置
    var
      FormInfos : Array [1..1024] of Form_Info_1;
      cbNeeded, cReturned ,neededsize: DWORD;
      i,j:integer;
      ppo:PRINTER_INFO_2;
      dev :PDeviceMode;
      PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;
      hDMode   : THandle;
      hPrinter : THandle;
    begin
      Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);
        OpenPrinter(PrintDevice, hPrinter, nil);
        if hPrinter = 0 then
          raise Exception.Create('联接打印机失败!');
      EnumForms(hPrinter, 1, Nil, 0, cbNeeded, cReturned);
      EnumForms(hPrinter, 1, @FormInfos, cbNeeded, cbNeeded, cReturned );
      j := 0;
      //showmessage(inttostr(cReturned));
      for i:= 1 to cReturned  do// 通过轮寻找到自定义的纸张的纸张类型排序号
        if FormInfos[i].pName =PaperName then j:=i;
      if j=0 then 
      begin
       AddCustomPaper(PaperName,PaperWidth,PaperLength);
        j := cReturned + 1;
      end; //如无纸张则添加
      GetPrinter(hPrinter,2,Nil, 0, @NeededSize);
      GetPrinter(hPrinter, 2, @ppo, NeededSize, @NeededSize);
      dev := ppo.pDevMode;
      dev.dmPaperSize := j;
      ppo.pDevMode := dev;
      SetPrinter(hPrinter,2,@ppo,0); //定义打印机列表并选择自定义纸张
      Result := True;
    end;procedure AddCustomPaper(const PaperName: string; PaperWidth, PaperLength:integer);
    var
      PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;
      hDMode   : THandle;
      hPrinter : THandle;
      FormInfo : TFormInfo1;
      DevsP:Pointer;
      begin
        Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);
        OpenPrinter(PrintDevice, hPrinter, nil);
        if hPrinter = 0 then
          raise Exception.Create('联接打印机失败!');
        with FormInfo do
          begin
            Flags :=FORM_USER;
            pName := PChar(PaperName);
            Size.cx := PaperWidth*100;
            Size.cy := PaperLength*100;
            ImageableArea.Left := 0;
            ImageableArea.Top := 0;
            ImageableArea.Right :=PaperWidth*100;
            ImageableArea.Bottom := PaperLength*100;
         end;
       //修改纸型,如果没有就新增
       if not SetForm(hPrinter, PChar(PaperName), 1, @FormInfo) then
        AddForm(hPrinter, 1, @FormInfo); //添加纸张    ClosePrinter(hPrinter);
    end;procedure DeleteCustomPaper(const PaperName: string);
     var
       PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;
       hDMode   : THandle;
       hPrinter : THandle;
    begin 
       Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);
       OpenPrinter(PrintDevice, hPrinter, nil);
         if hPrinter = 0 then
          raise Exception.Create('联接打印机失败!');
          DeleteForm(hPrinter, PChar(PaperName));
          ClosePrinter(hPrinter);  end;
      

  2.   

    可以QQ交流或在QQ群内交流
    本人QQ:77694361
    QQ群:17307502
      

  3.   

    楼主,你这不是用 FastReport 打印吧?
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      sPage: TfrxComponent;
    begin
      sPage := frxReport1.FindObject('Page1'); //这是你要修改的页面的名称
      if not Assigned(sPage) then Exit;
      frxReport1.FileName := '1.fr3';
      with (sPage as TfrxReportPage) do
      begin
        PaperWidth := 210; //纸张宽度 单位:毫米
        PaperHeight := 297; //纸张高度 单位:毫米
      end;
      frxReport1.ShowReport();
    end;
      

  5.   

    1、自定义纸张格式要求打印机支持自定义格式;
    2、什么系统?
    如WIN2000、XP:
    控制面板->打印机->文件->属性服务器中增加自定义纸张格式。