Виділення окремих рядків

Дуже часто в практиці доводиться виділяти якісь рядки, змінюючи їх фон або колір шрифту. Наприклад, в бухгалтерії зазвичай виділяють рядки, в яких значення менше нуля. Припустимо, ваша програма показує клієнтів, а якийсь стовпець містить їх баланс на рахунку вашої компанії. Якщо цей баланс менше 0, значить, клієнт має заборгованість перед вашою фірмою. Бухгалтеру буде дуже зручно, якщо дебітори (боржники) будуть виділятися в загальному списку червоним кольором.

Спосіб промальовування даних в сітці DBGrid залежить від значення її властивості DefaultDrawing. За замовчуванням властивість одно True, то є дані промальовувалися автоматично. Якщо властивість містить False, то промальовування доведеться кодувати самостійно у властивостях OnDrawColumnCell або OnDrawDataCell, про які вже згадувалося в цій лекції.

Якщо ми написали алгоритм промальовування, але властивість DefaultDrawing містить True, то спочатку сітка заповниться даними автоматично, а потім буде виконаний наш алгоритм. Іншими словами, промальовування деяких частин сітки буде виконана двічі. Це не дуже добре для швидкодії програми, однак нам доведеться вступати саме так: адже ми не всі рядки і стовпці збираємося виводити іншим способом, а лише деякі. Решта будуть заповнені даними за замовчуванням.

Розберемо цей метод докладніше. Якщо знайти його в довідці Delphi, то побачимо:

property OnDrawColumnCell: TDrawColumnCellEvent;

Тобто, цей метод має тип TDrawColumnCellEvent. Опис типу таке:

type TDrawColumnCellEvent = procedure (Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) of object;

Розберемося з параметрами. Rect - координати промальовування.

DataCol - порядковий номер поточного стовпця (починаючи з 0). Column - дані поточного стовпчика. State - стан осередку. Може бути:

• gdSelected - комірка виділена

• gdFocused - фокус введення в осередку

• gdFixed - осередок - заголовок стовпця.

Припустимо, в нашому прикладі потрібно, щоб рядки з військовозобов'язаними співробітниками виділялися червоним кольором:

Виділення окремих рядків

Мал. 12.7. виділення рядків

Зауважимо відразу, що наявність порожніх стовпців створює додаткові, але їх можна вирішити проблеми. Код події OnDrawColumnCell доведеться переробити, він буде таким:

procedure TfMain.DBGrid1DrawColumnCell (Sender: TObject; const Rect: TRect;

DataCol: Integer; Column: TColumn; State: TGridDrawState); var

with DBGridl.Canvas do begin

// поле "військовозобов'язані" містить істину?

if (ADOTable1 [ 'BoeHHOo6H3aHHbra']) = True and not (gdSelected in State) then begin // виводимо всі осередки рядка білим по червоному: Font.Color: = clRed; FillRect (Rect); end; // if

// якщо це порожній збірний стовпець if Column.Index = 0 then begin

if ADOTable1 [ 'прізвищ'] <> Null then

s: = ADOTable1 [ 'Прізвище'] + ''; if ADOTable1 [ 'Ім'я'] <> Null then

// якщо це порожній стовпець з кнопкою else if Column.Index = 6 then begin

DBGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State); Exit;

// всі інші стовпці else

TextOut (Rect.Left + 2, Rect.Top + 2, Column.Field.Text); end; // with end;

Розберемося з кодом. Спочатку за допомогою with ми вказуємо, що будемо працювати безпосередньо з властивістю DBGrid1.Canvas, яке відповідає за стиль промальовування осередки. Далі ми дивимося, чи міститься True в поле "військовозобов'язані" поточної записи. Якщо так, то вказуємо, що колір шрифту повинен бути червоним, а потім функцією FillRect (Rect) ми стираємо стандартний висновок.

Далі ми визначаємо, промальовується чи в даний момент порожній збірний стовпець з "Прізвище І.О.". Якщо це він, то ми формуємо змінну s з потрібними даними і виводимо їх, як в минулий раз.

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

TextOut (Rect.Left + 2, Rect.Top + 2, Column.Field.Text);

Зверніть увагу, що ми додали по два пікселя до крайньої лівої і крайньої верхньої координаті осередки. Якщо цього не зробити, то нова промальовування не буде цілком зафарбовувати стару:

Мал. 12.8. Некоректна промальовування

Кількість додаються пікселів залежить від формату даних і розміру шрифту. Зазвичай це визначається шляхом проб. Наприклад, комірка може містити цифри, які зазвичай притискаються до правого краю, і тут двома пікселями не обійтися.

Зробити перевірку на тип даних можна, наприклад, так:

// якщо текст, зрушимо тільки на 2 пікселя if Column.Field.DataType = ftString then

TextOut (Rect.Left, Rect.Top + 2, Column.Field.Text) // якщо цифри, зрушимо їх вправо на 28 пікселів else TextOut (Rect.Left + 28, Rect.Top + 2, Column.Field.Text) ;

Виділення рядка червоним текстом може виявитися недостатнім для замовника. Що, якщо він зажадає, щоб ці рядки виділялися червоним рядком з білим шрифтом? тоді замість

Font.Color: = clRed; FillRect (Rect);

вам доведеться написати

// виводимо всі осередки рядка білим текстом по червоному фону: Brush.Color: = clRed; Font.Color: = clWhite; FillRect (Rect);

Як бачите, подсвойство

DBGridl.Canvas.Brush.Color відповідає за колір заливки комірки, а

DBGridl.Canvas.Font.Color за колір виведеного в ній шрифту. Список доступних кольорів ви можете відкрити в будь-якому властивості Color будь-якого компонента. Тепер ви зможете створити сітку зі складними елементами промальовування.

Лекція 13. DBChart. Графіки і діаграми.

Для побудови графіків і діаграм використовуються компоненти Chart з вкладки Additional, і DBChart з вкладки Data Controls палітри компонентів. Це рівноцінні компоненти, відмінність полягає в тому, що DBChart приймає дані з вказаного набору даних - таблиці або запиту, а при використанні Chart дані доводиться вносити самостійно.

Це досить складні компоненти, вони мають безліч властивостей, які в свою чергу самі є складними об'єктами. Якщо описувати компоненти графіків і діаграм докладно, то вийде невелика книга, тому ми розглянемо лише основні прийоми роботи з ними.

Програмування баз даних в Delphi

Схожі статті