DataSet 的 DisableControls 与 DataSet的EnableControls 作用(转)
ClientDataSet 与 DataSet 的 DisableControls、EnableControls 用法类似。
对大量的数据做循环处理时,为了避免 DataSet 在游标不停地跑时,数据敏感控件随之不停刷新界面,导致代码运行速度下降,通常的做法是断开数据敏感控件和 DataSet 的连接。
正确的做法是执行 DataSet.DisableControls;在循环跑完后再执行 DataSet.EnableControls 恢复对界面上数据敏感控件的刷新支持。
例如:
with ClientDataSet1 do
begin
DisableControls;
First;
while not Eof do
begin
do something....
Next;
end;
EnableControls;
end;
上述代码没有问题。当然,记得加上 try... finally...end; 但是,如果是主从表。比如我们有一个 ClientDataSet2,设置主从关系:
ClientDataSet2.IndexFieldNames := 'ID';
ClientDataSet2.MasterFields := 'ID';
ClientDataSet2.MasterSource := DataSource1;
则,正常情况下,ClientDataSet1 的游标走动,会自动带动 ClientDataSet2 的数据集被主表 ClientDataSet1 的 ID 字段值过滤掉。
但是,如果对 ClientDataSet1 执行了 DisableControls 则 ClientDataSet2.MasterSource := DataSource1 无效了。这时候,ClientDataSet2 不会随着 ClientDataSet1 的游标走动而变化。
问题总结:
看起来,DisableControls 实际上就是导致 ClientDataSet1 和绑定它的 DataSource1 断开了连接!这样才导致 ClientDataSet2 无法作为从表跟随主表动作。
因此,DisableControls 方法使得界面上数据敏感控件不跟随 DataSet 的游标走动而改变显示,其本质是 DataSet 断开了指向它的 DataSource 的连接。
原文链接:https://blog.csdn.net/pcplayer/article/details/115768119
标签:ClientDataSet2,ClientDataSet1,控件,DisableControls,DataSet,EnableControls From: https://www.cnblogs.com/qiao-fu/p/17996921