Отправляет email-рассылки с помощью сервиса Sendsay

Borland C++ Builder - всякая всячина

  Все выпуски  

Borland C++ Builder всякая всячина (TDBGrid - выделение цветом)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Приветствую всех получателей рассылки Borland C++ Builder всякая всячина!

Сегодня я хочу коснуться вопроса внешнего вида вашей программы, а именно - таблицы, которая является результатом работы почти всех программ, связанных с базами данных. За отображение таблиц в вашей программе отвечает компонента TDBGrid (или TRxDBGrid из библиотеки RxLib), связанная через свойство DataSource с компонентой TDataSource, а та, в свою очередь, с компонентами TQuery или TTable. Сегодня мы не будем вникать в особенности получения конкретных данных, нас будет интересовать только конечный их вывод в окне программы.

Компонента TDBGrid имеет довольно много параметров тонкой настройки отображения, в том числе она может выводить данные разными цветами в зависимости от заданных условий. Для этого она имеет событие OnDrawColumnCell. Итак, сотворите новую формочку (Form1), бросьте на нее TTable (Table1), TDataSource (DataSource1) и TDBGrid (DBGrid1), с помощью свойств DatabaseName и TableName подцепите таблицу Table1 к какой-нибудь базе данных и установите свойство Active= true;. Установите свойства:

DBGrid1->DataSource= DataSource1;
DataSource1->DataSet= Table1;

После этого на вкладке Events (Object Inspector) для DBGrid1 сделайте двойной щелчек мышом на свойстве OnDrawColumnCell. Билдер автоматически создаст новый метод Form1::DBGrid1DrawColumnCell. С ним мы и будем экспериментировать в дальнейшем.

Теперь - как и что мы будем выделять. Тут может быть три варианта:

  • Выделение строк
  • Выделение столбцов
  • Выделение произвольных ячеек

  • Рассмотрим их в порядке возрастания сложности.


    Выделение строк: Предположим, что нам нужно для повышения читабельности таблицы чередовать строки белого и голубого цвета. Для этого нарисуйте в методе DBGrid1DrawColumnCell следующий код:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State)
    {
        // блок вычислений
        if (Table1->RecNo & 0x00000001) DBGrid1->Canvas->Brush->Color= clAqua;
        else DBGrid1->Canvas->Brush->Color= clWhite;
        // блок отображения
        DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    }
    //---------------------------------------------------------------------------

    Как видите, в качестве аргументов этот метод получает несколько параметров: TObject *Sender - стандартную ссылку на объект, вызвавший это событие (в нашем случае это - DBGrid1), const TRect &Rect - координаты прамоугольника в пределах DBGrid1, причем, эти границы вы можете изменить, int DataCol - номер столбца, который отображается в данный момент, TColumn *Column - указатель на этот столбец в семействе DBGrid1->Columns и TGridDrawState State - статус ячейки, для отображения которой был вызван этот метод. State может быть комбинацией следующих значений: gdSelected - для выделенной ячейки, gdFocused - для ячейки, которая имеет в данный момент фокус ввода, и gdFixed - для ячейки, которая находится в зафиксированной области DBGrid1 (если, например, DBGrid1 имеет зафиксированные (неперемещаемые) столбцы).
    Все содержимое метода я условно разделил на две группы: блок вычислений, в данный момент содержащий только оператор if и блок отображения, в котором вызывается стандартный метод TDBGrid::DefaultDrawColumnCell для отображения ячейки. Ему передаются все параметры, которые получил наш метод. Он, на основе параметров DBGrid1->Canvas->Brush (фон), DBGrid1->Canvas->Font (текст) и DBGrid1->Canvas->Pen (перо), закрашивает прямоугольник Rect установленным цветом фона и выводит текст ячейки согласно DBGrid1->Canvas->Font.
    Итак, что мы сотворили: оператор if в блоке вычислений проверяет одно условие - Table1->RecNo & 0x00000001. Перевожу: берем номер текущей записи таблицы (Table1->RecNo) - это число типа int и сбрасываем у него все биты, кроме первого с помощью бинарной операции "и" (&). В результате мы получаем 0 (false) для всех четных записей и 1 (true) - для всех нечетных записей. А дальше все просто - в зависимости от полученного значения устанавливаем с помощью DBGrid1->Canvas->Brush->Color белый или голубой (Аква или clAqua - для дотошных) цвет фона в ячейке и вызываем стандартный метод DefaultDrawColumnCell. Запустите этот пример и вы увидите таблицу с чередующимися белыми и голубыми (Аква) строками. Элементарно, в общем. Едем дальше?


    Выделение столбцов: Усложним немного наш пример, выделим, к примеру, текст ячеек второго столбца в нашей таблице красным цветом. Модифицируйте слегка наш пример:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State)
    {
        // блок вычислений
        if (Table1->RecNo & 0x00000001) DBGrid1->Canvas->Brush->Color= clAqua;
        else DBGrid1->Canvas->Brush->Color= clWhite;
        if (DataCol==1) DBGrid1->Canvas->Font->Color= clRed;
        // блок отображения
        DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    }
    //---------------------------------------------------------------------------

    Хочу сразу напомнить, что номера столбцов начинаются с 0, поэтому второй столбец таблицы будет иметь номер 1. Итак, после (будте внимательны - после) проверки четности строк мы ввели проверку на номер столбца, и если он - второй - красим его буковки в красный цвет. Если столбцы в вашей таблице перемещаются или удаляются, лучше вычислять нужный столбец не по его номеру, а по имени поля, к которому он привязан через параметр Column. Выглядеть это будет примерно так:

        if (Column->FieldName=="Field1") DBGrid1->Canvas->Font->Color= clAqua;

    Естественно, что в вашей таблице (Table1) должно быть поле с именем "Field1". После запуска модифициованного примера вы увидите, что все осталось, как прежде, но, кроме того, текст в ячейках второго столбца стал красным. Теперь еще чуть усложним задачу:


    Выделение произвольных ячеек: Предположим, что ваша таблица Table1 содержит числовое поле "Field1". Допустим - это стоимость некоторых товаров во вражеских условных еденицах. Ставим задачу: пометить цветом ячейки, содержащие шокирующие суммы (выше $1000). На самом деле, если подумать 1/2 секунды, можно самому придумать любой критерий, я лишь только даю идею... Итак поправьте немного код метода DBGrid1DrawColumnCell следующим образом:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State)
    {
        // блок вычислений
        if (Table1->RecNo & 0x00000001) DBGrid1->Canvas->Brush->Color= clAqua;
        else DBGrid1->Canvas->Brush->Color= clWhite;
        if (DataCol==1) DBGrid1->Canvas->Font->Color= clRed;
        if (Table1->FieldByName("Field1")->AsInteger>=1000 && Column->FieldName=="Field1")
        {
            DBGrid1->Canvas->Font->Color= clWhite;
            DBGrid1->Canvas->Brush->Color= clRed;
        }

        // блок отображения
        DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    }
    //---------------------------------------------------------------------------

    Итак, что мы еще натворили? Мы проверяем дополнительно, что отрисовываемая ячейка принадлежит столбцу "Field1", и что сумма, которую она содержит, не самая маленькая. Если это так, то красим фон ячейки красным, а текст - белым. Запустите пример и убедитесь в полученном результате.

    В общем, все довольно просто, главное, не перегружайте таблицу излишне резкими цветами (для фона ячейки лучше использовать бледные пастельные тона). Вот и все, удачи вам и до свидания



    С уважением, Васильев Евгений...

    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться
    Убрать рекламу
    Рейтингуется SpyLog

    В избранное