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