首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于FastReport动态生成报表的有关问题(希望有耐心的朋友可以进来详细解答)

2012-02-07 
关于FastReport动态生成报表的问题(希望有耐心的朋友可以进来详细解答)各位朋友,代码如下,总共有22个问题

关于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 '] 数值居中

热点排行