开发环境:Delphi 7,WinXP SP2。打印机:HP LaserJet 6L目标:打印分栏报表。procedure PrintGrids(Canvas :TCanvas);
begin
 ……//该例程里仅循环调用了Canvas.MoveTo();Canvas.LineTo();画表格线
end;procedure PrintItems(Canvas :TCanvas);
begin
 ……//该例程里仅循环调用了Windows.DrawText();画表格文字
end;procedure TCustomCell.Print;{TCustomCell是我写的一个报表控件}
begin
  ……;参数计算略
  Printer.BeginDoc;
  try
   PrintGrids(Printer.Canvas);
   PrintItems(Printer.Canvas);
  finally
   Printer.EndDoc;
  end;
end;问题在于:1)用PrintGrids(Printer.Canvas);只画表格线完全正常;
          2)用PrintItems(Printer.Canvas);只画表格文字完全正常;
          3)先画表格文字,再画表格线,完全正常。也就是这样:
procedure TCustomCell.Print;{TCustomCell是我写的一个报表控件}
begin
  ……;参数计算略
  Printer.BeginDoc;
  try
   PrintItems(Printer.Canvas);
   PrintGrids(Printer.Canvas);
  finally
   Printer.EndDoc;
  end;
end;
        4)但是先画表格线,再画表格文字,打印机会死掉!
         5)把例程改为下面的仅画一条线,打印机同样会死掉!也就是说只要先画了线,打印机就要死掉。
procedure TCustomCell.Print;{TCustomCell是我写的一个报表控件}
begin
  ……;参数计算略
  Printer.BeginDoc;
  try
   Printer.Canvas.MoveTo();
   Printer.Canvas.LineTo();
   PrintItems(Printer.Canvas);
  finally
   Printer.EndDoc;
  end;
end;
     6)以上代码中,表格每页打印44行8列;若增加行高,每页只打印22行8列(表格外框矩形定位完全一样),无论先画格线还是先画文字,完全正常;这个问题真奇怪,是什么原因呢?

解决方案 »

  1.   

    汗~
    俺用D2007的~
    建议你深层Debug卡那可能吧
      

  2.   

    结帖。用纯API重写了打印部分,无论如何打印都很好。我也仔细研究了下VCL的Printers代码,没看出问题出在哪里,不过使用VCL来打印,就是莫名其妙地出现以上那些问题。百思不得其解,也就不求甚解了,反正打印目的已通过其他方式实现。
      

  3.   

    是學習到了。
    不過用QRT打印沒有問題!
      

  4.   

    老实说,设计程序的打印功能,我的水平是蛮高的。用VCL的Printer的Canvas方法打印BMP等图象是有潜在问题的,这是公开的问题(而Borland竟然一直没准备修改,真是奇怪),但用VCL的Printer的Canvas方法打印文字和线条,我就从来没有遇到过问题。这次竟然遇到这么个怪问题,可见VCL还是让人有些不放心的。