Обещанный пост о многострочных заголовках с группированием в стандартном TDbGrid.
История поста
Меня давно интересовало, как использовать свойство Expanded у TColumn. Свойство это объявлено как read-only. В справке о нём написано:
Expanded относится только к тем колонкам, которые представляют поля, являющиеся наследниками TObjectField. Когда колонка раскрыта(expanded), она выводится для каждого дочернего поля объектного поля. У каждой колонки, представляющей дочернее поле, есть свой заголовок, который выводится под заголовком колонки родительского поля. Когда свойство Expanded равно false, значения дочерних полей выводятся в строку, через запятую, и не могут быть отредактированы.
Но, работая только с Firebird, мне не приходилось сталкиваться с объектными полями.
Многострочный группируемый заголовок в TDbGrid
С объектными полями я столкнулся случайно, когда выполнял изучал как Delphi работает с объектными типами СУБД Oracle через dbExpress.
Вручную включить многострочные группируемые заголовки в DbGrid-е нельзя. Грид сам решает как отображать колонку. Тип отображения колонки задаётся типом поля в Dataset. Более того, методы отвечающие за вывод групповых колонок в TCustomDbGrid объявлены неперезагружаемыми. Поэтому единственный способ воспользоваться этой фичей – это сделать так, чтобы Dataset возвращал поля объектных типов. Можно конечно и написать свою реализацию DbGrid.
Наследники TObjectField
Помимо распространённых TStringField, TDateTimeField, TintegerField в Delphi присутствуют типы полей:
- TObjectField – базовый класс для реализации объектных полей
- TAdtField – поле объектного типа. Конкретная реализация. TField.DataType = ftADT
- TArrayField – поле типа массив. TField.DataType = ftArray
- TDatasetField – поле с вложенным Dataset-ом. TField.DataType = ftDataSet
Пример
Чтобы DbGrid начал показывать такие заголовки, всего-то и нужно – подключить его к набору данных(Dataset) с объектными полями(наследниками TAdtField). Я сделал небольшой пример, демонстрирующий работу TAdtField-полей в TClientDataSet.
Пример можно скачать по ссылке:
http://lazyproject.googlecode.com/files/ExpandedTitleDbGrid.zip
В архиве исходники для Delphi 7 и скомпилированный exe-файл. Исходники без проблем собираются и в Delphi 2009.
Версия для мобильного


7 человек заметили этот пост: