Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Курс видеоуроков программирования и крэкерства 6.0
(актуальность: февраль 2017)
Свежие инструменты, новые видеоуроки!

  • 300+ видеоуроков
  • 800 инструментов
  • 80 свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Замечательные возможности DBGrid

Стоят старая и молодая проститутки на боевом посту. Старая все объясняет: к кому подходить, к кому не надо... На рассвете вдруг из дверей офиса нетвердой походкой выходит мужик, волосы взъерошены, глаза красные... Молодая:
- Ой, что это с ним?
Старая:
- Не обращай внимания. Это свой, программист. Тоже всю ночь тр@хался.

Нередко при разработке приложений, использующих табличный вывод данных, требуется отобразить те или иные строки таблиц нестандартным образом, например, с целью привлечения внимания пользователя к этим строкам. В данной статье содержатся некоторые советы, касающиеся нестандартного отображения данных в компоненте TDBGrid.

Как изменить цвет строки в TDBGrid

Предположим, нам требуется изменить атрибуты текста и фона строки в компоненте TDBGrid, если значение какого-либо поля удовлетворяет заранее заданному условию. Для этой цели принято использовать обработчик события OnDrawColumnCell этого компонента. Отметим, что возможности, предоставляемые при его использовании, весьма разнообразны.

Рассмотрим простейшее приложение с TDBGrid, содержащее один компонент TTable, один компонент TDataSource и один компонент TDBGrid: Установим значения их свойств в соответствии с приведенной ниже таблицей:

Компонент Свойство Значение
Table1 DatabaseName BCDEMOS (или DBDEMOS)
TableName events.db
Active true
DataSource1 DataSet Table1
DBGrid1 DataSource DataSource1
     

Обычно для перерисовки изображения в ячейках используется метод OnDrawColumnCell.

Его параметр Rect – структура, описывающая занимаемый ячейкой прямоугольник; параметр Column - колонка DBGrid, в которой следует изменить способ рисования изображения. Для вывода текста используется метод TextOut свойства Canvas компонента TDBGrid.

Предположим, нам нужно изменить цвет текста и фона строки в зависимости от значения какого-либо поля (например, VenueNo). Создадим обработчик события OnDrawColumnCell компонента DBGrid1.

В случае Delphi соответствующий код имеет вид:


 procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
 begin
   if Table1.FieldByName('VenueNo').Value = 1 then
     with DBGrid1.Canvas do
     begin
       Brush.Color := clGreen;
       Font.Color := clWhite;
       FillRect(Rect);
       TectOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
     end;
 end;
 

В результате на этапе выполнения при отображении строк, в которых значение поля VenueNo равно 1, фон ячеек будет окрашен в зеленый цвет, а текст выведен белым цветом.

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

Соответствующий код для Delphi имеет вид:


 procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
 begin
   if Table1.FieldByName('VenueNo').Value = 1 then
     with DBGrid1.Canvas do
     begin
       Brush.Color := clGreen;
       Font.Color := clWhite;
       FillRect(Rect);
       if Column.Alignment = taRightJustify then
         TectOut(Rect.Right - 2 - TectWidth(Column.Field.Text),
         Rect.Top+2, Column.Field.Text)
       else
         TectOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
     end;
 end;
 

В этом случае выравнивание текста в колонках совпадает с выравниванием столбцов.

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

Если необходимо отобразить нестандартным образом не всю строку, а только некоторые ячейки, следует проанализировать имя поля, отображаемого в данной колонке, как в приведенном ниже обработчике событий.

Соответствующий код для Delphi имеет вид:


 procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn;  State: TGridDrawState);
 begin
   if (Table1.FieldByName('VenueNo').Value = 1) and (Column.FieldName = 'VenueNo') then
     with DBGrid1.Canvas do
     begin
       Brush.Color := clGreen;
       Font.Color := clWhite;
       FillRect(Rect);
       if Column.Alignment = taRightJustify then
         TectOut(Rect.Right - 2 - TectWidth(Column.Field.Text),
         Rect.Top + 2, Column.Field.Text)
       else
         TectOut(Rect.Left + 2, Rect.Top + 2, Column.Field.Text);
     end;
 end;
 

В результате выделенными оказываются только ячейки, для которых выполняются выбранные нами условия:

Как заменить данные в столбце компонента TDBGrid

Нередко в колонке DBGrid нужно вывести не реальное значение, хранящееся в поле соответствующей таблицы, а другие данные, соответствующие имеющимся (например, символьную строку вместо ее числового кода). В этом случае также используется метод TextOut свойства Canvas компонента TDBGrid:

Соответствующий код для Delphi имеет вид:


 procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn;  State: TGridDrawState);
 begin
   if Column.FieldName = 'VenueNo' then
     with DBGrid1.Canvas do
     begin
       Brush.Color := clWhite;
       FillRect(Rect);
       if Table.FieldByName('VanueNo').Value = 1 then
       begin
         Font.Color := clRed;
         TextOut(Rect.Right - 2 - DBGrid1.Canvas.TextWidth('our vanue'),
         Rect.Top + 2, 'our vanue');
       end
       else
         TextOut(Rect.Right - 2 - DBGrid1.Canvas.TextWidth('other vanue'),
         Rect.Top + 2, 'other vanue');
     end;
 end;
 

Еще один пример – использование значков из шрифтов Windings или Webdings в качестве подставляемой строки.

Соответствующий код для Delphi имеет вид:


 procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn;  State: TGridDrawState);
 begin
   if Column.FieldName = 'VenueNo' then
     with DBGrid1.Canvas do
     begin
       Brush.Color := clWhite;
       FillRect(Rect);
       Font.name := 'Windings';
       Font.Size := -14;
       if Table.FieldByName('VanueNo').Value = 1 then
       begin
         Font.Color := clRed;
         TextOut(Rect.Right - 2 - DBGrid1.Canvas.TextWidth('J'),
         Rect.Top + 2, 'J');
       end
       else
         TextOut(Rect.Right - 2 - DBGrid1.Canvas.TextWidth('F'),
         Rect.Top + 2, 'F');
     end;
 end;
 

Как поместить графическое изображение в TDBGrid

Использование свойства Canvas компонента TDBGrid в методе OnDrawColumnCell позволяет не только выводить в ячейке текст методом TextOut, но и размещать в ячейках графические изображения. В этом случае используется метод Draw свойства Canvas.

Модифицируем наш пример, добавив в форму компонент TImageList и поместив в него несколько изображений.

Модифицируем код нашего приложения:

Соответствующий код для Delphi имеет вид:


 procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn;  State: TGridDrawState);
 var
   Im1: TBitmap;
 begin
   Im1 := TBitmap.Create;
   if Column.FieldName = 'VenueNo' then
     with DBGrid1.Canvas do
     begin
       Brush.Color := clWhite;
       FillRect(Rect);
       if Table.FieldByName('VanueNo').Value = 1 then
         ImageList1.GetBitmap(0, Im1)
       else
         ImageList1.GetBitmap(2, Im1);
       Draw(round((Rect.Left + Rect.Right - Im1.Width) / 2), Rect.Top, Im1);
     end;
 end;
 

Теперь в TDBGrid в колонке VenueNo находятся графические изображения.




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS