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