Використання кольорів в компоненті DBGrid
В даній лекції буде представлятися матеріал, котрий буде реалізовувати деякі можливості щодо використання кольорів в компоненті DBGrid. В лекції будуть розглянуті такі питання:
- Загальні питання (Навіщо воно потрібно)
- Розфарбування рядків.
- Зміна параметрів шрифтів.
- Розміщення картинки у полі сітки.
- Створення полосатих вікон.
Створення «розмальованого» DBGrid, що питання виділення кольором клітинок чи їх значень досить суттєво допомагае орієнтуватися користувачу. Тобто якщо нереальні значення розфарбувати в червоний, а на вікні зробити сітку – користувач одразу зверне увагу і замислиться як це виправити.
Для того, щоб змінити стандартні стилі сітки DBGrid нам потрібно почати «промальовувати» її вручну, тобто скористатися обробником DBGrid1DrawColumnCell який має параметри (Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
- Sender: TObject; - хто викликає метод (наприклад, якщо на формі є 2 сітки і обидві мають одинакову кольорову схему то ТDBGrid(Sender) буде посилатися на ту сітку яка в данний момент часу використовує функцію).
- const Rect: TRect; - прямокутник який саме в даний момент перемальовується.
- DataCol: Integer; - індеск клітинки в стовпці.
- Column: TColumn; - стовпець який перемальовується.
- State: TgridDrawState; - статус клітинки (активна, неактивна, змінюється…).
Далі схему перемальовки клітинок можна подати таким схематичним шматком коду:
procedure Tform1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
Begin
// Корректуємо кольорову схему
IF { якась умова }Then Begin
TDBGrid(Sender).Canvas.Brush.Color:=clGreen;
TDBGrid(Sender).Canvas.Font.Color:=clWhite;
End;
// Якщо клітинка є виділеною тоді
IF gdSelected IN State
Then Begin
TDBGrid(Sender).Canvas.Brush.Color:= clHighLight;
TDBGrid(Sender).Canvas.Font.Color := clHighLightText;
End;
// Викликаємо стандартну функцію класу перемальовки
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
End;
// Корректуємо кольорову схему
Замінюємо стандартні параметри кольрору і шрифтів цей болок складається з деяких підблоків, які будуть майже ідентичними тобто будуть іти умови порівняння і вибірки які іменно клітинки розфарбовувати.
IF { якась умова }
Саме те місце де потрібно вказати параметри вибору клітинок. Наприклад клітинки з текстом «Брак»
// Викликаємо стандартну функцію класу перемальовки
Для того, щоб нам зберегти форматування самої таблиці, ми скористуємось внутрішньою функцією заповнення клітинки, яле параметри вона «підхопить» які ми вказали.
Так, яки ми працюємо з стандартним компонентом Canvas, то він підтримує всі стандартні маніпуляції із шриштами, а саме:
TDBGrid(Sender).Canvas.Brush.Color:=(clBlack, clMaroon, clGreen, clOlive, clNavy, clPurple, clTeal, clGray, clSilver, clRed, clLime, clYellow, clBlue, clFuchsia, clAqua, clLtGray, clDkGray, clWhite);
Задає значення кольору заливки фону. Може бути у форматі $RRGGBB
TDBGrid(Sender).Canvas.Font.Color:=(clBlack, clMaroon, clGreen, clOlive, clNavy, clPurple, clTeal, clGray, clSilver, clRed, clLime, clYellow, clBlue, clFuchsia, clAqua, clLtGray, clDkGray, clWhite);
Задає значення кольору шрифта. Може бути у форматі $RRGGBB
TDBGrid(Sender).Canvas.Font.Style:=[fsBold, fsItalic, fsUnderline, fsStrikeOut];
Стиль написання літер. Змінна множинна тому якщо ми бажиемо бачити підкреслений курсив нам потрібно присвоїти опції ак набір мараметрів, тобто в даному прикладі .Font.Style:=[fsItalic, fsUnderline].
TDBGrid(Sender).Canvas.Font.Name:=«назва шрифту».
Змінює системний шрифт по замовчуванню на заданий.
Наприклад ми хочемо виділити білим текстом та зеленою заливкою всі рядки в котрих значення поля «ValueNo» рівне 1.
procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
Begin
IF TDBGrid(Sender).DataSource.DataSet.FieldByName('ValueNo').AsInteger=1Then Begin
TDBGrid(Sender).Canvas.Brush.Color:=clGreen;
TDBGrid(Sender).Canvas.Font.Color:=clWhite;
End;
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
End;
Таким чином рівність
TDBGrid(Sender).DataSource.DataSet.FieldByName('ValueNo').AsInteger=1 буде справджуватись тільки на тих рядках таблиці де значення поля «ValueNo» рівне 1.
Якщо ж ми бажаємо перефарбувати стовпці через один, наприклад в м’який сірий колір тоді функція матиме такий вигляд:
procedure Tform1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
Begin
IF DataCol mod 2=0 then
TDBGrid(Sender).Canvas.Brush.Color:=$EEEEEE;TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
End;
Як з’ясувалося Borland Delphi 7 некоректпо обробляє всі СКБД крім парадокса, тому неможливо вияснити який саме рядок перемальовує. Спричинено це тим, що система перемальовує сітку почерзі і розрізняє рядки як «попередній» та «наступний» а не «1,2,3…N».
Для того, щоб в сітку вставити малюнок потрібно скористатися допоміжним компонентом TimageList. Цей компонент використовується для збереження в проекті маленьких малюнків, щоб в подальшому використовувати їх наприклад в меню, або на кнопках. Припустимо, що ми помістили на формі цей компонент та завантажили в нього малюночок. Тоді код програми який замальовує в клітинку заданий малюнок матиме вигляд.
procedure TformColorGrid.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var ImageIndex : Integer;
Begin
IF {умова яка вибере потрібний нам стовпець, та виконуються всі вимоги для розташування малюнка}Then Begin
ImageIndex:=NNN;
//Вказуємо під яким номеров в компоненті ImageList
//Розташована потрібна нам іконка
//Використовуємо метод Draw компоненти ImageList для
//Вставки малюнка
ImageList.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top, ImageIndex );
End;
End;
Даний приклад ілюструе роботу з кольоровим виділенням в DBGrid, різними кольрами виділяються стан товару (Брак, Магазин, Склад) та якщо на складі товару лишилось менше 5-ти він буде відображатися червоним кольором, також сітка є "полосатою"
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (TDBGrid(Sender).DataSource.DataSet.FieldByName('Condition').AsString='Брак')
and (Column.FieldName='Condition')
then Begin
TDBGrid(Sender).Canvas.Brush.Color:=clRed;
TDBGrid(Sender).Canvas.Font.Color:=clWhite;
End else
if (TDBGrid(Sender).DataSource.DataSet.FieldByName('Condition').AsString='Склад')
and (Column.FieldName='Condition')
then Begin
TDBGrid(Sender).Canvas.Brush.Color:=clGreen;
TDBGrid(Sender).Canvas.Font.Color:=clWhite;
End else
if (TDBGrid(Sender).DataSource.DataSet.FieldByName('Condition').AsString='Магазин')
and (Column.FieldName='Condition')
then Begin
TDBGrid(Sender).Canvas.Brush.Color:=clNavy;
TDBGrid(Sender).Canvas.Font.Color:=clWhite;
End else
if (TDBGrid(Sender).DataSource.DataSet.FieldByName('Count').AsInteger<5)
and (TDBGrid(Sender).DataSource.DataSet.FieldByName('Condition').AsString='Склад')
and (Column.FieldName='Count')
then Begin
TDBGrid(Sender).Canvas.Brush.Color:=clWhite;
TDBGrid(Sender).Canvas.Font.Color:=clRed;
TDBGrid(Sender).Canvas.Font.Style:=[fsBold];
End else
if DataCol mod 2=0 then
TDBGrid(Sender).Canvas.BrushColor:=$EEEEEE;
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;