我的这个函数不知怎么总在第二次调用时出错,请各位人兄指点!(100分)

  • 主题发起人 主题发起人 Fairys
  • 开始时间 开始时间
F

Fairys

Unregistered / Unconfirmed
GUEST, unregistred user!
发下过程在调用第二次时出错,不知是何原因?
我在工程中加入了一个QuickReport。函数的目的是调用这个QuickReport。
void __stdcall PrintTable(char *cTitle)
{
QuickReport1 = new TQuickReport1(QuickReport1);
QuickReport1->lblTitle->Caption = cTitle;
QuickReport1->Print();
delete QuickReport1;
}
 
---->QuickReport1 = new TQuickReport1(QuickReport1);
第一次调用时quickreport1=nul, 所以正常
第二次调用时,quickreport1=上次生成的已经释放掉的quickreport对象(指向一处非法内存)
等第二次quickreport1释放时, 它要notify它的owner, 也就是那块非法内存, 所以出错
 
是否要重置nul?
 
QuickReport1 = new TQuickReport1(Application);
 
QuickReport1可以改用局部变量
TQuickReport1* QuickReport1 = new TQuickReport1(Application);
 
按Pipi的方法修改后,多次调用都没有出错,
可我将QuickReport1->Print()改为QuickReport1->PreviewModal()时
在想关闭预览窗口时出错:Control 'QuickReport1' has no parent window.
不知是何原因?
void __stdcall PrintTable(char *cTitle)
{
TQuickReport1* QuickReport1 = new TQuickReport1(Application);
QuickReport1->lblTitle->Caption = cTitle;
QuickReport1->PreviewModal();
delete QuickReport1;
}
 
在我这里不会。我的代码是放在窗体类方法里的,你的代码该不会是在DLL里吧?
 
在QuickReport1->PreviewModal();请前指定quickreport1->parent为一form
 
真给Sachow说对了,我的这个函数正是在DLL中的,我的QuickReport是用NEW菜单添加的,
并不是直接加入一个窗体中的,这样有区别吗?QuickReport是不是预览时要依附于窗体,
而打印时则不需要?
To Pearl:能不能说得详细一点,parent在QuickReport的HELP中好象没有太多的介诏!
 
你用Preview()而不要用PreviewModal()试试看,PreviewModal()是以模态方式显示预览窗
口,模态方式的特点是当程进入该窗口的消息循环时,其父窗体就不响应消息,也就是说
在它显示的时候,你要点击它的父窗口就是无效的。
在你的DLL程序中,如果没有建立其它TWinControl控件的实例,并且把报表的Parent设为
一个有效的TWinControl的实例,这时的PreviewModal()基本上就起不到他的作用,报这个
错也是正常的。
在一个普通的窗体程序中,Application->MainForm指向了你的程序的主窗体,它通常是
项目中第一个被建立的窗体,这时执行
TQuickReport1* QuickReport1 = new TQuickReport1(Application);
QuickReport1->Parent就被指向了Application->MainForm,而在一个DLL程序中,通常是
不会自动建立窗体的实例的,所以此时的Applicaion->MainForm就是NULL,所以在执行上
面一句代码的时候,QuickReport1->Parent也就是NULL,于是就出现了这样的结果。
 
注意一点哦。 quickreport是一个可视控件, 和edit, memo一样是继承自TWinControl的, 所以要正常使用你需要给它指定一个父窗口。
 
to Sachow:感谢你的详细解答,我对QuickReport有了一定的了解,
但是我的函数该如何修改才能正常运行?
如何把报表的Parent设为一个有效的TWinControl的实例
(我刚接触BCB不到一个月)
to Pearl.如何指定父窗口?能再说说吗?
 
以下是我修改后并成功运行的DLL函数,请各位多多指点还有什么不好的地方!
void __stdcall PrintTable(char *cTitle)
{
TForm* frmTemp = new TForm(Application)
TQuickReport1* QuickReport1 = new TQuickReport1(frmTemp);
QuickReport1->Parent = frmTemp;
QuickReport1->lblTitle->Caption = cTitle;
QuickReport1->PreviewModal();
delete QuickReport1;
delete frmTemp;
}
 
多人接受答案了。
 
后退
顶部