Зміна кольору осередків 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;
В результаті отримаємо таблицю, осередки якої матимуть різні кольори. Слід зазначити, що послідовність умов в даному випадку перекриває присвоєння їм кольорів колонок останнім рядком, тому вона виходить одного кольору.

Малюнок: «Розмальований» 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;