一个fastreport的问题,怎么每人能解决呢?(50分)

  • 主题发起人 主题发起人 hxq2000
  • 开始时间 开始时间
H

hxq2000

Unregistered / Unconfirmed
GUEST, unregistred user!
我想点打印按钮后,先释放掉frreport,再创建一个。
我是这么写的:
frreport1.Free;
frreport1.create(self);
//到这一步出现问题
如果改为
frreport1:=Tfrreport.create;则可以
但是我的frreport1的样式已经设计好了,如果按照上面的方法创建的是一个空的frreport
动态创建frreport的原因:
我的masterdata band是动态的(字段是动态的,比如这次我查询a,b,c三个字段,下次查询的是e,f,g三个字段)。当我打印一次后,已经动态生成了一些控件(Tfrview),当我再次打印时就会发生错误,因为那些动态产生的view没有free掉。我想每次打印前先free掉frreport后,重新创建一个原版的frreport,这样就不会出错了。
但是,怎么写啊?
 
我把完整的代码贴出来:
procedure ThydzcxFrm.Button3Click(Sender: TObject);
var i,num:integer;
v: TfrView;
b: TfrBandView;
w:real;
f:Tfrreport;
checker:string;
begin
if adoquery1.IsEmpty then
exit;
frreport1.Free;
frreport1.Create(self);
//这一步出问题了
frdbdataset1.DataSet:=adoquery1;
frreport1.Dataset:=frdbdataset1;
w:=720/(list.Count+2);
num:=list.Count+1;
b := TfrBandView.Create;
b.SetBounds(0, 400, 0, 20);
b.BandType := btMasterheader;
frreport1.Pages[0].Objects.add(b);
for i:=0 to numdo
begin
v := TfrMemoView.Create;
v.FrameTyp:=15;
//边框
v.SetBounds(round(w*i)+15, 400, round(w), 20);
v.Memo.Add(adoquery1.Fields.FieldName);
v.Prop['Alignment'] := frtaCenter;
//设置文字对其方式
if i<>(num) then
//设置对其方式
v.BandAlign:=baleft
else
v.BandAlign:=barest;
frreport1.Pages[0].Objects.Add(v);
end;

b := TfrBandView.Create;
// create MasterData band
b.SetBounds(0, 450, 0, 20);
b.BandType := btMasterData;
frreport1.Pages[0].Objects.add(b);
for i:=0 to numdo
begin
v := TfrMemoView.Create;
v.FrameTyp:=15;
//边框
v.SetBounds(round(w*i)+15, 450, round(w), 20);
v.Memo.Add('[adoquery1."'+adoquery1.Fields.FieldName+'"]');
v.Prop['Alignment'] := frtaCenter;
if i<>(num) then
v.BandAlign:=baleft
else
v.BandAlign:=barest;
frreport1.Pages[0].Objects.Add(v);
end;

checker:='';
//检验人
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select distinct recorder from hydz '+sql);
adoquery2.Open;
for i:=0 to adoquery2.RecordCount-1do
begin
checker:=checker+adoquery2.FieldValues['recorder']+'、';
adoquery2.Next;
end;
checker:=copy(checker,1,length(checker)-2);
frreport1.FindObject('checker').Memo.Text:=checker;
//预览
frreport1.ShowReport;
end;
 
把frreport1.Create(self);
改为:frreport1:=tfrreport.create(self);
就行了, 刚试过了!
 
但是这样创建的是一个空的frreport,我需要创建一个原版的 frreport1。
 
不是空的阿!!!你先试试看!!!
 
我试了,我新建了一个工程,在窗体上放了一个frreport控件,里面写有东西。放了一个button,在onclick事件中写如下代码:
frreport1.Free;
frreport1:=tfrreport.create(self);
frreport1.ShowReport;
但是执行后什么都没有,连预览窗口都不会出现
 
不是很清楚你的整個東西,
但FR好象有傳參數的,我只看了它的DEMO,可不可用到這裡來。
 
fastreport的报表是保存 成外部文件的
frreport1.Free;
frreport1:=tfrreport.create(self);
frreport1.loadfromfile('wenjian');
frreport1.ShowReport;
 
你试着编一个Class(类),此类就一个动态创建frreport1的类,在类中包括一个公共过程,参数就根据你的需要而设定(在约在三个以上吧)。在第一次用时就调用类,调用类中的过程,把a,b,c传递进去。报表生成。不用时释放类。第二次和第一次一样,只不过参数是e,f,g吧了。你试试看,这个思想是行的通的。不过是你要对Delphi有一个深的了解。这然的话,在编写类中会出现你预想不到的错误。这就要求你的Delphi应该是一个高级程序的水平。
 
后退
顶部