#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 Как насчет тематизации? Должны ли мы заботиться об этом?