По следам "полосатого DBGrid"Источник: delphikingdom Сергей Деев
Автор: Сергей Деев, Королевство DelphiВ повседневной практике программисту очень часто необходимо каким-либо способом обратить внимание пользователя на некоторые значения DataSet, высвечиваемые с помощью DBGrid. Сделать это можно, обрабатывая событие TDBGrid.OnDrawColumnCell в коде для каждого компонента TDBGrid проекта. Представленный материал - это попытка решить данную проблему в design time путем расширения возможностей стандартного TDBGrid. Проект составлен исключительно из учебных целей для публикации на сервере "Королевство Дельфи" и самостоятельной ценности не несет. Класс TDBGrid и его свойства Как уже отмечалось для "раскраски" какой-либо колонки или всей строки в целом программисту следует обработать событие TDBGrid.OnDrawColumnCell в коде для каждого компонента TDBGrid проекта. Теперь посмотрим на реализацию данного события в VCL. Из кода становится ясно, что все мы должны сделать - это перекрыть стандартную процедуру по перерисовке ячейки DrawColumnCell. Для хранения настроек, имен полей, условия закраски и других необходимых параметров, по "раскраске" создадим коллекцию этих настроек Создание наследника класса TDBGrid С помощью мастера создания компонентов создадим наследника TDBGrid и назовем его, например, TDBStripedGrid. В результате работы мастера получим следующий код
Теперь займемся коллекцией для хранения настроек по "раскраске". Класс-коллекция TStripedCollection и ее элементы TStripedItem Прежде разберем, что нам необходимо сделать.
И все это необходимо сделать независимо друг от друга. Кроме того, необходимо, чтобы все эти свойства можно было менять в design time. Наиболее подходящим инструментов для хранения настроек являются свойства-коллекции. Создадим "родительский" класс - коллекцию TStripedCollection на основе класса TOwnedCollection и ее "родительские" элементы TStripedItem на основе класса TCollectionItem. А затем, для реализации тех или иных свойств - наследников от "родителей". Как видим из выше описанного, нам понадобятся 12 свойств-коллекций и 12 элементов-коллекций. Создавая классы-"родители" будем иметь в виду, что почти все свойства можно помещать в protected, а в наследуемых коллекциях их следует перенести в в public и published для того, чтобы эти свойства были доступны в design time. Очевидно, что для коллекции TStripedCollection нам понадобятся следующие свойства: свойство - элемент коллекции property Items[Index: Integer]: TStripedItem read GetStripedItem write SetStripedItem; default; ссылка на владельца (Owner) коллекции property Grid: TDBStripedGrid read FGrid; А для элементов коллекции TstripedItem: свойства типа оператора сравнения property Compare: TStripedCompare read FCompare write SetCompare; property LeftCompare: TStripedCompare read FLeftCompare write SetLeftCompare; property RightCompare: TStripedCompare read FRightCompare write SetRightCompare; свойство показа property Showing: Boolean read FShowing write SetShowing default False; свойства - поля DataSource.DataSet property Field: TField read GetField write SetField; property FirstField: TField read GetFirstField write SetFirstField; property SecondField: TField read GetSecondField write SetSecondField; property LeftField: TField read GetLeftField write SetLeftField; property RightField: TField read GetRightField write SetRightField; свойства - наименования полей DataSource.DataSet property LeftFieldName: String read FLeftFieldName write SetLeftFieldName; property RightFieldName: String read FRightFieldName write SetRightFieldName; property FirstFieldName: String read FFirstFieldName write SetFirstFieldName; property SecondFieldName: String read FSecondFieldName write SetSecondFieldName; property FieldName: String read FFieldName write SetFieldName; свойства - значения полей DataSource.DataSet для сравнения property FieldValue: Variant read FFieldValue write SetFieldValue; property LeftFieldValue: Variant read FLeftFieldValue write SetLeftFieldValue; property RightFieldValue: Variant read FRightFieldValue write SetRightFieldValue; свойства - изменяемые значения property ReplaceValue: Variant read FReplaceValue write SetReplaceValue; property StrIsTrue: String read FStrIsTrue write SetStrIsTrue; property StrIsFalse: String read FStrIsFalse write SetStrIsFalse; property Font: TFont read FFont write SetFont; property Color: TColor read FColor write SetColor; А для удобства работы перечислимый тип операторов сравнения: … type … TStripedCompare = (ccEqual, ccMoreEqual, ccMore, ccLessEgual, ccLess, ccUnEqual); Итак, ссылки на наши классы будут выглядеть следующим образом:
Более подробно код представлен в прилагающемся файле. Создание свойств коллекций в TDBStripedGrid В наш наследник TDBStripedGrid добавим published свойства-коллекции для хранения настроек. Имеем:
Для автоматического создания коллекций в design time следует переопределить стандартные конструктор Create constructor Create(AOwner: TComponent); override; и деструктор Destroy класса destructor Destroy; override; с добавлением служебных функций типа: function CreateStripedRowsFont: TStripedRowsFontCollection; Добавим обработку сролирования колесиком мышки: procedure WMWheel(var Msg: TWMMouseWheel); message WM_MOUSEWHEEL; процедуру MouseToCell, как у TDrawGrid procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint); пару public свойств: property ActiveRecord: Integer read GetActiveRecord; property RecNo: Integer read GetRecNo; Для сохранения коллекций-свойств переопределим стандартную процедуру: procedure DefineProperties(Filer: TFiler); override; с добавлением процедур по записи и чтению свойств-коллекций типа: procedure ReadStripedRowsFont(Reader: TReader); procedure WriteStripedRowsFont(Writer: TWriter); И, наконец, переопределим стандартную процедуру DrawColumnCell в которой и будем проводить все изменения: procedure DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); override; Более подробно код представлен в прилагающемся файле. Регистрация компонента TDBStripedGrid, классов элементов коллекций и коллекций, редакторов свойств. Для удобства создадим новый Unit и назовем его DBStripedGridReg. Перенесем туда процедуру регистрации: procedure Register; Добавим туда регистрацию классов элементов коллекций и коллекций и редактор свойств имен полей на основе редактора свойств TStringProperty, переопределив некоторые процедуры и функции. Более подробно код представлен в прилагающемся файле. Заключение Полностью файл проекта можно посмотреть в приложенном файле. Как отмечалось выше, данная статья написана больше в учебных целях. При написании статьи использовались следующие материалы: |