初用delphi,用fastReprt制作报表,要求大致是这样的.
纸张大小12*12,打印格式如下
---------------------------------------
                    [xxxx标题]       //动态的
号码:xxxx              XXXX年XX月XX日
---------------------------------------
名字:xxxxx                  数量:xxxx
--------------------------------------
型号    |    内容     |    备注      
---------------------------------------
XXXXX   |  XXX        |    XXXX
--------------------------------------
XXXXX   |  XXXXX      |   XXXXXX
--------------------------------------
........|...........  | ....
--------------------------------------
说明                      |   签字
-------------------------------------- 其中x用传值解决,X是读取的数据库,每页XXX数据不多余8条.多余八条接着打类似的报表.用到什么Band,怎么控制到8条数据后接着打印一张新的.越详细越好.多谢各位大虾赐教.

解决方案 »

  1.   

    1、设置纸张高度!超出将自动换行!
    2、有多少就打多少
    完全可以设置,但是要在程序中进行控制。
    frprint.pgsize=256;
    frprint.pgwidth=2100;(纸张宽度,可根据需要设定)
    frprint.pgheight=每页的表头高度+明细每条高度*明细记录数+每页的汇总高度+上办界高+下边界高+常数。
    frprint.preparereorpt;(准备报表)
    frprint.showreport;完成。在报表设计器中显示的是像素,转换成毫米为1:3.6,这样进行计算就可以算出每页的高度。即可完成即打即停功能、二打一、三打一、整页打印等控制。很方便。动态赋值
      TfrxMemoView(FrxReport1.FindComponent('Memo1')).text:='...';自定义纸张
    uses Printers;var
      ADevice, ADriver, APort: array[0..255] of Char;
      DeviceHandle: THandle;
      DevMode: PDeviceMode;
    begin
      Printer.GetPrinter(ADevice, ADriver, APort, DeviceHandle);
      if DeviceHandle = 0 then
        ShowMessage('无法设置打印机参数!')
      else
        DevMode := GlobalLock(DeviceHandle);
      if not DeviceHandle = 0 then GlobalUnlock(DeviceHandle);
      with DevMode^ do
      begin
        dmFields := dmFields or DM_PAPERLENGTH;
        dmPaperLength := 10; //自定义纸张长度
        dmFields := dmFields or DM_PAPERWIDTH;
        dmPaperWidth := 100;  //自定义纸张宽度
      end;//with
    end;
      

  2.   

    补充一点,就是如果XXX不满足8条,打8条用横竖线分割的空行
      

  3.   

    谢谢supervisors,问题没有解决,就是'如果XXX不满足8条,用横竖线分割的空行填足8行'.再次希望大虾出手.
      

  4.   

    有个办法很笨,取数据时都转换成字符类型。sql server用cast() 或 convert()函数。向记录集中加你要的横竖线记录条数= recordcount / 8的余数,再将记录集给报表做源,
    are you ok?
    还有一想法没试过。就是在报表的报表脚画上8-1个横竖线行。根据记录数控制其显示和报表脚的高度。
      

  5.   

    我想他的TfrxCrossView.AddValue应该可以解决我的问题,这样可以保证不写进数据库里.我用的是oracle9I.
    但我在使用的时候碰到错误.
    错误是'不能将字符串转换为浮点型',挺纳闷的.我是参照他的print Table的示例写的.很奇怪.
    代码和示例的一样.
    procedure TForm1.frxReport1BeforePrint(c:TfrxReportComponent);var
      Cross: TfrxCrossView;
      i,j:integer;
    begin
      if c is TfrxCrossView then
      begin
        Cross := TfrxCrossView(c);    ADOQuery1.First;
        i := 0;
        while not ADOQuery1.Eof do
        begin
          for j := 0 to ADOQuery1.Fields.Count - 1 do
            Cross.AddValue([i], [j], [Adoquery1.Fields[j].AsString]);    //*********错误位置
          ADOQuery1.Next;
          Inc(i);
        end;
      end;
    end;//-----------------------------------------------
    //why????
      

  6.   

    补空白行如下:
       加一个child band名为child1 ,在master Band 中onBeforprint
       加入如下代码:
       while FreeSpace > 40 do   //多高自己控制.
        ShowBand(Child1);