接前期《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一致)。
ClientDataSet运行中出现“ClientDataSet:dataset not in edit or insert mode”(一)