FASTREPORT中如何实现预览显示和打印结果不一样? ( 积分: 100 )

  • 主题发起人 主题发起人 microtan
  • 开始时间 开始时间
M

microtan

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现FASTREPORT在预览时可看到打印成型后的样子,但在打印时只打印
其中的数据,而不打印单据格式等等(比如表格线),如何实现?
 
如何实现FASTREPORT在预览时可看到打印成型后的样子,但在打印时只打印
其中的数据,而不打印单据格式等等(比如表格线),如何实现?
 
做一个打印按钮,一个预览按钮,两个报表文件,并取掉预览界面里的打印按钮
预览时调用一个含有格式的报表文件,打印时调用另一个。
 
同意楼上的好啊
 
用一个报表文件不行吗?FASTREPORT中可不可以用事件来控制MEMO的VISIBLE的呀?
 
没有人提出更好的方法吗?难道FASTREPORT实现不了这样的功能吗?
 
没有更好的方法吗[:(]?难道FASTREPORT实现不了这样的功能吗?
 
你是不是在设置FASTREPORT时将表格线设置为不打印了,我想是在设置时出的问题.
 
现版本的FastReport本身提供的功能实现不了这个,你可考虑自己写个打印预览窗口或更改FastReport源代码。我在一个项目里是这样实现的...
在报表文件里把不想打印的东西放在Overlay(或其它),然后

更改的内容
================================================================================
frxPreview.pas ?V3.07...
--------------------------------------------------------------------------------
procedure TfrxPreviewForm.PrintBClick(Sender: TObject);
var
Overlay: TfrxComponent;
//Add by Flying,2004.10.10
begin
if not frxPrinters.HasPhysicalPrinters then
frxErrorMsg(frxResources.Get('clNoPrinters'))
else
//FPreview.Print;
//Delete by Flying,2004.10.10
// Add by Flying,2004.10.10
// ---------------------- From -------------------
begin
Overlay := Report.FindObject('Overlay');
if Overlay=nil then
FPreview.Print else
begin
Overlay.Visible := False;
Report.PrepareReport;
FPreview.Print;
end
end;
// ---------------------- To ---------------------
end;
 
to:Softec
非常感谢你的意见[:)]
不过我的报表比较复杂,该怎样才能将那些个不想打印的东西放在一个Overlay里?
 
在FastReport3.0 以上的版本有个Overlay(水印)层,就像这个网页的格调,跟报表其他部分是视觉上是分隔的,打印的时候会跟其他层(Report Header,Body)叠加在一起,很容易用,可把不打印的东西放在这个层上面,形成的报表会很清晰,我就是用这种方法移除套打单据的格线的。但2.xx的Overlay就比较难操做,需要用脚本在打印时去移动...
 
对FastReport不是特别熟,不过自己也手写过手工打印的代码,也改过一些三方控件的打印代码,个人认为FastReport这样比较成熟的三方控件应该会提供这样功能,比如你上面提到的不打印表格线,这对控件编写者来说是很容易的事情,只要设置一个布尔变量就可以控制,我用过的几个三方控件打印一般都提供了这样的功能,如果没有也没关系,改起来很简单,一般打印最终都是对Canvas操作,你只要找到对Canvas操作的那段代码,将画表格线的那段代码注释掉就可以了,顺便提一下,几乎所有的打印代码对网格内的内容和网格都是单独操作的.也就是说编写者会调用两个draw方法,一个画网格的内容,一个画网格.
 
有人在未到2.xx版的时候问过Fastreport的作者,回复说尚未实现这样的功能,目前3.xx没好好研究过,好像也没见这样的选项。还有,不清楚Fastrepot打印预览的机制,但打印机的预览功能跟控件Canvas编程是不一样的,预览应该是GDI命令转储,而踏浪的说得那种注释Canvas的方法,应该也算是2次打印。
将画表格线的代码注释掉--预览的时候就不会有,而且辨别哪些是表格线对象也是个问题,就需要添加额外的属性等等,改动起来会比较麻烦...
 
谁能提供一些有关Fast report的 help文件 呀,我刚用,无从下手呀
 
一、在同一个FastReport文件中就能实现:
把只需预览时显示不需要打印的对象的Tag属性定义为一个负数,如-1,然后用下面的代码替换原程序中的相应部分就可以了:
function notprint(frReport1:tfrReport):boolean;
//处理不需打印的对象
var
i,j:integer;
begin
for j:=0 to frreport1.Pages.Count-1do
for i:=0 to frReport1.Pages[j].Objects.count-1do
if strtointdef(TfrView(frReport1.Pages[j].Objects).tag,0)<0 then
TfrView(frReport1.Pages[j].Objects).Visible:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
//打印
begin
frReport1.LoadFromFile('c:/1.frf');
notprint(frReport1);
frReport1.PrepareReport;
frReport1.PrintPreparedReport('',1,True,frAll);
end;

procedure TForm1.Button2Click(Sender: TObject);
//预览
begin
frReport1.LoadFromFile('c:/1.frf');
frReport1.ShowReport;
end;

二、在Fr3中,Memo等有一个Printtable属性,设置为False时,就能达到只预览不打印的目的。
 
procedure TForm1.btn1Click(Sender: TObject);
//预览
begin
frReport1.LoadFromFile('c:/1.frf');
frReport1.ShowReport;
end;

procedure TForm1.btn2Click(Sender: TObject);
//打印
var
i, j : integer;
begin
frReport1.LoadFromFile('c:/1.frf');
for j := 0 to frReport1.Pages.Count - 1do
for i := 0 to frReport1.Pages[j].Objects.Count - 1do
begin
if TfrView(frReport1.Pages[j].Objects).classname = 'TfrMemoView' then
TfrView(frReport1.Pages[j].Objects).FrameTyp := 0;
//边框不打印
if TfrView(frReport1.Pages[j].Objects).classname = 'TfrLineView' then
TfrView(frReport1.Pages[j].Objects).Visible := false;
// 划线不打印
end;
frReport1.PrepareReport;
frReport1.PrintPreparedReport('', 1, True, frAll);
end;

******************************************************************************
灵活运用以上两种方法,就能实现你的要求了。
******************************************************************************
 
楼上的方法很好,委值得借鉴,但不FastReport 3.xx已经提供这个功能了,在属性框里有这个属性的,自己查查看吧
 
多人接受答案了。
 
后退
顶部