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

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

Массив элементов-объектов в качестве свойства компонента [D5]


Rav ©   (2005-11-19 19:49:00) 

Требуется создать компонент, с помощью котрого можно было бы создавать произвольные фильтры для TDataSet и 'where'-строки для запросов.
Для определения полей, по которым можно выполнять сортировку я вначале применил следующую схему:

элемент фильтра (поле) - TFilterItem = class(TCollectionItem)
набор элементов - TFilterItems = class(TCollection)
фильтр -TFilter = class(TComponent)

все бы ничего, но TFilterItem должны быть разных типов (по целому числу, дате, связанным dataset и пр.). TFilterItem вначале был "универсальным", т.е. имел данные для любого типа фильтра. Проблема возникла с "редакторами" TFilterItem - получается что каждый из элементов должен "нести на себе" несколько редактров для каждого из типов.

Идея такова - хранить в коллекции элементы разных типов, унаследованных от TFilterItem. (по типу TFilter в TDataSet). Но как добавлять в коллекцию элементы разных типов? Полдня проковырялся в исходниках VCL - ясности пока мало :(
Там вообще использована другая схема:

элемент - TField = class(TComponent)
набор элементов - TFilters = class(TObject)
(TField хранятся в TList)
набор данных -TDataSet = class(TComponent)

Какую схему лучше применить в данном случае? Какие объекты лучше выбрать в качестве базовых? И как проще организовать добавление разноровдных (но унаследованных от общего предка) элементов? Может где почитать что есть по этому поводу?

Заранее спасибо.


Юрий Зотов   (2005-11-20 13:27:00) [1]

> Rav   (20.11.05 10:33) [3]

> как добавить элеиенты в design-time

Так же, как добавляются поля в DataSet - написать редактор компонента-контейнера.


Rav   (2005-11-20 10:33:00) [2]


> Сделай массив указателей

Не пойдет... Item сам должен уметь обрабатывать свои данные, т.е. должен быть объектом! ... Если только prValue будет указателем на объект...
Но для меня и главна сложность в том, как добавить элеиенты в design-time (В run-time мне их практически не нужно создавать)


Юрий Зотов   (2005-11-20 10:32:00) [3]

Зачем вводить поле prType, если тип уже и без того определяется классом объекта? Лишнее оно, это поле, а без него получается запись, состоящая из единственного поля - такая запись тоже не нужна.

Я бы сделал по образцу TFields.


Separator   (2005-11-20 08:10:00) [4]

Сделай массив указателей

type
   TPointerRec = record
       prType: set of(prInt, prDate);
       prValue: Pointer
   end;
   TPointerArray = array ofTPointerRec;


Наверх

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