FastReport2.x可以直接在报表设计器中引用Form里的DataSet,可是FastReport3之后的版本则一定要通过frxDBDataSet来引用,这样如果我在报表设计时要引用Form里的多个数据集,就必须每个数据集都通过对应的frxDBDataSet才能引用。改用ReportMachine也是一样的。
   由于我的程序是允许用户在运行期间设计报表的,所以必须要能让用户在运行期间可以在报表里引用当前Form的不同的数据集,而不用通过修改程序再增加或更新frxDBDataSet。有高手可以告诉我如何实现吗?    顺便感慨一下,FastReport功能越来越强大,可以开发也越来越复杂了,有些很简单的应用也搞得很复杂才能实现

解决方案 »

  1.   

    动态创建frxDBDataSet,仅供参考
      

  2.   

    tjianliang:
        我是要把报表设计的权限完全交给用户,而不用去二次开发,就像FastReport2.x的设计器里可以直接让用户选择当前程序所有的数据集和数据字段一样。
      

  3.   

    他们都有各自的DBDataSet,然后指定到form上的adoquery就行了
      

  4.   

    bdmh:
      没有完全明白你的意思。我是想不通过frDataSet而直接引用Form里的ADODataSet,而且可能会同时引用多个ADODataSet,这样就是通过frDataSet来引用,也不能同时引用吧?
      

  5.   

    ReportMachine的设计器继承了FastReport2时代的简洁特征,但好像也必须通过rmDataSet来引用数据集,不过因为我用得不熟,不知道熟ReportMachine的高手有没有好的解决方法?
      

  6.   

    如果是 bpl 里的话,用 Components 是可行的。
    如果是 dll 的话,…… 搞定了也告诉我一下。学习。
      

  7.   

    iamduo:
      我是在Delphi开发,当然是用VCL的FastReport,也就是你所说的bpl,但不知你说的Components具体是怎么实现呢?请赐教!
      

  8.   

    高手没有。
    给你一段参考。
    function ShowFastReportManageForBpl(AOwner:TForm):Boolean;
    var i,iCount:Integer;ds:TfrxDBDataset;
    begin
      Result:=false;
      if not FileExists(AppPrintIniFileName) then
      begin
        ShowMessage('配置文件不存在'+#13#10+AppPrintIniFileName);
        exit;
    //    raise Exception.Create('configuration file not found(配置文件丢失)');
      end;
      with TfrmFastReportManage.Create(AOwner) do
      try
        // 先建立Fast的DataSet
        frxReport1.DataSets.Clear;
        iCount:=0;
        for i:=0 to AOwner.ComponentCount-1 do
        begin
          if AOwner.Components[i] is TDataSource then
          begin
            Inc(iCount);
            ds:=TfrxDBDataset.Create(This);
            ds.DataSource:=TDataSource(AOwner.Components[i]);    // TDataSource(AOwner.Components[i]);//DLL中用as会失败,原因似乎是FR在DLL中与DataSet不合。
            ds.UserName:=TDataSource(AOwner.Components[i]).Name; // 还是不要修改名字看得清楚点  'FastDataSet'+IntToStr(iCount);
    //        frxReport1.DataSets.Add(ds); //好像加不加都一样存在
          end;
        end;
        if iCount=0 then ShowMessage('当前模块不支持打印') else Result:=true;
        ShowModal;
      finally
        Free;
      end;
    end;