Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как инициализировать динамически поля TClientDataSet


MiAn ©   (2011-03-14 21:28:00) 

Есть проблема. До текущего времени пользовались датасетами от баз данных (TIBQuery и подобное). Когда он выполняет Open, то в методе BeforeOpen можно динамически создавать доп. поля (допустим, служебные для журнала при использовании DBGrid'а). В виде:

procedure TForm1.DataSet1BeforeOpen(DataSet: TDataSet);
begin
   with DataSet.FieldDefs.AddFieldDef do
   begin
     DataType := ftBoolean;
     Name     := 'SomeName';
   end;
   DataSet.FieldDefs.Items[DataSet.FieldDefs.Count-1].CreateField(DataSet);
end;


Но с TClientDataSet так сделать не получается.

TClientDataSet нельзя делать .Open, надо делать CreateDataSet, в котором он и создает все поля. А только в конце метода CreateDataSet он сам вызывает Open.

Если использовать вышеприведенный код, то он отрабатывает, но не делает что нужно. Таким образом созданные поля не видны в DataSet, FindField('SomeName') = nil.

Так и не смогли разобраться почему это происходит... И самый главный вопрос - как это обойти?

Схема работы такая - у нас на форме лежит TClientDataSet, мы отдаем ссылку на него некоему самописному внешнему провайдеру, он открывает его и заполняет данные. А нам надо еще доп. поля создать свои (например, типа boolean, чтобы галочки в гриде рисовать) и куда вот вклиниться для получения нужного,


Johnmen   (2011-03-27 01:36:00) [1]


> На событии AfterOpen сделали код аля:
>

Ох уж эти аляльщики...
.AddField
.CreateDataSet
.Open


sniknik   (2011-03-25 18:56:00) [2]

> А в SQL почему бы это не сделать?
какая разница? это же у них было раньше, сейчас -
> Но с TClientDataSetтак сделать не получается.
притом с CreateDataSet.


Loginov Dmitry   (2011-03-25 17:52:00) [3]


> (TIBQuery и подобное). Когда он выполняет Open, то в методе
> BeforeOpen можно динамически создавать доп. поля


А в SQL почему бы это не сделать?


Polevi   (2011-03-23 07:29:00) [4]

писатели....


MiAn   (2011-03-15 17:16:00) [5]


> нет не понимаю, и практически этим не пониманием постоянно
> пользуюсь прописывая поля датасетам в десигн тайме и после
> их спокойно открывая любыми таинственными провайдерами.

да... пожалуй, вы абсолютно правы. Провайдер действует некрасиво, но он так делает... А дело в том, что переписать его поведение - есть некоторые проблемы, хотелось решить это "со стороны датасета".

Ну и соответственно по этой же причине метод в TClientDataSet внедрить сложно.

В принципе, проблема решена. На событии AfterOpen сделали код аля:

.Close;
.AddField
.Open


вроде работает...


sniknik   (2011-03-15 16:02:00) [6]

> как вы понимаете, стандартная задача провайдера
нет не понимаю, и практически этим не пониманием постоянно пользуюсь прописывая поля датасетам в десигн тайме и после их спокойно открывая любыми таинственными провайдерами.

> Но кто ее будет вызывать?
> некоему самописномувнешнему провайдеру,
?


MiAn   (2011-03-15 14:57:00) [7]


> это ничего не объясняет... будет такая - отдаете ссылку
> на него, с полностью сформированным FieldDefs, он открывает
> его и заполняет данные

как вы понимаете, стандартная задача провайдера - САМОЛИЧНО создать поля, чтобы их потом заполнить, ибо только он знает какие колонки будут в датасете. Логично, что большинство провайдеров перед этим очищают филд дефс...


> и что? свою процедуру классу не добавить из-за этого?

процедуру добавить можно. Но кто ее будет вызывать?


sniknik   (2011-03-15 14:00:00) [8]

> Схема работы такая - у нас на форме лежит TClientDataSet,
это ничего не объясняет... будет такая - отдаете ссылку на него, с полностью сформированным FieldDefs, он открывает его и заполняет данные...
???
где проблема?

> CreateDataSet является статической процедурой в TClientDataSet
и что? свою процедуру классу не добавить из-за этого?


MiAn   (2011-03-15 13:37:00) [9]


> что мешает вместо DataSet1BeforeOpen сделать процедуру например
> MyBeforeOpen и вызывать ее до CreateDataSet?



> Схема работы такая - у нас на форме лежит TClientDataSet,
>  мы отдаем ссылку на него некоему самописному внешнему провайдеру,
>  он открывает его и заполняет данные



> если уж на то пошло, можно и наследника TClientDataSet-а
> написать с перекрытием метода


CreateDataSet является статической процедурой в TClientDataSet


sniknik   (2011-03-14 22:37:00) [10]

что мешает вместо DataSet1BeforeOpen сделать процедуру например MyBeforeOpen и вызывать ее до CreateDataSet?

если уж на то пошло, можно и наследника TClientDataSet-а написать с перекрытием метода, и вызовом своего BeforeOpen с нужном месте...


Наверх

Титульная страница Поиск, карта сайта Написать письмо