Слідами “смугастого 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. Різнобарвний D B G R I D
  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>

*

*