接前期《ClientDataSet运行中出现“ClientDataSet:dataset not in edit or insert mode”(一)》中,提出的解决方案,本人作进一步探索:
一、编写一个返回ClientDataSet的状态函数
- function Get_Client_state( ClientDataSet1:TClientDataSet):string; // 获取ClientDataSet state
- var S:string;
- begin
- result:='';
- case ClientDataSet1.State of
- dsInactive: S:='dsInactive';
- dsBrowse: S:='dsBrowse';
- dsEdit: S:='dsEdit';
- dsInsert: S:='dsInsert';
- dsSetKey: S:='dsSetKey';
- dsCalcFields: S:='dsCalcFields';
- dsFilter: S:='dsFilter';
- dsNewValue: S:='dsNewValue';
- dsOldValue: S:='dsOldValue';
- dsCurValue: S:='dsCurValue';
- dsBlockRead: S:='dsBlockRead';
- dsInternalCalc: S:='dsInternalCalc';
- dsOpening: S:='dsOpening';
- else S:='No';
- end;
- result:=S;
- end;
二、作出下列搜索
- with ClientDataSet1 do
- begin
- ShowMessage(Get_Client_state(ClientDataSet1)); // 获取ClientDataSet state
- ClientDataSet1.Append;
- ShowMessage(Get_Client_state(ClientDataSet1)); // 获取ClientDataSet state
- ClientDataSet1.Append;
- ShowMessage(Get_Client_state(ClientDataSet1)); // 获取ClientDataSet state
- end;
执行代码,反应如下:
with ClientDataSet1 do
begin
ShowMessage(Get_Client_state(ClientDataSet1)); // 显示 dsBrowse
ClientDataSet1.Append;
ShowMessage(Get_Client_state(ClientDataSet1)); // 显示 dsBrowse(此时,应该dsInsert)
ClientDataSet1.Append;
ShowMessage(Get_Client_state(ClientDataSet1)); // 显示 dsInsert
end;
如果在第一次执行
ClientDataSet1.Append;
加入
ClientDataSet1.Edit;
经测试,问题解决。只加一句代码,简化解决的办法。
三、问题分析
执行Append后,编译器末能将ClientDataSet的state值,变更为dsInsert。 通过强制执行Edit,让ClientDataSet的state值,变更为dsEdit(效果与dsInsert一致)。
分析原因,一是字段过多,近200个字段,同时几十字段与DBComboboox关联,特别是OnCheng事件的运用,造成末能及时进行Insert或Edit状态。还有,在DBGridEh控件中,使用OnChick事件,达到某些字段的动态变化,也会加大该类错误的出现。这个问题,仅一个窗口中出现,其它窗口都正常。可能就是这此原因了。
所以,要在代码中简化对ClientDataSet的动态跟进。不然,还不知出现何种错误。
ClientDataSet运行中出现“ClientDataSet:dataset not in edit or insert mode”(一)