用QuickReport作打印可以很方便地实现预览,用TPrinter该怎么预览?

解决方案 »

  1.   

    自己 在PaintBox画
    PaintBox1.canvas.....
      

  2.   

    有个想法,但是有问题,还请DX指教窗口上放一个Panel,叫pnlPrint,里面再放一些Label,遍历所有的Label,一个一个打印procedure TfrmPrint.btnPrintClick(Sender: TObject);
    var i:Integer;
      lbPrint:Tlabel;
      s:Single;
    begin
    //s为打印机分辨率与屏幕分辨率的比例,设为常数4,在Epson C43UX上打出来刚好,但是其它分辨率的打印机肯定就有问题了,请问如何动态取得这个常数?下面这句没用,分子分母都是96
    //  s:=Printer.Canvas.Font.PixelsPerInch/Self.PixelsPerInch;
      s:=4;
      with Printer do
      begin
        Title:='test';
        BeginDoc;      for i:=0 to pnlPrint.ControlCount-1 do
          begin
            if pnlPrint.Controls[i].InheritsFrom(Tlabel) then
            begin
              lbPrint:=Tlabel(pnlPrint.Controls[i]);
              Canvas.Font.Name=lbPrint.Font.Name;
              Canvas.Font.Size:=lbPrint.Font.Size;
              Canvas.TextOut(Round((pnlPrint.Left+lbPrint.Left) *s),Round((pnlPrint.Top+lbPrint.Top)*s),lbPrint.Caption);
            end;
          end;//for i    EndDoc;
      end;//with printer
    end;
    另外,Tprinter.Canvas.TextOut 是否按文本打印而不是按图形打的?也就是说,计算机传到打印机的数据是否为文字编码,而不是一点一点地传,如果是这样会快得多,但是就要求打印机本身要有字库,如某种字体没有了,又会发生什么?
      

  3.   

    var 
     aCanvas : TCanvas;
     
    Procedure FormView(Canvas : Tcanvas)
    begin
     //  这里写入你的打印代码。
     Canvas.handle := Handle;
    end;