窗体的继承问题?(30分)

  • 主题发起人 主题发起人 lbylby
  • 开始时间 开始时间
L

lbylby

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个数据库管理系统,其中有三个类似的查询界面,我就用了窗体的继承,
Form1,是父窗体,Form2,Form3是继承Form1,它们公用数据模块中的一个Query控件
当我在数据模块中的Query控件写Beforepost的事件时,使用Form1的Dbgrid控件,
现在的问题时,当我在Form1窗体触发这个事件时没有问题,但是当我没有先启动
Form1而直接在Form2或Form3触发这事件时出错了,但是如果先触发Form1再触发
子窗体的事件又不出错,因为我是动态创建窗体的,所以我想可肯能是错在没有创
建父窗体而直接创建子窗体的缘故吧,但是我先创建父窗体,再创建子窗体时还是
触发该事件出了错,一定要先运行父窗体,然后再关闭窗体(不一定要先触发那事件)
,再运用子窗体才不出错,这是怎么回事啊?有什么解决的办法吗?
 
我觉得你完全没有必要用继承窗体的方法,可以用三个独立的form,要用哪个就临时创建就是了
如果非得用继承窗体时,那就得注意创建与释放的对应性了,有效的简决方法是,form1自动创建
以后就不要再创建form1的实例了,否则也会出错的
 
我认为你在datamodual中的beforePost事件中时,最好不要用具体的对象名称,而最好设置
一个域指向某个dbGrid,使用时视具体对象而定。
例如:在DataModual中加入一个PostDataGird属性,在具体窗体创建时将窗体包含的
DataGrid赋值给DataModual的PostDataGird属性,在BeforePost使用PostDataGrid属性而
不是具体窗体的DataGird。
 
呵呵!怎么没有人回答啊?是大家没有碰上这问题还是我表达不清啊!
TO eliuliu,: 能不能把你得方法再详细说一下啊?
TO 无所居, 我试了,也行不通啊!还有出现了其他的一些问题!
 
哥们以前用过这方法好用的不要没信心怎么说D也是真继承的东东呀比VB强多了。
 
一般情况下应该是父窗体没有建立,把你写的相关代码列出来看看吧.
 
void __fastcall TDM::ADOQcheckjlBeforePost(TDataSet *DataSet)
{ int i;
bool flag;
AnsiString tempstr,sqlstr,kcname;
if (Application->MessageBox("确定要修改该数据吗?","警告",MB_ICONINFORMATION+MB_YESNO)==IDNO)
{
ADOQcheckjl->Active=false; //放弃修改,刷新恢复
ADOQcheckjl->Active=true;
Abort();
}
else //修改处理
[:(!]{ for(i=1;i<=Frljjl->DBGridjl->FieldCount;i++)[:(!]
[:(!][:(!]//当没有先运行父窗体,而直接运行子窗体时这里出错了,Frljjl是父窗体,Frljjl->DBGridjl->FieldCount没有数据。
{
tempstr=Frljjl->DBGridjl->FieldName(i);
if(Frljjl->DBGridjl->Fields[i-1]->OldValue!=Frljjl->DBGridjl->Fields[i-1]->NewValue && (tempstr=="名称" || tempstr=="型号规格" || tempstr=="数量" ))
{ flag=true; //判断改动的是不是名称,型号,或数量,是就要改动数据库
break;
}
}
if(flag==true) //判断改动的是不是名称,型号,或数量,是就要改动数据库
{
if(DM->tablename=="ljjhdb" || DM->tablename=="lldb" || DM->tablename=="fwjgdb" || DM->tablename=="tldb" )
{ //判断修改哪个库存表
sqlstr="select 数量 from ljkcb where 名称= '"+ADOQcheckjl->FieldByName("名称")->OldValue+"'";
sqlstr=sqlstr+" and 型号规格= '"+ADOQcheckjl->FieldByName("型号规格")->OldValue+"'";
kcname="ljkcb"; //零件库存表
}
else
{
if(DM->tablename=="hsjgdb" || DM->tablename=="bcpsydb")
{
sqlstr="select 数量 from bcpkcb where 名称= '"+ADOQcheckjl->FieldByName("名称")->OldValue+"'";
sqlstr=sqlstr+" and 型号规格= '"+ADOQcheckjl->FieldByName("型号规格")->OldValue+"'";
kcname="bcpkcb"; //半成品库存表
}
else
{
sqlstr="select 数量 from cpkcb where 名称= '"+ADOQcheckjl->FieldByName("名称")->OldValue+"'";
sqlstr=sqlstr+" and 型号规格= '"+ADOQcheckjl->FieldByName("型号规格")->OldValue+"'";
kcname="cpkcb"; //成品库存表
}
}
DM->ADOQuery2->Close();
DM->ADOQuery2->SQL->Clear();
DM->ADOQuery2->SQL->Add(sqlstr); //查出库存原来的值
DM->ADOQuery2->Open();
if(ADOQuery2->RecordCount==1) //数据库正常处理;
{ sqlstr="update "+kcname+" set 数量=:a where 名称= '"+ADOQcheckjl->FieldByName("名称")->OldValue+"'"+" and 型号规格= '"+ADOQcheckjl->FieldByName("型号规格")->OldValue+"'";
DM->ADOQljjhdb->Close();
DM->ADOQljjhdb->SQL->Clear();
DM->ADOQljjhdb->SQL->Add(sqlstr);
DM->ADOQljjhdb->Parameters->ParamByName("a")->Value=DM->ADOQuery2->FieldByName("数量")->Value - ADOQcheckjl->FieldByName("数量")->OldValue;
DM->ADOQljjhdb->ExecSQL();//把库存原值减去更改前的记录值
DM->ADOQljkcb->Close(); //从库存表中查询
DM->ADOQljkcb->SQL->Clear();
sqlstr="select * from "+kcname+" where 名称=:a and 型号规格=:b";
DM->ADOQljkcb->SQL->Add(sqlstr);
DM->ADOQljkcb->Parameters->ParamByName("a")->Value=ADOQcheckjl->FieldByName("名称")->NewValue;;
DM->ADOQljkcb->Parameters->ParamByName("b")->Value=ADOQcheckjl->FieldByName("型号规格")->NewValue;
DM->ADOQljkcb->Open();
if(DM->ADOQljkcb->RecordCount==1) //判断新值是否存在库存中,是就更新数据库
{ sqlstr="update "+kcname+" set 数量=数量+:a where 名称= '"+ADOQcheckjl->FieldByName("名称")->NewValue+"'"+" and 型号规格= '"+ADOQcheckjl->FieldByName("型号规格")->NewValue+"'";
DM->ADOQljjhdb->Close();
DM->ADOQljjhdb->SQL->Clear();
DM->ADOQljjhdb->SQL->Add(sqlstr);
DM->ADOQljjhdb->Parameters->ParamByName("a")->Value=ADOQcheckjl->FieldByName("数量")->NewValue;
DM->ADOQljjhdb->ExecSQL();

}
else //否就插入库存中
{
if(kcname=="cpkcb") //插入到成品库存中
{
sqlstr="insert into "+kcname+" (序号,名称,型号规格,产品编号,单位,数量) values(:a1,:a2,:a3,:a4,:a5,:a6)";
DM->ADOQljjhdb->Close();
DM->ADOQljjhdb->SQL->Clear();
DM->ADOQljjhdb->SQL->Add(sqlstr);
DM->ADOQljjhdb->Parameters->ParamByName("a1")->Value=ADOQcheckjl->FieldByName("序号")->NewValue;
DM->ADOQljjhdb->Parameters->ParamByName("a2")->Value=ADOQcheckjl->FieldByName("名称")->NewValue;
DM->ADOQljjhdb->Parameters->ParamByName("a3")->Value=ADOQcheckjl->FieldByName("型号规格")->NewValue;
DM->ADOQljjhdb->Parameters->ParamByName("a4")->Value=ADOQcheckjl->FieldByName("产品编号")->NewValue;
DM->ADOQljjhdb->Parameters->ParamByName("a5")->Value=ADOQcheckjl->FieldByName("单位")->NewValue;
DM->ADOQljjhdb->Parameters->ParamByName("a6")->Value=ADOQcheckjl->FieldByName("数量")->NewValue;
DM->ADOQljjhdb->ExecSQL();
}
else //零件和半成品的库存插入一样
{
sqlstr="insert into "+kcname+" (序号,名称,型号规格,单位,数量) values(:a1,:a2,:a3,:a4,:a5)";
DM->ADOQljjhdb->Close();
DM->ADOQljjhdb->SQL->Clear();
DM->ADOQljjhdb->SQL->Add(sqlstr);
DM->ADOQljjhdb->Parameters->ParamByName("a1")->Value=ADOQcheckjl->FieldByName("序号")->NewValue;
DM->ADOQljjhdb->Parameters->ParamByName("a2")->Value=ADOQcheckjl->FieldByName("名称")->NewValue;
DM->ADOQljjhdb->Parameters->ParamByName("a3")->Value=ADOQcheckjl->FieldByName("型号规格")->NewValue;
DM->ADOQljjhdb->Parameters->ParamByName("a4")->Value=ADOQcheckjl->FieldByName("单位")->NewValue;
DM->ADOQljjhdb->Parameters->ParamByName("a5")->Value=ADOQcheckjl->FieldByName("数量")->NewValue;
DM->ADOQljjhdb->ExecSQL();
}
}
Frljjl->Btxiugaill->Enabled=false;
ShowMessage("修改成功!");
}
}
}

}

void __fastcall TFrljjl::BtxiugaillClick(TObject *Sender)
{
DM->ADOQcheckjl->Post();
DBGridjl->ReadOnly=true;
}
这是父窗体的修改函数;
当继承的子窗体调用试就出错!
 
多个窗体引用一个公用的Query会出错,建议把Query放到父窗体中,只是共享连接
 
多人接受答案了。
 
后退
顶部