Дуже часто в практиці доводиться виділяти якісь рядки, змінюючи їх фон або колір шрифту. Наприклад, в бухгалтерії зазвичай виділяють рядки, в яких значення менше нуля. Припустимо, ваша програма показує клієнтів, а якийсь стовпець містить їх баланс на рахунку вашої компанії. Якщо цей баланс менше 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 дані доводиться вносити самостійно.
Це досить складні компоненти, вони мають безліч властивостей, які в свою чергу самі є складними об'єктами. Якщо описувати компоненти графіків і діаграм докладно, то вийде невелика книга, тому ми розглянемо лише основні прийоми роботи з ними.