fastReport预览后打印,出现的确认画面如何才能出现在屏幕最前面? (100分)

  • 主题发起人 主题发起人 Afei2
  • 开始时间 开始时间
A

Afei2

Unregistered / Unconfirmed
GUEST, unregistred user!
用frReport作的报表,执行命令后出现报表内容的预览界面(标题为Preview),然后点击左上角的打印按钮来发送打印命令。
我在实际的系统运行中,发送打印命令后会出现一个打印确认的画面(标题为Print),
就象是打印Word文档时,从“文件”菜单上执行打印命令会弹出一个打印范围、打印份数等内容的确认画面。
可是我现在的确认画面弹出时不能马上看到,象是隐藏在当前窗口的后面,要切换到另一个应用程序,然后再切换回来,才会看到该确认画面(第二次发打印命令就不会出现这个问题,打印确认画面会直接出现在当前屏幕前面)。这是为什么?该如何修改才会直接就出现在当前屏幕上呢?

我用的相关代码:
strFilePath:=LoadFileToft('PoliceReport.frf');
frReport1.LoadFromFile(strFilePath);
frDBDataSet1.DataSet:=ADOQuery1;
Page:=frReport1.Pages[0];
frReport1.PrepareReport;
frReport1.ShowPreparedReport;

用frReport1.PrintPreparedReport('',1,true,frAll)的话,就直接打印,
而不出来打印预览画面,更没有打印确认的对话框了。
 
我的这样用的:后两条语句不要,改为用下面
frreport1.showreport;
 
frreport1.showreport过程里面,就是那两条语句呀。看看下面这个过程:
procedure TfrReport.ShowReport;
begin
PrepareReport;
ShowPreparedReport;
end;

 
我在打印报表时,基本上是在预览后,发出打印命令就可以直接打印,所以我隐藏了打印对话框:
frReport1.ShowReport;
frReport1.ShowPrintDialog:=False;

但是有一个报表会有很多页,所以我需要出现打印对话框来设置打印的页面、份数等等,
我就把 frReport1.ShowPrintDialog:=False 这行去掉,结果出来的打印对话框不会显示
在当前屏幕前面,要切换一下屏幕画面(比如切换到另一个应用程序),然后切换回来,才会看到。
 
我试啊试啊,发现了几个奇怪的现象:
1、我上面说的现象,只有在W98下出现,在W2K下测试的时候,打印确认框会直接出现在最前面的;
2、我只有一个报表打印前需要设置,其他都不需要,所以有的地方有frReport1.ShowPrintDialog:=False;
可是我打印时,发现这个语句并不都起作用:
如果我先打需要出现确认画面的报表(有就是没有这个语句的),确认画面出现;
接着打不需要确认画面的(程序中有这个语句的),确认画面还是出现;
接着再打不需要确认画面的,确认画面就不出现了;
然后再打需要出现确认画面的报表,确认画面也不出现了。

如果一开始就先打不需要出现确认画面的报表,系统会直接打印没错,
然后再打需要确认画面的报表时,也是直接就打印了,而没有出来确认画面让我设置。

真是让我越来越糊涂了。
各位DFWs都没有遇见过这样的情况吗?可能是什么方面的问题?

 
没人遇见过啊???
 
我在2000下用沒遇到過你說的情況
明天開始我也要寫報表了,等我遇到再告訴你解決辦法吧,哈哈
 
楼主,
你的话很有意思耶,
你竟然是在说打印,
干吗用frReport1.ShowPreparedReport;呢??????
直接PrintPreparedReportDlg不就OK~~~~~~
因为他用是确实是TfrPrintForm.ShowModal;呀,
所有我怀疑是用了ShowPreparedReport;预览,
造成当TfrPrintFormShowModal后失去焦点,
呵呵~~~~~~~~~~~~~~~~~~~~~
 
frReport没使用过,但从以下语句来看,好象应该顺序交换一下才行:
frReport1.ShowReport;
frReport1.ShowPrintDialog:=False;
改为:
frReport1.ShowPrintDialog:=False;
frReport1.ShowReport;
因为frReport1.ShowReport;已经显示预览窗口,frReport1.ShowPrintDialog:=False;
根本就还没有执行。

 
chnplzh:谢谢!

Netsoft:首先谢谢!
我是想先预览,然后从预览画面上的打印按钮发出打印命令,所以先frReport1.ShowReport;

原来的整个打印程序这样:
procedure Tmainform.spbtReportPoliceClick(Sender: TObject);
var
StrFilePath:string;
page:TfrPage;
begin
if ADOQuery1.Active then
ADOQuery1.Close;
ADOQuery1.Open;
strFilePath:=LoadFileToft('PoliceReport.frf');
frReport1.LoadFromFile(strFilePath);
frDBDataSet1.DataSet:=ADOQuery1;
PrintAll:=True;
Page:=frReport1.Pages[0];
frReport1.ShowReport;
end;

我看了你的回答,去掉ShowReport,加入frReport1.PrintPreparedReportDlg,测试后发现
第一次打印时不出现预览画面,直接有打印确认画面,可是确定后,系统传输打印命令后会
出错:List Index out of Bands(0)。再打第二次时,不出现打印确认画面了,直接就出错。
如果保留frReport1.ShowReport,在其后面加入frReport1.PrintPreparedReportDlg的话,
则有预览画面出来,可是发出打印命令后,会发生同样的错误。

是我没用对吗?
 
那是因为你没有用 PrepareReport的原因啦,
用下面这句啦!!
if frReport1.PrepareReport then frReport1.PrintPreparedReportDlg;
>> 如果保留frReport1.ShowReport,在其后面加入frReport1.PrintPreparedReportDlg的话,
ShowReport是事先执行了一次 PrepareReport 的啦,不信可以看看源码啦!!!!

呵呵~~~~~~~~~~~~~~~
 
不行啊,还是有问题。
我根据你的提示,修改成这样的:
procedure Tmainform.spbtReportPoliceClick(Sender: TObject);
var
StrFilePath:string;
page:TfrPage;
begin
if ADOQuery1.Active then
ADOQuery1.Close;
ADOQuery1.Open;
strFilePath:=LoadFileToft('PoliceReport.frf');
frReport1.LoadFromFile(strFilePath);
frDBDataSet1.DataSet:=ADOQuery1;
PrintAll:=True;
Page:=frReport1.Pages[0];
// frReport1.ShowReport;
if frReport1.PrepareReport then
frReport1.PrintPreparedReportDlg;
end;
运行后,如果只是打这个报表,那么正确,有出来打印确认画面让我设置打印属性,但没有打印预览画面。
可是如果我去打印别的报表后(别的报表是有打印预览,而不需要打印确认的),再转过来打印这个报表,系统就不出来打印确认画面了,而是全部打印了。

该怎么改进呢?拜托!
 
算了,我帮你把整个改一下吧!!!!!

procedure Tmainform.spbtReportPoliceClick(Sender: TObject);
var
StrFilePath:string;
page:TfrPage;
begin
if ADOQuery1.Active then
ADOQuery1.Close;
ADOQuery1.Open;
strFilePath:=LoadFileToft('PoliceReport.frf');
frReport1.LoadFromFile(strFilePath);
frDBDataSet1.DataSet:=ADOQuery1;
PrintAll:=True;
if frReport1.PrepareReport then //准备报表
begin
Page:=frReport1.Pages[0]; //没有生成报表前当然这里有错啦,这句做什么用呀
// frReport1.ShowReport;
frReport1.PrintPreparedReportDlg;
end;
end;

还有错的话真的就真的邪了,
呵呵~~~~~~~~~~~~~~~~~~~~
 
不行,我按你的方法改了,结果跟前面是一样的。还是先打印这个报表可以,去打了别的报表后,
再转过来打这个报表,还是不出来打印确认画面了,而是全部打印了。

我不大清楚FastReport的原理(只会简单地用,:(),但好象不是Page:=frReport1.Pages[0]的问题,
因为我别的程序中,Page:=frReport1.Pages[0]一直都是在frReport1.PrepareReport前面的,
也没什么问题。
我的程序中还有一些别的代码,我认为与这个错误无关,所以没有贴出来。难道是在那里出错?
现在我把全部代码贴出来,请再指教:

需要出现打印确认的(只有这一个):
procedure Tmainform.spbtReportPoliceClick(Sender: TObject);
var
StrFilePath:string;
page:TfrPage;
begin
ADOQuery1.SQL:=DataModule1.ADOQuery2.SQL;
if ADOQuery1.Active then
ADOQuery1.Close;
ADOQuery1.Open;
strFilePath:=LoadFileToft('PoliceReport.frf');
if not FileExists(strFilePath) then
begin
Application.MessageBox(ConstHintStr,'错误提示',mb_iconError);
exit;
end;
frReport1.LoadFromFile(strFilePath);
frDBDataSet1.DataSet:=ADOQuery1;
Page:=frReport1.Pages[0]; //我原来是把PAGE放在这里的,因为下面需要调用
{设置报表标题}
if not SetReportTitle('ReportTitle',page,Sender) then
exit;
if frReport1.PrepareReport then //准备报表
begin
//把PAGE放在这里也不行啊,结果一样的
frReport1.PrintPreparedReportDlg;
end;
end;

不需要出现打印确认画面的程序(基本上都这样):
procedure Tmainform.spbtPoliceTransferClick(Sender: TObject);
var
StrFilePath:string;
page:TfrPage;
begin
if AdoQryDiaodong.Active then
ADOQryDiaodong.Close;
AdoQryDiaodong.Open;
strFilePath:=LoadFileToft('DiaoDong.frf');
if not FileExists(strFilePath) then
begin
Application.MessageBox(ConstHintStr,'错误提示',mb_iconError);
exit;
end;
frReport1.LoadFromFile(strFilePath);
frDBDataSet1.DataSet:=ADOQryDiaoDong;
Page:=frReport1.Pages[0];
{设置报表标题}
if not SetReportTitle('ReportTitle',page,Sender) then
exit;
frReport1.ShowPrintDialog:=False;
frReport2.ShowReport;
end;


 
>> 把PAGE放在这里也不行啊,结果一样的
不是一样的问题,是在此前出错啦,
你看看是什么地方出现的错误啦,
对你的问题真的太难理解,
我都没有遇到过,
你用的是可以多窗口打印还是模式打印呢?????
反正请将处理操作都放在 PrepareReport 后吧!!
或者你实在难以搞定,mail 我看看咯。
妹妹:Netsofte_mail@163.com

呵呵~~~~~~~~~~~~~~~~~~~~
 
我给你发了,谢谢!
不过我的代码好象也就上面贴出来的那些呀

 
那些资料根本没有什么用,
正如你所说是上面的,
我真的有些无能为力,
用有模式的打印吧,
将TfrReport.ModalPreview设为 True,
将MDIPreview设为 False啦,
也许你的问题是出在多MDIChild窗体同时打印,

呵呵~~~~~~~~~~~~~~~~~~~~
 
Netsoft:你说的那些都有设置了的。

现在问题解决了。
原来的问题就是打印别的报表后转过来打印这个出的问题。
试啊试啊,突然发现在预览前加入frReport1.ShowPrintDialog:=True就可以了。
原来是只是在不需要确认的地方放上frReport1.ShowPrintDialog:=False,
以为没设置的地方就是默认为TRUE,没注意到我用的是同一个FRRPORT,设置被改了。
咳,一个小地方没注意到,害得我。。。。。

谢谢各位了!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
611
import
I
后退
顶部