• ClientDataSet运行中出现“ClientDataSet:dataset not in edit or insert mode”(二)


        接前期《ClientDataSet运行中出现“ClientDataSet:dataset not in edit or insert mode”(一)》中,提出的解决方案,本人作进一步探索:

         一、编写一个返回ClientDataSet的状态函数

    1. function Get_Client_state( ClientDataSet1:TClientDataSet):string; // 获取ClientDataSet state
    2. var S:string;
    3. begin
    4. result:='';
    5. case ClientDataSet1.State of
    6. dsInactive: S:='dsInactive';
    7. dsBrowse: S:='dsBrowse';
    8. dsEdit: S:='dsEdit';
    9. dsInsert: S:='dsInsert';
    10. dsSetKey: S:='dsSetKey';
    11. dsCalcFields: S:='dsCalcFields';
    12. dsFilter: S:='dsFilter';
    13. dsNewValue: S:='dsNewValue';
    14. dsOldValue: S:='dsOldValue';
    15. dsCurValue: S:='dsCurValue';
    16. dsBlockRead: S:='dsBlockRead';
    17. dsInternalCalc: S:='dsInternalCalc';
    18. dsOpening: S:='dsOpening';
    19. else S:='No';
    20. end;
    21. result:=S;
    22. end;

        二、作出下列搜索

    1. with ClientDataSet1 do
    2. begin
    3. ShowMessage(Get_Client_state(ClientDataSet1)); // 获取ClientDataSet state
    4. ClientDataSet1.Append;
    5. ShowMessage(Get_Client_state(ClientDataSet1)); // 获取ClientDataSet state
    6. ClientDataSet1.Append;
    7. ShowMessage(Get_Client_state(ClientDataSet1)); // 获取ClientDataSet state
    8. 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”(一)

  • 相关阅读:
    硬核分享:硬件工程师常用工具包
    沪漂十余年我拿到了上海户口
    设计模式之策略模式
    opencv图形绘制2
    jxTMS设计思想之功能点
    【React源码】(十)fiber 树构造(对比更新)
    概统 | 一图总结特殊积分之伽马函数
    1.创建Django项目
    ESP32设备通信-LoRa通信
    初识MySQL数据库
  • 原文地址:https://blog.csdn.net/lyhoo163/article/details/132877742