2015-11-16 2 views
0

У меня есть TClientDataSet, который содержит информацию и не связан с любым компонентом GUI.Delphi, ClientDataSet и потоки

В потоке я размещаю соответствующую запись, перехожу в режим редактирования и изменяю значения. Поскольку это происходит внутри потока, я использую TCriticalSection перед поиском до публикации. Это выглядит примерно так:

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.

Любая идея? Что мне не хватает?

+0

У нас недостаточно информации. Попробуйте сделать [MCVE] (http://stackoverflow.com/help/mcve). Например, вы касаетесь компонента cds4Process из основного потока графического интерфейса? – whosrdaddy

+4

Вы не оставили критический раздел, если не можете найти запись. Или это просто поддельный код? –

+0

@whosrdaddy, я не трогаю его нигде, кроме этой темы. – Amos

ответ

1

Я бы поместил все объекты, связанные с TClientDataSet (его компонент соединения, постоянные поля и т. Д.) В TDataModule вместо этого в основной форме, а затем создайте экземпляр этого модуля данных в потоке.

Использование этого связанного с потоком TDataModule в качестве контейнера для компонентов доступа к данным позволит визуальный дизайн и предотвратить случайное использование основного потока VCL.