СтатьиПрограммирование в Delphi

Изменение цвета ячеек Delphi Stringgrid

В основном компонент Stringgrid, используется для вывода строковой информации в свои ячейки. Но при написании программ очень часто возникает желание сделать их более удобными, выделяя отдельные столбцы, строки или области ячеек разными цветами или добавлением рисунков в ячейки StringGrid. Средствами инспектора объектов эту задачу не выполнить. Отдельной формы настроек для этого, в компоненте тоже не предусмотрено.

Однако, эта задача легко разрешается программно. Для этого используется событие компонента OnDrawCell, срабатывающее при отрисовке каждой отдельной ячейки таблицы. Таким образом, если использовать свои условия назначения того или иного цвета, можно «раскрасить» таблицу, нужным образом.

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

procedure TForm1.MyStringGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
MyStringGrid.Canvas.Brush.Color := clBlue; // назначение цвета ячейки
MyStringGrid.Canvas.FillRect(Rect); // закрашивание ячейки выбранным цветом
MyStringGrid.Canvas.Font.Color := clWhite; // назначение цвета шрифта
MyStringGrid.Canvas.TextOut(Rect.Left, Rect.Top, MyStringGrid.Cells[ACol, ARow]); // отрисовка текста в ячейки выбранным
end;

Данный код закрасит все ячейки одним цветом.

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

procedure TForm1.MyStringGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
if (ACol > 0) and (ARow > 0) then begin // первый столбец и строку оставляем без изменений
if (ACol = 1) or (ACol = 3) then
MyStringGrid.Canvas.Brush.Color:=clBlue; // второй и четвертый столбец синим цветом

if (ACol = 2) or (ACol = 4) then
MyStringGrid.Canvas.Brush.Color:=clGreen; // третий и пятый - зеленым

if ARow = MyStringGrid.RowCount-1 then
MyStringGrid.Canvas.Brush.Color:=clRed; // последняя строка - красным

if gdFocused in State then
MyStringGrid.Canvas.Brush.Color:=clYellow; // текущая выделенная ячейка закрашивается желтым

MyStringGrid.Canvas.FillRect(Rect);
MyStringGrid.Canvas.Font.Color := clWhite;
MyStringGrid.Canvas.TextOut(Rect.Left, Rect.Top, MyStringGrid.Cells[ACol, ARow]);
end;
end;

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

Раскрашенный компонент Delphi StringGrid
Рисунок: «Раскрашенный» StringGrid

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

procedure TForm1.MyStringGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
if gdFixed in State then
MyStringGrid.Canvas.Brush.Color:=clBlue;
MyStringGrid.Canvas.FillRect(Rect);
MyStringGrid.Canvas.Font.Color := clWhite;
MyStringGrid.Canvas.TextOut(Rect.Left, Rect.Top, MyStringGrid.Cells[ACol, ARow]);
end;

Аналогично можно выделить сразу всю строку:

procedure TForm1.MyStringGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
if gdSelected in State then
MyStringGrid.Canvas.Brush.Color:=clBlue;
MyStringGrid.Canvas.FillRect(Rect);
MyStringGrid.Canvas.Font.Color := clWhite;
MyStringGrid.Canvas.TextOut(Rect.Left, Rect.Top, MyStringGrid.Cells[ACol, ARow]);
end;


Комментарии

Имя:
Текст комментария:
* В комментариях запрещено публиковать рекламные объявления. Сообщения, содержащие ссылки на сторонние ресурсы добавляется в скрытом режиме. Они будут открыты, если не нарушают установленных правил, после проверки.
Защита от спам-роботов (* Обязателельно укажите ответ на простой вопрос ниже.)
Сколько букв в слове «барабан»? (цифра)