Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.10.12;
Скачать: CL | DM;

Вниз

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

 
MiAn   (2011-03-14 21:28) [0]

Есть проблема. До текущего времени пользовались датасетами от баз данных (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, чтобы галочки в гриде рисовать) и куда вот вклиниться для получения нужного,


 
sniknik ©   (2011-03-14 22:37) [1]

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

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


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


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



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



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


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


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

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

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


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


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

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


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

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


 
sniknik ©   (2011-03-15 16:02) [5]

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

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


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


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

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

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

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

.Close;
.AddField
.Open


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


 
Polevi ©   (2011-03-23 07:29) [7]

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


 
Loginov Dmitry ©   (2011-03-25 17:52) [8]


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


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


 
sniknik ©   (2011-03-25 18:56) [9]

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


 
Johnmen ©   (2011-03-27 01:36) [10]


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

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



Страницы: 1 вся ветка

Текущий архив: 2014.10.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.007 c
15-1393789594
[ВладОшин]
2014-03-02 23:46
2014.10.12
Плагин. Как это работает?


3-1300127315
MiAn
2011-03-14 21:28
2014.10.12
Как инициализировать динамически поля TClientDataSet


2-1382887071
Vatolin
2013-10-27 19:17
2014.10.12
Установка компоненты


15-1394095025
Demo
2014-03-06 12:37
2014.10.12
Категории в должности


15-1393593127
ТимоховДА
2014-02-28 17:12
2014.10.12
If (YouLoveVCL = true) then TReadThisNow.Create();