子窗体关闭后再次被打开时其报表显示空数据为什么?(50分)

  • 主题发起人 主题发起人 pckite2
  • 开始时间 开始时间
P

pckite2

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有主窗体一个子窗体和一个报表窗体,主窗体创建的同时创建了子窗体的报表窗体,在主窗体中
打开子窗体后,在子窗体中点击按钮预览其报表内容,一切正常,当关闭子窗体后,再次将其打开,
在子窗体中点击按钮预览其报表内容时,报表显示的内容是空的,为什么?如何解决?
 
是不是关闭子窗口时关闭了数据库。
 
当你关闭子窗体时,同时也关掉了table1或者是query1,这样数据就不能显示了,不如在打开
子窗体时,同时也打开table1或者query1,例如加以下代码:
table1.open;

query1.open;
 
如果再次打开时table1或者是query1已经关闭的话,子窗体中的数据处理就不可能正常了,可是现在
子窗体中的数据显示一切正常啊? 就是其报表不能显示而已。
 
报表是不是要重新执行一下。
 
显示数据是放在哪个事件中的?
 
procedure TForm840.Button20Click(Sender: TObject);
begin
Form_search_report.QuickReport1.Preview;
end;
procedure TForm840.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
action:=cafree;//这有问题吗?在DBGRID中的数据显示操作都没有问题,就是报表收不到内容,重启软件就可以了。如何解决呢?
end;
 
应该是没有问题的啊,莫非QuickReport1也同时释放了?
把代码贴全一点吧。
 
查看一下报表所用的数据源与子窗体上的数据源是不是一致
这个现象象是在报表或子窗体create时得到了打印数据,但窗口关闭后,把打印数据关闭
再打开时不再创建,导致报表打印无内容。
把子窗体或报表create时的代码移到activate去试试。
 
TO:QuickSilver:
把子窗报表create时的代码移到activate去试试。??如何移?我不是很清楚,能具体一点吗?
现在的情况是:不管关闭报表多少次或者DBGRID中的数据如何变化,只要不关闭掉这个子窗体,报表预览
都没有问题,一旦关闭了子窗体就不行了。
可以再加分。
 
你关闭的时候跟踪一下
可以showmessage一些有用的信息出来
应该可以跟踪到的
 
Pckite2:
現在大富翁的質量不如以前了﹐這個問題應該可以解決的。
看你這么急﹐就幫幫你拉。
問題分析如下﹕
QuickReport有一些問題﹐
一.不要輕易在quickrep的Onpreview中加code,哪怕是
一段注釋。// 之類都會引起不能正常preview.你可以試一試。
二.你若是通過onNeedData來獲得數據﹐一定不要忘了重新初始化變量。
三.你的思維是不是有點不對﹐這張報表如果只是為這個子窗體服務
的﹐不必先create吧。在需要的時候再create吧。
四.你的數據源是從何而來的呢。查一查吧。
good luck ! ^_^ 用第三種方法相信能解決的。
 
to:wangfu:
这样有用吗?跟踪什么?我不明白。
 
请检查:
1 报表用的是不是子窗口的数据集?
2 报表对象如何创建,如何得到数据集?
3 当子窗口被释放,并再次创建后,是否再次创建报表?报表用到的数据集经过重新指定?如果数据集
没有重指定给报表?换而言之,当前报表所用的数据集是否有效?
 
老兄,还是把代码贴全一点,要不把这程序发过来,我看看。 lich007@yeah.net
 
pckite,您好!
这是因为你的Form2释放(free)以后,Form2上的AdoQuery1也被释放了,同时打印Form3的
QRDBText控件的Dataset属性连接是AdoQuery1,因为被释放以后它的Dataset同时也被置空,第二
创建Form2的时候,Dataset属性不会自动设置原来的AdoQuery1,因为是空白的,解决的办法是把
Adoquery1和Datasource移到主Form1上即可。 修改的程序已经发到你的信箱。
 
我也贴一段好了,呵
你的Form3是静态创建的,由于form2被释放并重新创建,导致Adoquery1发生变化,
使得form3上的数据控件的dataset找不到数据显示打印。修改如下
project=>view source
把 Application.CreateForm(TForm3, Form3)这句去掉

在form2的button改成
procedure TForm2.Button1Click(Sender: TObject);
var
tf3:tform3;
begin
tf3:=tform3.create(self);
tf3.QuickRep1.Preview;
end;

原来是
procedure TForm2.Button1Click(Sender: TObject);
begin
form3.QuickRep1.Preview;
end;

一般是在DataModule里放一个adoquery
然后在进入不同的Form时赋与不同的SQL语句来取来相关数据。
 
问题解决了,非常感谢QuickSilver和lich007,不过lich007的方法是放在FORM1中的,
但是我有很多子窗体,而且很很多ADOQUERY是同名的,内容也不一样。所以很难做到。
而QuickSilver的方法去很好。我对各位的热心帮助表示衷心的感谢!~
 
老弟这样做不太科学,为什么不建一个数据窗口DataModule,
把所有的数据库控件放在一起? 否则你的程序冗余大,又不好管理。
 
把报表所连接的query执行语句写到form1的button下,query1.close;
......
query1.open;(ExecSQL);
显示数据由clich控制,而不是create。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部