基本上就是QuickReport实现套打。但这里提出一个需求就是:可以自己定义打印模板,模板由图形编辑工具生成,可快速完成报表的绘制,精确定义报表几何尺寸、填充表头文字、定义单元格的数据来源(数据文件导入及数据提取)。最终生成报表模板文件。
问题由此产生:Delphi支持向VC++那样的动态生成控件吗?还要有分层打印。(什么是分层打印啊)
我今天上午才安装了个DELPHI 7,对DELPHI还一无所知,所以还没出现开发过程中可能产生的问题,我会继续在这个帖子里问,希望能获得大家的帮助!谢谢!

解决方案 »

  1.   

    分层打印:比如说有个清单,你想实现清单的表格先打印出来,然后把数据套打到表格里!
    动态生成报表的难度很大,我在VB里见识过
    DELPHI中我还没是试成功,
    我的想法是利用OO的原理,在应用服务器上编写中间件,将报表模板全部定义好
    再把数据从数据库服务器调出后套打在报表里
    但自定打印模板,不可能真正实现完全自定依的.
      

  2.   

    ReportMachine,FastReport 基本上就满足要求了。
      

  3.   

    QuichReport是报表软件,用来打印票据好象不合适啊
    打印票据用什么比较适合啊?
      

  4.   

    myy() :   FastReport 是要花钱的……
       我们这个是商业软件,不敢用D版的东西(上级有不给买,指定用quickreport……)
      

  5.   

    有兴趣的话,给我Email, 提供给你一个演示程序, 本控件利用XML数据文件为数据来源,实现打印,分模板设计器和打印二部分(二个控件),还可用于Web上,也提供了把为数据表导出为XML文件的VCL.如果感觉好,可以和我联系,这个打印控件是本人一手作出来的.
    我的Email:[email protected]
      

  6.   

    动态控件?你是指在程序运行过程中创建vcl控件吗?当然能够啦,只不过需要设定诸如parent等初始化的属性(具体可参考一下*.dfm文件中的内容),不过要注意创建之后需要手工释放内存,不要造成内存泄漏。
      

  7.   

    关于动态控件可以采用一个容器来管理。每次生成的动态控件的指针保存在列表中:例如:type 
      TQRType = (rLabel, rBand, rMemo, rRep, rExpr,
                    rNone
                  );  
      TRepItem = record
        Name: string;
        ParentName: string;
        QRType: TQRType;
        Layer: Integer;
        Ptr: Pointer;
      end;TRepcontainer = class
      private
        FRepList: TRepList;
      public
        function GetCount: Integer;
        constructor Create;
        destructor Destroy;
        function GetByName(Name: string): Pointer;
        function GetId(Name: string): Integer;
        procedure SetLayer(Name: string; Layer: Integer);
        procedure Free;
        procedure Add(Item: Pointer);
        procedure Delete(Index: Integer);
        procedure Clear;
        procedure SortLayer;
        procedure RePaint;
      public
        property Count: Integer read GetCount;
        property Reps: TRepList read FRepList write FRepList;
      end;可以在析构函数里做资源的释放。控件的类型按照TQRType注册在FRepList中,
    释放的时候采用下面的方法:
    procedure TRepcontainer.Delete(Index: Integer);
    var
      Item: PTRepItem;
      ptr: Pointer;
    begin
      if Assigned(FRepList) then
      begin
        Item := PTRepItem(FRepList[Index]);
        if Item <> nil then
        begin
          ptr := Item.Ptr;
          case Item.QRType Of
          rLabel:
            PTQRLabel(ptr)^.Free;
          rBand:
            PTQRBand(ptr)^.Free;
          rMemo:
            PTQRMemo(ptr)^.Free;
          rRep:
            PTQuickRep(ptr)^.Free;
          rExpr:
            PTQRExpr(ptr)^.Free;
          else
          end; 
        end;
        FRepList[Index] := nil;
      end;
    end;
      

  8.   

    像贴主所说的那样,我有一个quickreport的报表工具,自己做的
    包括自己定义打印模板(窗口编辑工具,包含chart编辑),基本上跟delphi设计期一样要用的话当然还要自己继续完善美化给我留个mail