在制作动态生成报表时出错。请大家指教

kill_net 2002-04-18 03:22:01
//----------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "Unit21.h"
//----------------------------------------------------------------------------
#pragma resource "*.dfm"
Tqp *qp;
//----------------------------------------------------------------------------
__fastcall Tqp::Tqp(TComponent* Owner)
: TQuickRep(Owner)
{
}
//----------------------------------------------------------------------------
void Tqp::ViewAsGrid(TdxDBGrid *dxDBGrid)
{ TQRLabel *Label;
TQRDBText *Text;
int i,left=0;
for (i=0;dxDBGrid->ColumnCount-1>=i;i++)
if( dxDBGrid->Columns[i]->Visible)
{ Label=new TQRLabel(chb);
Text=new TQRDBText(db);
Label->Parent=chb;
Text->Parent=db;
Label->AutoSize=false;
Text->AutoSize=false;
Label->Top=0;
Text->Top=0;
Label->Left=left;
Text->Left=left;
left+=dxDBGrid->Columns[i]->Width;
Label->Width=dxDBGrid->Columns[i]->Width;
Text->Width=Label->Width;
Label->Frame->DrawTop=true;
Label->Frame->DrawLeft=true;
Label->Frame->DrawRight=true;
Label->Frame->DrawBottom=true;
Text->Frame=Label->Frame;
chb->Height=Label->Height;
db->Height=Text->Height;

Label->Name=dxDBGrid->Columns[i]->Field->DisplayLabel+"label";
Label->Caption=dxDBGrid->Columns[i]->Field->DisplayLabel;
qp->DataSet=dxDBGrid->DataSource->DataSet;
Text->DataField=dxDBGrid->Columns[i]->Field->FieldName;
Text->Name=dxDBGrid->Columns[i]->Field->FieldName+"text";
Text->DataSet=dxDBGrid->DataSource->DataSet;
Label->Font=dxDBGrid->HeaderFont;
Text->Font=dxDBGrid->Font;
}
qp->Preview();
delete Text;
delete Label;
}





//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Db.hpp>
#include <DBTables.hpp>
#include <Grids.hpp>
#include "dxCntner.hpp"
#include "dxDBCtrl.hpp"
#include "dxDBGrid.hpp"
#include "dxTL.hpp"
#include <Dialogs.hpp>

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TTable *Table1;
TDataSource *DataSource1;
TdxDBGrid *dxDBGrid1;
TSaveDialog *SaveDialog;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

调用时正常,但在关闭时出错并无法正常退出应用程序
...全文
121 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
781014 2002-05-09
  • 打赏
  • 举报
回复
学习
kill_net 2002-05-09
  • 打赏
  • 举报
回复
不思进取
kill_net 2002-05-05
  • 打赏
  • 举报
回复
for(i=0;i<tb->ComponentCount;i++)
{
TComponent * Temp=dynamic_cast< TComponent *>(tb->Components[i]);
if(Temp!=NULL)
{
try
{ ShowMessage(Temp->Name);
delete Temp; }
catch(...)
{ AnsiString aa="删除不成功"+Temp->Name;
Application->MessageBox(aa.c_str(),"警告",MB_OK);
}
}//if */
}//for
这段程序有问题,在从新调用函数时说已存在同名控件,但删除text的部分正常,不明白为什么同样的程序,执行两遍结果不一样
lya_lya 2002-05-05
  • 打赏
  • 举报
回复
告诉你。还是用控件好。有专门的dtatgrid 打印控件。的
书生 2002-05-05
  • 打赏
  • 举报
回复

delete label;
delete text;
移到最后。
kill_net 2002-05-05
  • 打赏
  • 举报
回复
经过改写的程序,在删除部分运行时有问题
void Treport::PreviewAsGrid(TdxDBGrid *dxDBGrid)
{
//生成控件部分
TQRLabel *Label;
TQRDBText *Text;
int i,left=0;
report->DataSet=dxDBGrid->DataSource->DataSet;
for (i=0;dxDBGrid->ColumnCount-1>=i;i++)
if( dxDBGrid->Columns[i]->Visible)
{
Label=new TQRLabel(tb);
Text=new TQRDBText(db);
Label->Parent=tb;
Text->Parent=db;
tb->Height=Label->Height;
db->Height=Text->Height;
Label->AutoSize=false;
Text->AutoSize=false;
Label->Width=dxDBGrid->Columns[i]->Width;
Text->Width=Label->Width;
Label->Frame->DrawTop=true;
Label->Frame->DrawLeft=true;
Label->Frame->DrawRight=true;
Label->Frame->DrawBottom=true;
Text->Frame=Label->Frame;
Label->Top=0;
Text->Top=0;
Label->Left=left;
Text->Left=left;
left+=dxDBGrid->Columns[i]->Width;
Label->Name=dxDBGrid->Columns[i]->Field->FieldName+"label";
Label->Caption=dxDBGrid->Columns[i]->Caption;
Text->DataSet=dxDBGrid->DataSource->DataSet;
Text->DataField=dxDBGrid->Columns[i]->Field->FieldName;
Text->Name=dxDBGrid->Columns[i]->Field->FieldName+"text";
Label->Font=dxDBGrid->HeaderFont;
Text->Font=dxDBGrid->Font;
}
//显示
report->Preview();
//删除控件部分
delete Text;
delete Label;
for(i=0;i<db->ComponentCount;i++)
{
TComponent * Temp=dynamic_cast<TComponent *>(db->Components[i]);

if(Temp!=NULL)
{
try
{
delete Temp; }
catch(...)
{ AnsiString aa="删除不成功"+Temp->Name;
Application->MessageBox(aa.c_str(),"警告",MB_OK);
}
}//if
}//for

for(i=0;i<tb->ComponentCount;i++)
{
TComponent * Temp=dynamic_cast< TComponent *>(tb->Components[i]);
if(Temp!=NULL)
{
try
{ ShowMessage(Temp->Name);
delete Temp; }
catch(...)
{ AnsiString aa="删除不成功"+Temp->Name;
Application->MessageBox(aa.c_str(),"警告",MB_OK);
}
}//if */
}//for
}
书生 2002-05-05
  • 打赏
  • 举报
回复
//f_print_hl 打印预览窗体
int dw;
for (int i=0; i<f_print_hl->QRBand1->ControlCount; i++)
{
f_print_hl->QRBand1->RemoveControl(f_print_hl->QRBand1->Controls[i]);
delete f_print_hl->QRBand1->Controls[i];
i--;
}
for (int i=0; i<f_print_hl->QRBand2->ControlCount; i++)
{
f_print_hl->QRBand2->RemoveControl(f_print_hl->QRBand2->Controls[i]);
delete f_print_hl->QRBand2->Controls[i];
i--;
}
delete f_print_hl;

用循环删除TQRBand*QRBand1,*QRBand2 上的控件。

或者用楼上的方法,删除对应类型的控件。
houzy123 2002-04-22
  • 打赏
  • 举报
回复
以上是我的应用程序,运行正常,我只提供两个涵数,关键建立componnet时的命名
和release componnet 时的名称调用
houzy123 2002-04-22
  • 打赏
  • 举报
回复
你可以先在new时的name上
我是先用一涵数new componnet 涵数make_caption()
在结束时,用dele_component()

void __fastcall Tinstruction::make_caption(AnsiString x_caption,
int x_fontsize,int x_xh,int x_left,int x_top,int x_height,int x_width,TQRBand *Band)
{
if(!x_caption.IsEmpty())
{
TQRLabel *label=new TQRLabel(instruction);
label->Parent=Band;
label->AutoSize=false;
label->Alignment=taLeftJustify;
label->Left=x_left;
label->Top=x_top;
//label->Height=x_height;
label->Frame->Color=clBlack;
label->Frame->Width=1;
label->Frame->Style=psSolid;
label->Visible=true;
label->Color=clWhite;
label->Transparent=true;
label->Font->Color=clWindowText;
label->Font->Size=ctr_font(x_caption,x_fontsize,x_width);
label->Caption=x_caption;
label->Width=x_width;
AnsiString xsqq="data_label"+IntToStr(x_xh);
label->Name=xsqq;
}
}
//-----------------------------------------

void __fastcall Tinstruction::dele_component()
{
int all_c=QRBand1->ControlCount;
for(int i=all_c-1;i>=0;i--)
{
TWinControl * Temp=dynamic_cast<TWinControl *>(QRBand1->Controls[i]);
if(Temp!=NULL)
{
try
{
if(Temp->Name.SubString(1,10)=="data_label" ||
Temp->Name.SubString(1,8)=="line_row")
delete Temp;
}
catch(...)
{
AnsiString xxw=Temp->Name;
Application->MessageBox(xxw.c_str(),"ss",MB_OK);
}
}
}

}
//---------------------------------------------------------------------------
caijitao 2002-04-20
  • 打赏
  • 举报
回复
:)我宁愿利用Tprinter对象来实现报表。至于预览,在canvas上输出就可以了。
Spring414 2002-04-19
  • 打赏
  • 举报
回复
那可不可以对它的父亲的控件进行循环,找到自己定义的,再Delete?
kill_net 2002-04-18
  • 打赏
  • 举报
回复
这样对内纯的消耗太大了。不行的。
Spring414 2002-04-18
  • 打赏
  • 举报
回复
TQRLabel *Label[100];
用了几个delete几个。
kill_net 2002-04-18
  • 打赏
  • 举报
回复
那该如何解决呀。我知道是出在delete上面
houzy123 2002-04-18
  • 打赏
  • 举报
回复
我出现过类似问题,问题是出现在delete 上面,
并且对生成对象命名只能在对其属性进行设置后再命名
Label->Font=dxDBGrid->HeaderFont;
Label->Caption=dxDBGrid->Columns[i]->Field->DisplayLabel;
Label->Name=dxDBGrid->Columns[i]->Field->DisplayLabel+"label";

Text->DataSet=dxDBGrid->DataSource->DataSet;
Text->DataField=dxDBGrid->Columns[i]->Field->FieldName;
Text->Font=dxDBGrid->Font;
Text->Name=dxDBGrid->Columns[i]->Field->FieldName+"text";
下面这句请在for语句前赋值
qp->DataSet=dxDBGrid->DataSource->DataSet;



kill_net 2002-04-18
  • 打赏
  • 举报
回复
刚才的.h文件贴错了
//----------------------------------------------------------------------------
#ifndef Unit21H
#define Unit21H
//----------------------------------------------------------------------------
#include <vcl\Classes.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Forms.hpp>
#include <vcl\QuickRpt.hpp>
#include <vcl\QRCtrls.hpp>
#include <Grids.hpp>
#include "dxCntner.hpp"
#include "dxDBCtrl.hpp"
#include "dxDBGrid.hpp"
#include "dxTL.hpp"
#include <ExtCtrls.hpp>
//----------------------------------------------------------------------------
class Tqp : public TQuickRep
{
__published:
TQRBand *db;
TQRBand *pfb;
TQRBand *phb;
TQRBand *chb;

private:
public:
__fastcall Tqp::Tqp(TComponent* Owner);
void ViewAsGrid(TdxDBGrid *dxDBGrid);
};
//----------------------------------------------------------------------------
extern Tqp *qp;
//----------------------------------------------------------------------------
#endif

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧