Delphi, ClientDataSet and threads



我有一个TClientDataSet,它保存信息,并且没有链接到任何GUI组件。

在线程中,我找到相关记录,进入编辑模式并更改值。因为它发生在线程中,所以在定位之前直到发布之后,我都使用TCcriticalSection。它看起来像这样:

cs.Enter;
if not cds4Process.Locate('locator',locator,[]) then exit;
cds4Process.Edit;
cds4Process.FieldByName('field1').AsDateTime := pDay;
cds4Process.FieldByName('field2').AsFloat := amnt;
cds4Process.Post;
cs.leave;

cds4Process位于主窗体上,它没有链接到任何GUI组件,我不会将它作为参数传递给线程。

我执行这个线程好几次,在某个时刻,我得到一个错误,说cds4Process没有处于插入或编辑模式。尽管上面的代码序列在我使用cds4Process的所有地方都是相同的。

知道吗?我错过了什么?

我会将与TClientDataSet(其连接组件、持久字段等)相关的所有内容放在TDataModule上,而不是放在主窗体上,然后在线程中创建该数据模块的实例。

使用这个线程绑定的TDataModule作为数据访问组件的容器将允许进行可视化设计,并防止我意外地使用VCL主线程。

最新更新