FastReport3.18使用心得(已更新动态创建Memo)

似乎DFW们都不是很关心控件的新版本使用和老版本的区别,在BBS里基本看到的都是FR2.5版本的使用经验,实在是有点郁闷。干脆这第一个笔记就拿来列举经常用的FR3.18的经验吧。。。

补充的话:看来有不少人来看偶的笔记。希望各位能不只是看,最好能把自己的经验心得也发布在对这笔记的评论中。也许我的做法或者学习的方法不入高手的法眼,但我相信本着“积土成山”的执着,这份资料将会越来越完善。。。引用以前说过的话,我们本身并不重要,重要的是经验的积累和知识的传承。。。再补充句废话:我不想让各位记住我是作者啥的,所以所有的这些“废话”完全可以在转载的时候去掉,还最根本的笔记面貌。而且诸君若不愿意贴连接只愿意直接COPY本文的话,我也无所谓,呵呵。我最希望看到的是不断有弟兄来补充完善这篇笔记而已,这算是本人的一点点期盼,还望有热情的弟兄成全。

最普通和常用的:

使FR报表能打印Form中Edit等组件的Text内容:
  frxReport1.LoadFromFile('1.fr3');
  TfrxMemoView(frxReport1.FindObject('memo1')).memo.text:=Edit1.Text;
  frxReport1.ShowReport();

使FR中Memo能获取程序中的变量并打印:

EXP1:
var i,j,k:string;
begin
  {set variable and show it in report}
  frxReport1.LoadFromFile('1.fr3');
  i:= FormatDatetime('yyyy',DateTimePicker1.Date);
  j:= FormatDatetime('MM',DateTimePicker1.Date);
  k:= FormatDatetime('dd',DateTimePicker1.Date);
  showmessage(i+' '+j+' '+k);
  TfrxMemoView(frxReport1.FindObject('memo2')).memo.text:=i;
  TfrxMemoView(frxReport1.FindObject('memo3')).memo.text:=j;
  TfrxMemoView(frxReport1.FindObject('memo4')).memo.text:=k;
  frxReport1.ShowReport();
end;

EXP2:
var m:string;
begin
m:='测试一下字符赋值变量输出!';
frxReport1.LoadFromFile('1.fr3');
TfrxMemoView(frxReport1.FindObject('Memo5')).Memo.Text:=m;
frxReport1.ShowReport();
end;

EXP3:想分别测试的话只需要去掉对应的注释{},并把冲突的代码用{}注释掉就行。
{var x:TfrxMemoView;}
{var i:double;}
begin
if CheckBox1.Checked then begin
frxReport1.LoadFromFile('1.fr3');
{x:=TfrxMemoView(frxreport1.FindObject('memo1'));
if x<>nil then
x.Memo.Text:=edit1.Text;}
TfrxMemoView(frxReport1.FindObject('memo1')).Memo.Text:=edit1.Text;
{frxreport1.Variables['Edit1']:=Form1.Edit1.Text;
i:=100;
frxreport1.Variables['Edit1']:=i; }
frxreport1.showreport;
end else begin
  frxReport1.LoadFromFile('1.fr3');
  TfrxMemoView(frxReport1.FindObject('memo1')).Memo.Text:='';
  frxreport1.showreport;
  end;
end;

使FR能打印获取的数据库纪录:

这个就不多说了,直接就是设置MasterData的数据源就是了。

非常有意思的一个现象就是,FastReport报表预览及打印时所显示的数据条目跟其DataSet紧密关联,如果数据集中存在的纪录(比如同一ID)有N条,则除了采用设置MasterData的属性外,只好是N页显示。。。这样就会导致很多初接触的人都搞不清楚为什么明明自己只需要一页显示却变成了N页。其实这个问题可以通过修改查询语句,使得数据集得到的返回的纪录仅为一条,或者直接使FR的Memo仅与窗体上的Edit或程序中预设的变量相关联,从而得到解决:)

今天终于解决“如何动态创建FastReport3.18中的Memo”这个问题,对于偶们菜鸟来,有些东西还是要自己动手慢慢试啊(可惜往往菜鸟因为被BOSS压迫时间。。。所以都是急切的心情),为了方便广大菜鸟,干脆给出我的做法了(代码已经实际测试,成功运行并显示):

EXP1:

procedure TForm1.Button1Click(Sender: TObject);
var mymemo: TfrxMemoView;
begin
  frxReport1.Clear;   //此句可有可无,关键在于你自己想不想清空页面内容
  frxReport1.LoadFromFile('test.fr3');
  //下边的Page1是指以第一页本身作为动态创建的FR的Memo的容器,当然你也可以
  //自己指定你要放置该Memo的容器,比如MasterData1等
  mymemo := TfrxMemoView.Create(frxReport1.FindObject('Page1'));
  mymemo.Name := 'MemoTest';
  mymemo.Text := 'Memo的显示内容!';
  mymemo.AutoWidth:=True;  //此处是为Memo指定是否允许自动伸展宽度
  mymemo.WordWrap:=True;  //指定伸展方向
  mymemo.Width := 60;   //自此开始的四行Width、Height、Top、Left属性
  mymemo.Height := 16;  //一定要设置,至于数值可以为你
  mymemo.Top :=100;     //所要放置的地方
  mymemo.Left :=200;
  frxReport1.ShowReport();
end;

由该例衍生的扩展应用举例:条件:ComboBox1的Items内容由数据库获取(如ID),ComboBox2由查询语句筛选对应ComboBox1的Items内容(此处假设就是对应ID)的ComboBox2的Items内容(如ID为1的客户购买的物品1、2、3),再由此动态生成FR中的Memo数并赋相应的正确值。这里给出在窗体中循环获取对应ComboBox1的Items内容(如ID)生成动态的Edit组并一一对应显示获取的值的例子(如何结合动态创建FR中的Memo各位可以自己动动脑筋,当然实在不会的我也可以稍后将答案给出),在此要感谢大富翁论坛里的sbzldlb大侠的热心帮助:

EXP1:

    procedure TForm1.Button1Click(Sender: TObject);
    var Editarray:array of TEdit;
        i:integer;
    begin
      i:=ComboBox1.Items.Count;
      setlength(Editarray,i);
      for i:=0 to  high(Editarray) do
      begin
        Editarray[i]:=TEdit.Create(form1);
        Editarray[i].Parent:=form1;
        Editarray[i].Left:=150;
        Editarray[i].Top:=(i+1)*30;
      end;
    for i:=0 to ComboBox1.Items.Count-1 do
      begin
        Editarray[i].Caption:=ComboBox1.Items[i];
      end;
end;

如何打印窗体Form1中的Image1中的图片?({}内的写法也可以,一种写法的不同形式而已)

begin
  frxReport1.LoadFromFile('example.fr3');
  TfrxPictureView(frxReport1.FindObject('Picture1')).Picture.Graphic:=Form1.Image1.Picture.Graphic;
  {(frxReport1.FindObject('Picture1') as TfrxPictureView).Picture.Graphic:=Form1.Image1.Picture.Graphic;}
  frxReport1.ShowReport();
end;

今天在盒子的论坛里翻老贴看到有人问关于如何将FR报表加水印的,并且该问题一直没有人回答,觉得奇怪,首先是我认为这个问题可以通过换思路来解决,我们可以通过在FR的指定位置添加任何的Image来达到需要的效果,其次我觉得如果不是很必要的话,这个功能加上去有点多余,而且打印出来的效果也不敢恭维。PS:很遗憾地我看到FR3.18中仍然没有针对Image的AlphaBlend及AlphaBlendValue的设定调节。如果对此研究比较深入的朋友看到我这篇笔记的这个部分,还望能提供一下你针对这个缺憾的FR本身的源代码修改方法,谢谢。

脑筋急转弯方式解决这个问题的办法是:在PhotoShop等软件中将需要的水印图片事先做好,记得设置透明度以获取浅色效果,然后在FR中放置一个Image作为背景图即可。

在此对某位询问FR中"第"字等显示问题的弟兄表示歉意,因为终于辞职了,但却又被朋友们拉去义务劳动了。。。好不容易休息了两天,又得继续开始找工作了。。。下次来的时候一定补上!另外,还是希望有更多兄弟来加入本贴的补充完善,而非简单COPY,谢谢

posted @ 2013-05-24 07:01  麦麦提敏  阅读(1834)  评论(0编辑  收藏  举报