Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

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

Delphi , Компоненты и Классы , TDBGrid

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

Статья Замечательные возможности DBGrid раздела Компоненты и Классы TDBGrid может быть полезна для разработчиков на Delphi и FreePascal.


Комментарии и вопросы


:: 2009-09-11 07:03:05 :: re:Замечательные возможности DBGrid

пользователь: Lora.

Добрый день! Подскажите как удалить строку в dbGrid1 не в table1 не самой таблице, а в dbgrid1 примерно как строчку закрашиваем и потом ее удалить. SelectRows.Clear; не помогает, ничего не происходит. Заранее большое спасибо


:: 2009-09-11 22:42:30 :: re:Замечательные возможности DBGrid

пользователь: kan.

Фактически тебе нужно скрыть строку, для этого нужно установить высоту в 0, но у этого компонента нет свойства, которое отвечало бы за высоту, а среди предков TDBGrid есть объект TCustomGrid, у которого есть свойство RowHeights. Чтобы его использовать, достаточно написать следующую строку:

TCustomGrid (DBGrid).RowHeights[2]:=0;


:: 2015-10-20 16:06:39 :: re:Замечательные возможности DBGrid

пользователь: Ричард.

Как использовать выведенную информацию из DBGrid, полученную в результате SQL запроса?
Т.е переписать полученное имя в Label.Caption?


:: 2016-08-18 14:44:49 :: re:Замечательные возможности DBGrid

пользователь: Наталья.

У меня при навигации по dbgrid мышкой курсор опускается до нижней видимой строки и все, дальше надо только боковым скроллом. Как сделать, чтобы мышкой проходить по всей таблице?


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: TDBGrid ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100
28.03.2024 23:42:12/0.0010330677032471/0