关于FastReport动态生成报表的问题(希望有耐心的朋友可以进来详细解答)
各位朋友,代码如下,总共有22个问题之多,希望论坛上有耐心的朋友可以详细解答里面所提及的问题,谢谢!!!
procedure Textdraw(r: trect; s: string; f: tfont; p: tfrpage; ALIGNMENT, FRAMETYP: integer);//问题1:这个函数的整体作用是什么?
var //问题2:Trect这个类的作用是什么呢?
{
PRect = ^TRect;
TRect = packed record
case Integer of
0: (Left, Top, Right, Bottom: Longint);//问题3:里面的几个参数是什么意思?
1: (TopLeft, BottomRight: TPoint);//问题4:里面的几个参数又是什么意思?什么时候该用0,什么时候该用1?
}
fm: TfrMemoView;
W, h: integer;
begin
fm := TfrMemoView.Create;
fm.Prop[ 'textonly '] := true;
fm.Prop[ 'ALIGNMENT '] := ALIGNMENT;//问题5:这句是什么意思?
fm.Font.Assign(f);//问题6:这句又是什么意思,用了这句之后有什么作用?
fm.Prop[ 'top '] := r.Top;//问题7:为什么不直接将一个数值赋给该MEMO的TOP,而需要将R.top的值赋给它,这样有什么作用?
fm.Prop[ 'left '] := r.Left;//问题8:为什么不直接将一个数值赋给该MEMO的left,而需要将R.left的值赋给它,这样有什么作用?
fm.Prop[ 'FRAMETYP '] := FRAMETYP;
fm.Prop[ 'width '] := r.Right - r.Left;//问题9:为什么要将r.Right-r.Left赋给它,而不是直接赋一个值给Width
fm.Prop[ 'height '] := r.Bottom - r.Top;//问题10:r.Bottom是一个什么属性来的,为什么要将r.Bottom-r.Top赋给它,而不是直接赋一个值给Height
fm.Memo.Text := s;
p.Objects.Add(fm)
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Arect: TRect;
pw, ph: integer;
page: tfrpage;
x, y, y_Begin_Top: integer;
textFont: TFont;
Arow: integer;
oldF1, nowF1, nowF2, nowF3: string;
procedure newpage;//问题11:这个过程的整体作用是什么呢?
begin
fr.Pages.Add;
page := fr.Pages[fr.Pages.Count - 1];//问题12:这句话是什么意思?
pw := fr.Pages[0].Prop[ 'width '];//问题13:将页宽赋值给PW是目的是什么?
ph := fr.Pages[0].Prop[ 'height '];问题14:将页高赋值给PH的目的又是什么?
x := 10;//问题15:X和Y的作用是什么?是表示页面的哪个值?
y := 10;
end;
begin
fr.Pages[0].Clear;
fr.Pages.Clear;//问题16:为什么前面已经有了一句Clear,这里又要有一句Clear,这两句Clear有什么作用?
textFont := TFont.Create;
textFont.Assign(Font);//问题17:这句是什么意思?
textFont.Size := 13;
oldF1 := ' ';
for Arow := 1 to ADODataSet1.RecordCount do
begin
ADODataSet1.RecNo := Arow;
nowF1 := ADODataSet1.Fieldbyname( 'f1 ').AsString;
nowF2 := ADODataSet1.Fieldbyname( 'f2 ').AsString;
nowF3 := ADODataSet1.Fieldbyname( 'f3 ').AsString;
if (Arow = 0) or (oldF1 <> nowF1) then
begin
newpage;
x := 20;
y := 20;
Arect := Rect(x, y, x + 200, y + 20);
{
function Rect(Left, Top, Right, Bottom: Integer): TRect;
begin
Result.Left := Left;
Result.Top := Top;
Result.Bottom := Bottom;
Result.Right := Right;
end;
//问题18:这个Rect函数的作用是什么?里面的各个参数又是表示什么意思?
}
Textdraw(Arect, '详细记录: ' + nowF1, textFont, page, 3, 0);
x := x + 200;
y := y + 20;
y := y + 4;
y_Begin_Top := -1;//问题19:这个y_Begin_top变量的作用是什么?
end;
x := 20;
Arect := Rect(x, y, x + 100, y + 20);
Textdraw(Arect, nowF1, textFont, page, 3, 15);
x := x + 100;
if y_Begin_Top < 0 then
begin
y_Begin_Top := y;
end;
if (Arow = ADODataSet1.RecordCount) then
begin
Arect := Rect(x, y_Begin_Top, x + 100, y + 20);
Textdraw(Arect, nowF2, textFont, page, 11, 15);
y_Begin_Top := -1;
end
else
begin
ADODataSet1.RecNo := Arow + 1;
if (ADODataSet1.Fieldbyname( 'f1 ').AsString <> nowF1)
or
(ADODataSet1.Fieldbyname( 'f2 ').AsString <> nowF2) then
begin
Arect := Rect(x, y_Begin_Top, x + 100, y + 20);
Textdraw(Arect, nowF2, textFont, page, 11, 15);
y_Begin_Top := -1;
end;
end;
x := x + 100;
Arect := Rect(x, y, x + 100, y + 20);
Textdraw(Arect, nowF3, textFont, page, 3, 15);
y := y + 20;
oldF1 := nowF1;
end;
fr.DesignReport;
fr.PrepareReport;//问题20:这句是什么意思?
fr.ShowPreparedReport;//问题21:这句又是什么意思,另外,为什么不直接用ft.showreport?
end;
//问题22:这个函数在哪个地方是画线的,哪个地方是使数值居中的?
[解决办法]
procedure Textdraw(r: trect; s: string; f: tfont; p: tfrpage; ALIGNMENT, FRAMETYP: integer);//问题1:这个函数的整体作用是什么?
//-- 创建一个文本框
var //问题2:Trect这个类的作用是什么呢?
//--标示区域
{
PRect = ^TRect;
TRect = packed record
case Integer of
0: (Left, Top, Right, Bottom: Longint);//问题3:里面的几个参数是什么意思?
1: (TopLeft, BottomRight: TPoint);//问题4:里面的几个参数又是什么意思?什么时候该用0,什么时候该用1?
}
//--Left, Top, Right, Bottom 左,上,右,下
//--TopLeft = 左上 BottomRight: 右下
fm: TfrMemoView;
W, h: integer;
begin
fm := TfrMemoView.Create;
fm.Prop[ 'textonly '] := true;
fm.Prop[ 'ALIGNMENT '] := ALIGNMENT;//问题5:这句是什么意思?
//--对齐方式
fm.Font.Assign(f);//问题6:这句又是什么意思,用了这句之后有什么作用?
//-- 设置字体
//--fm.Font 和 参数f 一样
fm.Prop[ 'top '] := r.Top;//问题7:为什么不直接将一个数值赋给该MEMO的TOP,而需要将R.top的值赋给它,这样有什么作用?
//--fastreport 这样规定的
fm.Prop[ 'left '] := r.Left;//问题8:为什么不直接将一个数值赋给该MEMO的left,而需要将R.left的值赋给它,这样有什么作用?
//--fastreport 这样规定的
fm.Prop[ 'FRAMETYP '] := FRAMETYP;
fm.Prop[ 'width '] := r.Right - r.Left;//问题9:为什么要将r.Right-r.Left赋给它,而不是直接赋一个值给Width
//--fastreport 这样规定的
fm.Prop[ 'height '] := r.Bottom - r.Top;//问题10:r.Bottom是一个什么属性来的,为什么要将r.Bottom-r.Top赋给它,而不是直接赋一个值给Height
//--fastreport 这样规定的
fm.Memo.Text := s;
p.Objects.Add(fm)
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Arect: TRect;
pw, ph: integer;
page: tfrpage;
x, y, y_Begin_Top: integer;
textFont: TFont;
Arow: integer;
oldF1, nowF1, nowF2, nowF3: string;
procedure newpage;//问题11:这个过程的整体作用是什么呢?
//-- 开始新的一页
begin
fr.Pages.Add;
page := fr.Pages[fr.Pages.Count - 1];//问题12:这句话是什么意思?
// 当前页page := fr中的最后一页(就是上边 fr.Pages.Add 新加的)
pw := fr.Pages[0].Prop[ 'width '];//问题13:将页宽赋值给PW是目的是什么?
//-- 暂时没用
ph := fr.Pages[0].Prop[ 'height '];问题14:将页高赋值给PH的目的又是什么?
//--下面作比较用
x := 10;//问题15:X和Y的作用是什么?是表示页面的哪个值?
y := 10;
//-- 自己用的变量 算位置用的
end;
begin
fr.Pages[0].Clear;
//-- 可以去掉
fr.Pages.Clear;//问题16:为什么前面已经有了一句Clear,这里又要有一句Clear,这两句Clear有什么作用?
//-- 清空所有的页
textFont := TFont.Create;
textFont.Assign(Font);//问题17:这句是什么意思?
//--将 textFont 设置的 和 窗体的 字体 一样
textFont.Size := 13;
oldF1 := ' ';
for Arow := 1 to ADODataSet1.RecordCount do
begin
ADODataSet1.RecNo := Arow;
nowF1 := ADODataSet1.Fieldbyname( 'f1 ').AsString;
nowF2 := ADODataSet1.Fieldbyname( 'f2 ').AsString;
nowF3 := ADODataSet1.Fieldbyname( 'f3 ').AsString;
if (Arow = 0) or (oldF1 <> nowF1) then
begin
newpage;
x := 20;
y := 20;
Arect := Rect(x, y, x + 200, y + 20);
{
function Rect(Left, Top, Right, Bottom: Integer): TRect;
begin
Result.Left := Left;
Result.Top := Top;
Result.Bottom := Bottom;
Result.Right := Right;
end;
//问题18:这个Rect函数的作用是什么?里面的各个参数又是表示什么意思?
//--就是获得一个 TRect 左,上,右,下
}
Textdraw(Arect, '详细记录: ' + nowF1, textFont, page, 3, 0);
x := x + 200;
y := y + 20;
y := y + 4;
y_Begin_Top := -1;//问题19:这个y_Begin_top变量的作用是什么?
//--y_Begin_Top 记录要合并的那个字段 的 上(垂直开始) 位置。
end;
x := 20;
Arect := Rect(x, y, x + 100, y + 20);
Textdraw(Arect, nowF1, textFont, page, 3, 15);
x := x + 100;
if y_Begin_Top < 0 then
begin
y_Begin_Top := y;
end;
if (Arow = ADODataSet1.RecordCount) then
begin
Arect := Rect(x, y_Begin_Top, x + 100, y + 20);
Textdraw(Arect, nowF2, textFont, page, 11, 15);
y_Begin_Top := -1;
end
else
begin
ADODataSet1.RecNo := Arow + 1;
if (ADODataSet1.Fieldbyname( 'f1 ').AsString <> nowF1)
or
(ADODataSet1.Fieldbyname( 'f2 ').AsString <> nowF2) then
begin
Arect := Rect(x, y_Begin_Top, x + 100, y + 20);
Textdraw(Arect, nowF2, textFont, page, 11, 15);
y_Begin_Top := -1;
end;
end;
x := x + 100;
Arect := Rect(x, y, x + 100, y + 20);
Textdraw(Arect, nowF3, textFont, page, 3, 15);
y := y + 20;
oldF1 := nowF1;
end;
fr.DesignReport;
fr.PrepareReport;//问题20:这句是什么意思?
//-- 准备 报表
fr.ShowPreparedReport;//问题21:这句又是什么意思,另外,为什么不直接用ft.showreport?
//-- 预览已经准备好的报表
//-- 两句 可以 由 ft.showreport 代替
end;
//问题22:这个函数在哪个地方是画线的,哪个地方是使数值居中的?
//--fm.Prop[ 'FRAMETYP '] FRAMETYP 画线
//--fm.Prop[ 'ALIGNMENT '] 数值居中