请问,有什么方法可以实现“套打”-- 如电费单,本身有表格,只需要在固定位置打印某些内容,并走纸。
如果有控件推荐,则更好。
多谢!

解决方案 »

  1.   

    这是个技巧问题,你也做电费单?真是巧了!我的方法很笨但很实际,就是按格子的尺寸打印一张完全和票据一样重合的格子出来,然后再加上显示的字段,最后再把格子置为不可见或干脆删除格子.对了,我用的是quickrep3.62
      

  2.   

    VisualReport做這一類很方便的.其實還有一種更簡單的方法:使用QReport:在設計時使報表擁有Page Header 及 Detail兩欄就夠了,在設計顯示字段不要使用QRDBText
    而使用QRLabel控件,且控件位置放於Page Header 中,Detail檔不放任何控件.頁面紙張設計
    與套打紙張相同大小且位置相對齊.
    在Detail的OnBeforePrint事件中寫數據賦值代碼及控制換頁,以下是我使用的代碼,僅參考:procedure TQRBaseRadioCount.DetailBand1BeforePrint(Sender: TQRCustomBand;
      var PrintBand: Boolean);   //開始打印
    begin
      QuickRep1.DataSet.First;
      SetDataPrint;
      While not QuickRep1.DataSet.Eof do
      begin
        QuickRep1.NewPage;
        SetDataPrint;
      end;
    end;procedure TQRBaseRadioCount.SetDataPrint;   //為QRLabel控件設置數據源
    var  I: Integer;
    begin
      For I:=17 to 56 do
        TQRLabel(FindComponent('QRLabel'+IntToStr(I))).Caption := '';
      I:=17;
      while not QuickRep1.DataSet.Eof do
      begin
        TQRLabel(FindComponent('QRLabel'+IntToStr(I))).Caption := SetValue(QuickRep1.DataSet.FieldByName('Code_Type').AsString);
        Inc(I);
        TQRLabel(FindComponent('QRLabel'+IntToStr(I))).Caption :=SetPrint(FloatToStr(Round(QuickRep1.DataSet.FieldByName('YearTotal_Ratio_yet').AsFloat*1000)/1000),I);
        Inc(I);
        TQRLabel(FindComponent('QRLabel'+IntToStr(I))).Caption :=SetPrint(FloatToStr(Round(QuickRep1.DataSet.FieldByName('Total_Ratio_Befo').AsFloat*1000)/1000),I);
        Inc(I);
        TQRLabel(FindComponent('QRLabel'+IntToStr(I))).Caption :=SetPrint(FloatToStr(Round(QuickRep1.DataSet.FieldByName('Total_Ratio').AsFloat*1000)/1000),I);
        Inc(I);
        QuickRep1.DataSet.Next;
        if I>=56 then Exit;
      end;
    end;Function TQRBaseRadioCount.SetValue(LableValue:String):String; 
       //處理在換行時漢字被拆成半個的情況
    var s:string;
        I:Integer;
        Boo:Boolean;
    begin
       Result := '';
       I:=1;
       while Length(LableValue)-I>=0 do
       begin
         S:=copy(LableValue,I,1);
         Result:=Result+S;
         if I mod 24=0 then Boo:= True;   //24為一行最多顯示的字符數
         If Ord(s[1]) >=128 then
         begin
           Inc(I);
           S:=copy(LableValue,I,1);
           Result:=Result+S;
           if I mod 24=0 then Boo:= True;
         end;
         if Boo then begin Boo:=False; Result:=Result+#13; end;
         Inc(I);
       end;
    end;Function TQRBaseRadioCount.SetPrint(lableValue:String;INTOrder:Integer):String;
    begin    //處理值,當數值字段值為0則顯示為空
      Result := '';
      if INTOrder>104 then Exit;    
      if LableValue = '0' then LableValue:='';
      Result := LableValue;
    end;
      

  3.   

    其實其它報表控件也可以, 隻不過我隻知道 QReport 有換頁的命令(NewPage)
      

  4.   

    我用excel 做好模板,然后倒入到FormulaOne里面,用它套打,修改也方便,只要用excel修改模板文件就行了。我用的是激光的打印机,也不错.