скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Замечательные возможности 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 находятся графические изображения.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook