本人以用fastreport3.0作动态报表生成时,希望报表的每一列数据的宽度能够以最佳宽度显示(类似于excel中的最适合的列宽),但不知如何用代码实现是好,望高手解决,急!

解决方案 »

  1.   

    以前写的动态创建fastreport报表的代码,你参考看看,
    首先要计算各个列的宽度并保存至数组,然后在创建
    时根据计算的宽度进行调整。  TaxfrReportBuilder = class(TaxReportBuilder)
      private
        FReportDataset: TfrxDBDataSet;
        FCurY, FPageWidth: Extended;
        FReport: TfrxReport;
        FCellWidths, FCellHeaderWidths: array of Extended;
        function GetReportPage: TfrxReportPage;
        function GetBuilderInfo: TaxfrReportBuilderInfo;
      protected
        class function GetBuilderInfoClass: TaxReportBuilderInfoClass; override;
        function CreateMemo(AParent: TfrxComponent): TfrxCustomMemoView;
        function CreateReportTitleMemo(AParent: TfrxComponent): TfrxCustomMemoView; virtual;
        function CreatePrintDateMemo(AParent: TfrxComponent): TfrxCustomMemoView; virtual;
        function CreatePrintPageMemo(AParent: TfrxComponent): TfrxCustomMemoView; virtual;
        function CreateDataMemo(AParent: TfrxComponent; const ALeft: Extended;
          const AIndex: Integer): TfrxCustomMemoView; virtual;
        function CreateDataHeaderMemo(AParent: TfrxComponent; const ALeft: Extended;
          const AIndex: Integer): TfrxCustomMemoView; virtual;
        function CreateChildBand(AParent: TfrxBand): TfrxChild; virtual;
        function CreateMasterDataBand: TfrxMasterData; virtual;
        procedure DoRenderPrintInfo(AParent: TfrxBand); virtual;
        procedure DoRenderDataHeader(AParent: TfrxBand); virtual;
        procedure OffsetCurY(ABand: TfrxBand);
        procedure DoInitReport; override;
        procedure DoPreparePage; override;
        procedure DoRenderTitle; override;
        procedure DoRenderPageHeader; override;
        procedure DoRenderGroupHeader; override;
        procedure DoRenderPageContent; override;
        procedure DoRenderGroupFooter; override;
        procedure DoRenderPageFooter; override;
        procedure CalculatePageContent; override;
        procedure CalculateCellData; virtual;
        function GetFieldDisplayWidth(const AFieldIndex: Integer): Extended; override;
        function GetFieldCalcWidth(const AFieldIndex: Integer): Extended; virtual;
      public
        ...
      end;procedure TaxfrReportBuilder.CalculateCellData;
    var
      I, ACount: Integer;
      ATotalWidth, AWidth, AMaxWidth: Extended;
    begin
      FCellWidths := nil;
      FCellHeaderWidths := nil;
      ACount := Fields.Count;
      SetLength(FCellWidths, ACount);
      SetLength(FCellHeaderWidths, ACount);
      ATotalWidth := 0;
      AMaxWidth := 0;
      for I := 0 to ACount-1 do
      begin
        AWidth := GetFieldDisplayWidth(I);
        FCellWidths[I] := AWidth;
        if BuilderInfo.ListMode then
          FCellHeaderWidths[I] := AWidth
        else
          FCellHeaderWidths[I] := GetFieldCalcWidth(I);
        if FCellHeaderWidths[I] > AMaxWidth then
          AMaxWidth := FCellHeaderWidths[I];
        ATotalWidth := ATotalWidth + AWidth;
      end;
      if not BuilderInfo.FitPageWidth then
        Exit;
      for I := 0 to ACount-1 do
      begin
        if BuilderInfo.ListMode then
        begin
          AWidth := FCellWidths[I] * FPageWidth / ATotalWidth;
          FCellWidths[I] := AWidth;
          FCellHeaderWidths[I] := AWidth;
        end
        else
        begin
          //todo get line max width
          if BuilderInfo.CellHeaderRightAligned then
            FCellHeaderWidths[I] := AMaxWidth;
          AWidth := FCellHeaderWidths[I];
          if I <> ACount-1 then
            FCellWidths[I] := FPageWidth / BuilderInfo.LineCount - AWidth
          else
            FCellWidths[I] := FPageWidth *
              (1-(I mod BuilderInfo.LineCount)/BuilderInfo.LineCount) - AWidth;
        end;
      end;
    end;procedure TaxfrReportBuilder.DoRenderPageMasterData(
      AMasterData: TfrxMasterData);
    var
      ALineCount, I: Integer;
      ALeft: Extended;
      AFirstCell, AFirstLine: Boolean;
      AMemo: TfrxCustomMemoView;
      AParent, AChild: TfrxBand;
    begin
      AMasterData.StartNewPage := True;
      ALineCount := BuilderInfo.LineCount;
      if ALineCount < 1 then
        ALineCount := 1;
      AChild := nil;
      for I := 0 to Fields.Count-1 do
      begin
        AFirstLine := I div ALineCount = 0;
        AFirstCell := I mod ALineCount = 0;
        if AFirstCell then
        begin
          ALeft := 0;
          if not AFirstLine then
          begin
            if AChild <> nil then
              AParent := AChild
            else
              AParent := AMasterData;
            AChild := CreateChildBand(AParent);
            AChild.Stretched := BuilderInfo.GetDefaultDataBandStretched;
          end;
        end
        else
          ALeft := FPageWidth/ALineCount*(I mod ALineCount);
        if AFirstLine then
          AParent := AMasterData
        else
          AParent := AChild;
        AMemo := CreateDataHeaderMemo(AParent, ALeft, I);
        ALeft := ALeft + AMemo.Width;
        CreateDataMemo(AParent, ALeft, I);
        //ALeft := ALeft + AMemo.Width;
      end;
    end;function TaxfrReportBuilder.CreateDataMemo(AParent: TfrxComponent;
      const ALeft: Extended; const AIndex: Integer): TfrxCustomMemoView;
    begin
      Result := CreateMemo(AParent);
      with Result, BuilderInfo.CellInfo do
      begin
        SetBounds(ALeft, 0, FCellWidths[AIndex], BuilderInfo.GetDefaultCellHeight);
        DataSet := ReportDataset;
        DataField := Fields[AIndex];
        HAlign := GetDataCellHAlign;
        VAlign := GetDataCellVAlign;
        Frame.Typ := GetDataCellFrameTypes;
        StretchMode := GetDataCellStretchMode;
      end;
    end;function TaxfrReportBuilder.GetFieldDisplayWidth(
      const AFieldIndex: Integer): Extended;
    var
      ACalcWidth: Extended;
    begin
      Result := inherited GetFieldDisplayWidth(AFieldIndex);
      ACalcWidth := GetFieldCalcWidth(AFieldIndex);
      if Result < ACalcWidth then
        Result := ACalcWidth;
    end;function TaxfrReportBuilder.GetFieldCalcWidth(
      const AFieldIndex: Integer): Extended;
    var
      AMemo: TfrxCustomMemoView;
    begin
      AMemo := CreateDataHeaderMemo(nil, -1, AFieldIndex);//CreateMemo(nil);
      try
        //AMemo.Text := GetFieldDisplayName(AFieldIndex);
        Result := AMemo.CalcWidth+Length(AMemo.Text)+3;
      finally
        FreeAndNil(AMemo);
      end;
    end;
      

  2.   

    3楼的高手,我试了半天怎么通不过,我想请问下,在uses里面是不是要加什么东西?请问是不是要在uses里面加什么东西?能不能适当的加上注释?
    我调试时总是出现如下提示:
    [Error] axReportBuilder.pas(72): Undeclared identifier: 'BuilderInfo'
    [Error] axReportBuilder.pas(72): 'THEN' expected but identifier 'ListMode' found
    [Error] axReportBuilder.pas(80): 'THEN' expected but identifier 'FitPageWidth' found
    [Error] axReportBuilder.pas(84): 'THEN' expected but identifier 'ListMode' found
    [Error] axReportBuilder.pas(93): 'THEN' expected but identifier 'CellHeaderRightAligned' found
    [Error] axReportBuilder.pas(96): Expression expected but '>' found
    [Error] axReportBuilder.pas(97): Missing operator or semicolon
    [Error] axReportBuilder.pas(98): Statement expected, but expression of type 'Extended' found
    [Error] axReportBuilder.pas(100): ')' expected but identifier 'LineCount' found
    [Error] axReportBuilder.pas(103): '.' expected but ';' found
    [Error] axReportBuilder.pas(105): Undeclared identifier: 'DoRenderPageMasterData'
    [Error] axReportBuilder.pas(105): ';' expected but '(' found
    [Error] axReportBuilder.pas(114): Undeclared identifier: 'AMasterData'
    [Error] axReportBuilder.pas(114): Missing operator or semicolon
    [Error] axReportBuilder.pas(115): Undeclared identifier: 'BuilderInfo'
    [Error] axReportBuilder.pas(115): Missing operator or semicolon
    [Error] axReportBuilder.pas(119): Undeclared identifier: 'Fields'
    [Error] axReportBuilder.pas(128): Expression expected but '>' found
    [Error] axReportBuilder.pas(132): Undeclared identifier: 'CreateChildBand'
    [Error] axReportBuilder.pas(133): Missing operator or semicolon
    [Error] axReportBuilder.pas(137): Undeclared identifier: 'FPageWidth'
    [Error] axReportBuilder.pas(142): Undeclared identifier: 'CreateDataHeaderMemo'
    [Error] axReportBuilder.pas(144): Undeclared identifier: 'CreateDataMemo'
    [Error] axReportBuilder.pas(153): Undeclared identifier: 'BuilderInfo'
    [Error] axReportBuilder.pas(153): 'DO' expected but identifier 'CellInfo' found
    [Error] axReportBuilder.pas(155): ')' expected but identifier 'GetDefaultCellHeight' found
    [Error] axReportBuilder.pas(155): 'END' expected but ')' found
    [Warning] axReportBuilder.pas(163): Text after final 'END.' - ignored by compiler
    [Hint] axReportBuilder.pas(12): Private symbol 'FReportDataset' declared but never used
    [Hint] axReportBuilder.pas(13): Private symbol 'FCurY' declared but never used
    [Hint] axReportBuilder.pas(14): Private symbol 'FReport' declared but never used
    [Hint] axReportBuilder.pas(16): Private symbol 'GetReportPage' declared but never used
    [Error] axReportBuilder.pas(20): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.CreateMemo'
    [Error] axReportBuilder.pas(21): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.CreateReportTitleMemo'
    [Error] axReportBuilder.pas(22): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.CreatePrintDateMemo'
    [Error] axReportBuilder.pas(23): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.CreatePrintPageMemo'
    [Error] axReportBuilder.pas(26): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.CreateDataHeaderMemo'
    [Error] axReportBuilder.pas(28): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.CreateChildBand'
    [Error] axReportBuilder.pas(29): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.CreateMasterDataBand'
    [Error] axReportBuilder.pas(30): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.DoRenderPrintInfo'
    [Error] axReportBuilder.pas(31): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.DoRenderDataHeader'
    [Error] axReportBuilder.pas(32): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.OffsetCurY'
    [Error] axReportBuilder.pas(43): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.GetFieldDisplayWidth'
    [Error] axReportBuilder.pas(44): Unsatisfied forward or external declaration: 'TaxfrReportBuilder.GetFieldCalcWidth'
    [Fatal Error] Project2.dpr(5): Could not compile used unit 'axReportBuilder.pas'
      

  3.   

    qq5561876
    你有mail吗 我发一个demo给你
      

  4.   

    我的emial是[email protected],谢谢啊