一、问题表现
Delphi 三层DataSnap,使用AlphaControls控件优化界面,一窗口编辑时,出现下列错误提示:
编译通过,该窗口中,重新显示数据,下图:
相关代码:
procedure TShowOld_1_Frm.Button7Click(Sender: TObject);
var SQL,ID:string;
k,L:integer;
begin
GroupBox4.Caption:=Button7.Caption;
DateTimetoString(ID,'yyyy-MM-dd',now-100);
SQL:='select * from 老人基本信息 where (分支='+#39+sFCID+#39+') ';
SQL:=SQL+'and (入院日期>='+#39+ID+#39+') order by 入院日期';
DataModule1.ClientDataSet1.Active:=False;
DataModule1.ClientDataSet1.DataRequest(SQL);
DataModule1.ClientDataSet1.Active:=True;
ClientDataSet1.Data:=DataModule1.ClientDataSet1.Data;
DataModule1.ClientDataSet1.Active:=False;
L:=ClientDataSet1.RecordCount;
SetSource(DataSource1);
DBGridEh1.Columns[0].Title.Alignment := taCenter;
DBGridEh1.Columns[0].Alignment:=taCenter;
DBGridEh1.Columns[1].Title.Alignment := taCenter;
DBGridEh1.Columns[1].Alignment:=taCenter;
DBGridEh1.Columns[0].Width:=36;
DBGridEh1.Columns[1].Width:=80;
// sStatusbar1.Panels.Items[0].text:=' 数据库: '+IntToStr(L)+' 人信息';
end;
问题是,首次都能正常显示(OnShow中执行代码),再次执行代码时,出现下列提示:
二、搜索思路
1、由提示“ ClientDataSet无法在关闭的数据集上执行此操作”,ClientDataSet上作文章。打开数据集时,每次打开换个ClientDataSet,是可以解决问题,但是,这太复杂了,也违背编程的原则。放弃此办法。
2、在引起DBCombobox,有OnChange的控件,找原因。方法见我的别一文章:《AlphaControls控件TsDBCombobox出错:访问违规》。
3、逐个控件,进行查找,方法是屏蔽全部控件,逐个开放,检查是否出现错误。找到在 TsDBEdit控件时,使用OnChange,生成其它字段的数据,引起ClientDataSet不能进入Open状态。
三、解决问题
只能放弃使用OnChange事件。
原因中使用控件AlphaControls,界面很好,但是重画窗口界面,比较复杂,要求不使用或少使用OnChange事件,引起不必要的麻烦。
只能改变思路,加一按键实现“OnChange,生成其它字段的数据”。