procedure TMainFrame.btn_printClick(Sender: TObject);
var
  Device: array[0..255] of Char;
  Driver: array[0..255] of Char;
  Port: array[0..255] of Char;
  hDMode: THandle;
  pDMode: PDevMode;
  ScaleX, ScaleY, k, n: Integer;
begin
  Printer.GetPrinter(Device, Driver, Port, hDMode);
  if hDMode <> 0 then
  begin
    pDMode := GLobalLock(hDMode);
    if pDMode <> nil then
    begin
      pDMode^.dmPaperSize := DMPAPER_USER;
      pDMode^.dmPaperLength := 992; 
      pDMode^.dmPaperWidth := 2070;       pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or DM_PAPERLENGTH or
        DM_PAPERWIDTH;
      ResetDC(Printer.Handle, pDMode^);
      GLobalUnLock(hDMode);
    end;
  end;  n := strtoint(Edit_StartNum.Text);  Printer.BeginDoc;
  try
    while (n <= StrToInt(Edit_EndNum.Text)) and btn_Stop.Enabled do
    begin
      ScaleX := GetDeviceCaps(Printer.Canvas.Handle, logPixelsX) div
        PixelsPerInch;
      ScaleY := GetDeviceCaps(Printer.Canvas.Handle, logPixelsY) div
        PixelsPerInch;
      PrintMark(Printer.Canvas, ScaleX, ScaleY, n);//打印过程
      n := n + 1;
      if n <= StrToInt(Edit_EndNum.Text) then
        Printer.NewPage;
      sleep(500);
      Application.ProcessMessages;
    end
  finally
    Printer.EndDoc;
  end;
end;procedure TMainFrame.PrintMark(C: TCanvas; ScaleX, ScaleY, n: Integer);
var
  P, CustName, CustOrd, ShipPlace, Num, Ord: TPoint;
  pc:string;
  AcWidth: integer;
  function ScalePoint(X, Y: Integer): TPoint;
  begin
    Result := Point(X * ScaleX, Y * ScaleY);
  end;
begin
  pc:=trim(edit1.text);
  AcWidth := 770; CustName.X := 165; 
  CustName.Y := 85;  CustOrd.X := CustName.X - 140;
  CustOrd.Y := CustName.Y + 85;
  ShipPlace.X := CustName.X - 50;
  ShipPlace.Y := CustOrd.Y + 53;
  Num.X := CustName.X + 60;
  Num.Y := ShipPlace.Y + 75;
  Ord.X := CustName.X + 50;
  Ord.Y := Num.Y + 115;
  with C do
  begin
    Font.Name := 'SimSun';
    Font.Size := 20;    P := ScalePoint(CustName.X, CustName.Y);
    TextOut(P.X, P.Y, Trim(Edit_CustName.Text));
    P := ScalePoint(CustName.X + AcWidth, CustName.Y);
    TextOut(P.X, P.Y, Trim(Edit_CustName.Text));     P := ScalePoint(CustOrd.X, CustOrd.Y);
    TextOut(P.X, P.Y, Trim(Edit_CustOrd.Text));
    P := ScalePoint(CustOrd.X + AcWidth, CustOrd.Y);
    TextOut(P.X, P.Y, Trim(Edit_CustOrd.Text)); 
    P := ScalePoint(ShipPlace.X, ShipPlace.Y);
    TextOut(P.X, P.Y, Trim(Edit_ShipPlace.Text));
    P := ScalePoint(ShipPlace.X + AcWidth, ShipPlace.Y);
    TextOut(P.X, P.Y, Trim(Edit_ShipPlace.Text)); 
    P := ScalePoint(Num.X, Num.Y);
    TextOut(P.X, P.Y, Trim(inttostr(n) +pc+ '  ()'));
    P := ScalePoint(Num.X + AcWidth, Num.Y);
    TextOut(P.X, P.Y, Trim(inttostr(n) + pc+'  ()'));    P := ScalePoint(Ord.X, Ord.Y);
    TextOut(P.X, P.Y, Trim(Edit_Ord.Text));
    P := ScalePoint(Ord.X + AcWidth, Ord.Y);
    TextOut(P.X, P.Y, Trim(Edit_Ord.Text));
  end;
end;
打印基本上就是这样,程序调试没有问题,打印也能打,问题是如果打印两张或以上纸张间距就会有误差[是向下偏],但缩小纸张高度小于992又会跳两张多纸[是属于标签纸类型],大于则误差越大,请各位大虾帮忙分析,我要疯了!!!

解决方案 »

  1.   

    难道这里就没有人了解这样的问题吗?郁闷啊
      

  2.   

    纸张大小没设置对,不过有的打印机就是这样,打几页就要向下偏,我以前用了一个笨办法,每打三页就把大小给它向上提一点,结果打了几千张都没问题,期待高手解答!
      

  3.   

    给点例子,好不好啊,大虾,或者说点思路啊。只要能实现这功能,什么办法都行
      

  4.   

    还没遇到过这种问题打印几十万的数据
      

  5.   

    是纸张大小没有设对!我也遇到这样的问题!一点多不可以偏,不然多了的时候会偏的厉害