以前写的动态创建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;
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'
首先要计算各个列的宽度并保存至数组,然后在创建
时根据计算的宽度进行调整。 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;
我调试时总是出现如下提示:
[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'
你有mail吗 我发一个demo给你