Використання кольорів в компоненті 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=1
      Then  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;