Слідами "смугастого DBGrid"

Автор: Сергій Дєєв, Королівство Delphi


У повсякденній практиці програмісту дуже часто необхідно яким-небудь чином звернути увагу користувача на деякі значення DataSet, що висвітлюються за допомогою DBGrid. Зробити це можна, обробляючи подія TDBGrid.OnDrawColumnCell в коді для кожного компонента TDBGrid проекту.


Представлений матеріал – це спроба вирішити дану проблему в design time шляхом розширення можливостей стандартного TDBGrid.


Проект складений виключно з навчальних цілей для публікації на сервері "Королівство Дельфі" та самостійної цінності не несе.


Клас TDBGrid і його властивості


Як вже наголошувалося на "розмальовки" будь-якої колонки або всього рядка в цілому програмісту слід обробити подія TDBGrid.OnDrawColumnCell в коді для кожного компонента TDBGrid проекту.


Тепер подивимося на реалізацію даної події в VCL. З коду стає ясно, що всі ми повинні зробити – це перекрити стандартну процедуру по перемальовуванні осередки DrawColumnCell.


Для зберігання налаштувань, імен полів, умови зафарбовування та інших необхідних параметрів, за "розмальовки" створимо колекцію цих налаштувань


 

Створення спадкоємця класу TDBGrid


За допомогою майстра створення компонентів створимо спадкоємця TDBGrid і назвемо його, наприклад, TDBStripedGrid.


У результаті роботи майстра отримаємо наступний код









unit DBStripedGrid;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db;

type
TDBStripedGrid = class(TDBGrid)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation

procedure Register;
begin
RegisterComponents(“Samples”, [TDBStripedGrid]);
end;
end.


Тепер займемося колекцією для зберігання налаштувань по "розмальовки".

Клас-колекція TStripedCollection та її елементи TStripedItem


Перш розберемо, що нам необхідно зробити.


  1. Необхідно змінити шрифт будь-якої колонки в залежності від значення поля в цій колонці.
  2. Необхідно змінити шрифт для всього рядка в залежності від значення поля в будь-якій колонці.
  3. Необхідно змінити колір фону будь-якої колонки в залежності від значення поля в цій колонці.
  4. Необхідно змінити колір фону всього рядка в залежності від значення поля в будь-якій колонці.
  5. Необхідно змінити шрифт будь-якої колонці в залежності від значень двох інших полів.
  6. Необхідно змінити колір фону будь-якої колонці в залежності від значень двох інших полів.
  7. Необхідно змінити шрифт всього рядка в залежності від значень двох інших полів.
  8. Необхідно поміняти колір всього рядка колонці в залежності від значень двох інших полів.
  9. Необхідно змінити шрифт будь-яких 2-х колонок одночасно в залежності від значення третього поля.
  10. Необхідно змінити колір фону будь-яких 2-х колонок одночасно в залежності від значення третього поля.
  11. Необхідно підмінити текст якої-небудь колонки в залежності від значення поля цієї колонки. Як приклад можна розглянути поле типу TBooleanField при значенні поля True необхідно написати "Так", а при значенні поля False – "Ні".
  12. Необхідно підмінити текст якої-небудь колонки на інше значення в залежності від значення поля в цій колонці.

І все це необхідно зробити, незалежно один від одного. Крім того, необхідно, щоб всі ці властивості можна було міняти в 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);


Отже, посилання на наші класи будуть виглядати наступним чином:









type

/ / Посилання на "батьківські" класи
TStripedItem = class;

TStripedCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Шрифту у всієї рядка
TStripedRowsFontItem = class;

TStripedRowsFontCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Шрифту у клітинки
TStripedRowFontItem = class;
TStripedRowFontCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Кольору фону у всієї рядка
TStripedRowsBrushColorItem = class;
TStripedRowsBrushColorCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Кольору фону у клітинки
TStripedRowBrushColorItem = class;
TStripedRowBrushColorCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Шрифту у всієї рядка по лівій і правій межі
TStripedLeftRightRowsFontItem = class;
TStripedLeftRightRowsFontCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Шрифту у клітинки по лівій і правій межі
TStripedLeftRightRowFontItem = class;
TStripedLeftRightRowFontCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Кольору фону у всієї рядка по лівій і правій межі
TStripedLeftRightRowsBrushColorItem = class;
TStripedLeftRightRowsBrushColorCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Кольору фону у клітинки по лівій і правій межі
TStripedLeftRightRowBrushColorItem = class;
TStripedLeftRightRowBrushColorCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Тексту в осередку
TStripedBooleanItem = class;
TStripedBooleanCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Тексту в осередку
TStripedReplaceItem = class;
TStripedReplaceCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Шрифту у осередків
TStripedMasterFontItem = class;
TStripedMasterFontCollection = class;

/ / Посилання на колекцію та її елементи зі зміни
/ / Кольору фону у осередків
TStripedMasterBrushColorItem = class;
TStripedMasterBrushColorCollection = class;
TDBStripedGrid = class;

/ / Перераховувані тип операторів порівняння
TStripedCompare = (ccEqual, ccMoreEqual, ccMore, ccLessEgual,
ccLess, ccUnEqual);


Більш докладно код представлений в додається файлі.

Створення властивостей колекцій у TDBStripedGrid


У наш спадкоємець TDBStripedGrid додамо published властивості-колекції для зберігання налаштувань. Маємо:









type

TDBStripedGrid = class(TDBGrid)

published
/ / Св-во колекція зі зміни шрифту у всієї рядка
property StripedRowsFont: TStripedRowsFontCollection read FStripedRowsFont
write SetStripedRowsFont;
/ / Св-во колекція зі зміни шрифту у клітинки
property StripedRowFont: TStripedRowFontCollection read FStripedRowFont
write SetStripedRowFont;
/ / Св-во колекція по зміні кольору фону у всієї рядка
property StripedRowsBrushColor: TStripedRowsBrushColorCollection
read FStripedRowsBrushColor write SetStripedRowsBrushColor;
/ / Св-во колекція по зміні кольору тла в осередку
property StripedRowBrushColor: TStripedRowBrushColorCollection
read FStripedRowBrushColor write SetStripedRowBrushColor;
/ / Св-во колекція зі зміни шрифту у всієї рядка по лівій і правій межі
property StripedLeftRightRowsFont: TStripedLeftRightRowsFontCollection
read FStripedLeftRightRowsFont write SetStripedLeftRightRowsFont;
/ / Св-во колекція зі зміни шрифту у клітинки по лівій і правій межі
property StripedLeftRightRowFont: TStripedLeftRightRowFontCollection
read FStripedLeftRightRowFont write SetStripedLeftRightRowFont;
/ / Св-во колекція по зміні кольору фону у всієї рядка по лівій і правій межі
property StripedLeftRightRowsBrushColor: TStripedLeftRightRowsBrushColorCollection
read FStripedLeftRightRowsBrushColor write SetStripedLeftRightRowsBrushColor;
/ / Св-во колекція по зміні кольору тла в осередку по лівій і правій межі
property StripedLeftRightRowBrushColor: TStripedLeftRightRowBrushColorCollection
read FStripedLeftRightRowBrushColor write SetStripedLeftRightRowBrushColor;
/ / Св-во колекція зі зміни тексту у клітинки
property StripedBoolean: TStripedBooleanCollection read FStripedBoolean
write SetStripedBoolean;
/ / Св-во колекція зі зміни тексту у клітинки
property StripedReplace: TStripedReplaceCollection read FStripedReplace
write SetStripedReplace;
/ / Св-во колекція зі зміни шрифту у осередків
property StripedMasterFont: TStripedMasterFontCollection
read FStripedMasterFont write SetStripedMasterFont;
/ / Св-во колекція по зміні кольору фону у осередків
property StripedMasterBrushColor: TStripedMasterBrushColorCollection
read FStripedMasterBrushColor write SetStripedMasterBrushColor;
end;


Для автоматичного створення колекцій у 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, Перевизначивши деякі процедури і функції.


Більш докладно код представлений в додається файлі.

Висновок


Повністю файл проекту можна подивитися у файлі. Як зазначалося вище, дана стаття написана більше в навчальних цілях.


При написанні статті використано матеріали:


  1. Різнобарвний DBGRID
  2. Grid із людським обличчям
  3. Незвичайний TDBGrid

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*