Изменить цвет шрифта ячейки TStringGrid

#delphi #colors #delphi-xe #tstringgrid

#delphi #Цвет #delphi-xe #tstringgrid

Вопрос:

Мне нужно изменить цвет текста в ячейке TStringGrid в Delphi.

Просто ячейка. Как я могу это сделать?

Ответ №1:

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

 procedure TForm1.GridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  S: string;
  RectForText: TRect;
begin
  // Check for your cell here (in this case the cell in column 4 and row 2 will be colored)
  if (ACol = 4) and (ARow = 2) then
  begin
    S := Grid.Cells[ACol, ARow];
    // Fill rectangle with colour
    Grid.Canvas.Brush.Color := clBlack;
    Grid.Canvas.FillRect(Rect);
    // Next, draw the text in the rectangle
    Grid.Canvas.Font.Color := clWhite;
    RectForText := Rect;
    // Make the rectangle where the text will be displayed a bit smaller than the cell
    // so the text is not "glued" to the grid lines
    InflateRect(RectForText, -2, -2);
    // Edit: using TextRect instead of TextOut to prevent overflowing of text
    Grid.Canvas.TextRect(RectForText, S);
  end;
end;
  

(Вдохновленный этим.)

Комментарии:

1. 1. В дополнение к вашей правке, основанной на комментарии Реми: поскольку вопрос задан о конкретной ячейке , вам, вероятно, следует показать, как изменить только одну ячейку с помощью параметров ACol и ARow (и, возможно, объяснить вызов InflateRect — в качестве предложения, однако, вам не нужен отдельный var; вы можете напрямую перейти Rect к InflateRect , поскольку он не объявлен как const ).

2. @Ken Я добавил еще несколько пояснений и проверку ячейки. Изначально у меня возникло искушение дать «использовать другой компонент, предоставляющий больше возможностей форматирования» в качестве реального ответа, поскольку я нахожу пользовательский рисунок всегда немного опасным, потому что это может разрушить собственный внешний вид. Вероятно, лучше нарисовать все ячейки на заказ, чем рисковать тем, что другие ячейки будут выглядеть как-то иначе. И что касается Rect: я осторожен. Возможно, кто-то решит добавить код в конец метода с использованием Rect, не зная об изменении, которое я внес в значения.

3. Генрих, запрашивающий должен знать при его изменении, что они изменяют Rect . Если кто-то другой изменяет его, он должен прочитать существующий код, прежде чем делать это. 🙂 Приятные правки — это делает ответ более понятным для новичка в Delphi, который находит этот ответ в поиске. Что касается цвета ячейки, вы можете отрисовывать внешний вид по умолчанию, проверяя наличие фиксированных строк и столбцов и пропуская их, используя clWindow и clWindowText (или clHighlight и clHighlightText в зависимости от State ), и в основном вызывая только InflateRect и TextRect , если ячейка НЕ должна быть отрисована.

4. Ну что ж. Если в спешке все возможно, никто не поверит 😉

5. @Ken Как насчет тематизации? Должны ли мы заботиться об этом?