![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как инициализировать динамически поля 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 с нужном месте...