Меню

Как изменить цвет ячейки stringgrid delphi



StringGrid Delphi

Как закрасить ячейку StringGrid

Закрасить одну ячейку таблицы StringGrid Delphi поможет метод FillRect такого свойства компонента StringGrid, как Canvas (холст), отвечающего за все графические возможности компонента. Для закрашивания ячейки StringGrid этот метод следует вызвать в обработчике события DrawCell. Ячейка таблицы представляет собой прямоугольник, а обработчик события OnDrawCell имеет переменную

которая как раз и представляет собой прямоугольник с координатами, заданными индексами столбца ACol и строки ARow, подлежащий графической обработке. В итоге, вот как можно реализовать процедуру закрашивания одной ячейки таблицы StringGrid Delphi:

procedure TForm1.StringGrid1DrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
begin
StringGrid1.Canvas.Brush.Color:=clRed;
if ((ACol=2)and(ARow=2)) then
StringGrid1.Canvas.FillRect(Rect);
end;

В результате ячейка с координатами (2, 2) будет окрашена в красный цвет.

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

if ((ACol=2)and(ARow=2)) then
StringGrid1.Canvas.FillRect(Rect);

нужно заменить на два условных оператора:

// Первый условный оператор
if (((ACol=1)or(ACol=3)or(ACol=5)or(ACol=7))
and
((ARow=1)or(ARow=3)or(ARow=5)or(ARow=7)))
then StringGrid1.Canvas.FillRect(Rect);
// Второй условный оператор
if (((ACol=2)or(ACol=4)or(ACol=6)or(ACol=8))
and
((ARow=2)or(ARow=4)or(ARow=6)or(ARow=8)))
then StringGrid1.Canvas.FillRect(Rect);

Ячейки таблицы StringGrid Delphi размером 9*9 послушно закрасятся подобно шахматной доске. Для упрощения данного условия можно создать два множества и использовать оператор проверки содержания элемента во множестве. Вот результирующая процедура:

procedure TForm1.StringGrid1DrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
const M1 = [1, 3, 5, 7];
M2 = [2, 4, 6, 8];
begin
StringGrid1.Canvas.Brush.Color:=clRed;
if (ACol in M1)and(ARow in M1)
or
(ACol in M2)and(ARow in M2)
then StringGrid1.Canvas.FillRect(Rect);
end;

Сайт из коллекции Компоненты Delphi

Источник

Как изменить цвет ячейки stringgrid delphi

Вывожу решения своей задачи в StringGrid. Необходимо закрасить каким-нибудь цветом ячейки с оптимальным решением. То есть в одной строке только одна ячейка должна быть закрашена.

Читайте также:  Как изменить цвет ластика

Как это реализовать?


И. Павел © ( 2011-04-05 13:21 ) [1]

Используйте событие OnDrawColumnCell:
http://delphi-faq.zoxt.net/192.htm


Basilisk ( 2011-04-05 13:24 ) [2]

а как событие с нажатием клавиши связать?


И. Павел © ( 2011-04-05 13:30 ) [3]

> а как событие с нажатием клавиши связать?

Событие (OnDrawCell для StringGrid) нужно задать в инспекторе объектов (перейти на вкладку «Events» и там дважды щелкнуть левой кнопкой мыши на соответствующем событии, чтобы создался обработчик к нему).

А что должно происходить при нажатии клавиши? Если только после нажатии клавиши должен разукрашиваться StringGrid, то просто создайте переменную colored = false, а в обработчике клавиши присвойте ей true. А в OnDrawCell проверяйте: если colored = true, то разукрашивайте.


Basilisk ( 2011-04-05 13:43 ) [4]

а при этом надо использовать StringGrid.Repaint.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if ACol=0 then // закрашиваем первую ячейку в строке
begin
stringGrid1.Canvas.Brush.Color:= clGray;
stringGrid1.Canvas.FillRect(rect);
end;


novichek ( 2011-04-05 13:45 ) [6]

StringGrid.Repaint ни в коем случаи!


И. Павел © ( 2011-04-05 13:47 ) [7]

> а при этом надо использовать StringGrid.Repaint.

Если у вас раньше таблица не разукрашивалась и теперь (например, после нажатия на кнопку) вы решили, что она должна начать разукрашиваться (colored = true), то наверное, не помешает вызвать Refresh, иначе таблица может перерисоваться только когда это потребуется. Но после этого ни Repaint ни Refresh вызывать будет не надо (особенно в OnDrawCell) — таблица будет сама себя рисовать по мере необходимости.


Basilisk ( 2011-04-05 14:04 ) [8]

Почему-то закрашивается вся таблица и текста не видно:

procedure Tmain.stDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if coloured=true then
begin
st.Canvas.Brush.Color:= clGreen;
st.Canvas.FillRect(rect);
end;
end;

procedure Tmain.Button9Click(Sender: TObject);
var i,j:integer;
begin
coloured:=false;
for i:=0 to st.RowCount-1 do
for j:=0 to st.ColCount-1 do
begin
coloured:=false;
if(j=opt[i]) then coloured:=true;
st.Cells[j,i]:=floattostr(reshc[i,j])+»\»+floattostr(resht[i,j]);
st.Refresh;
end;
end;

Читайте также:  Каких цветов будут выпускать ладу грант


Медвежонок Пятачок © ( 2011-04-05 14:09 ) [9]

ненарисованного текста и не должно быть видно

Медвежонок Пятачок
а поподробней?


И. Павел © ( 2011-04-05 14:14 ) [11]

Условие, когда нужно закрашивать ячейку а когда нет нужно помещать в OnDrawCell. Вот пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
colored := True;
st.Refresh;
end;

procedure TForm1.stDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (colored) and (ACol mod 2 = ARow mod 2)
then st.Canvas.Brush.Color := clWhite
else st.Canvas.Brush.Color := clBlack;


Медвежонок ХМЛ © ( 2011-04-05 14:15 ) [12]

куда еще-то подробнее?
текст не нарисован.
что должно быть при этом видно?


Basilisk ( 2011-04-05 14:19 ) [13]

И. Павел
Вроде у меня так всё и есть кроме этого условия (ACol mod 2 = ARow mod 2)

тогда он по шахматному закрашивает


Basilisk ( 2011-04-05 14:19 ) [14]

Медвежонок ХМЛ
но по нажатию клавиши у меня ведь таблица заполняется

и чего?
ты ее (таблицу) не видишь?


Basilisk ( 2011-04-05 14:26 ) [16]

Медвежонок ХМЛ
вижу но ячейки пустые(зеленые) хотя я в них текст добавляю


Плохиш © ( 2011-04-05 14:26 ) [17]


> Basilisk (05.04.11 14:12) [10]
>
> Медвежонок Пятачок
> а поподробней?

Подробности в справке и у преподавателя.

> Basilisk (05.04.11 14:19) [14]
>
> Медвежонок ХМЛ
> но по нажатию клавиши у меня ведь таблица заполняется

Заполнение таблицы и рисование её же операции разные и независимые.


И. Павел © ( 2011-04-05 14:26 ) [18]

> Вроде у меня так всё и есть кроме этого условия (ACol mod
> 2 = ARow mod 2)
>
> тогда он по шахматному закрашивает

Вместо этого условия вставьте свое: «if(j=opt[i])». сейчас оно у вас в Button9Click, но должно быть в stDrawCell. Сперва выполняется Button9Click и устанавливает colored в true. Потом, при необходимости перерисовки, выполняется stDrawCell, в котором вы должны проверить: нужно ли ячейку разукрасить и разукрасить ее.


Медвежонок ХМЛ © ( 2011-04-05 14:28 ) [19]

вижу но ячейки пустые(зеленые) хотя я в них текст добавляю

Читайте также:  Чем закрасить ярко рыжий цвет после осветления

Все что ты нарисовал — ты видишь.
Все чего ты не рисовал — ты не видишь.
По крайней мере не должен видеть в нормальном состоянии сознания.


И. Павел © ( 2011-04-05 14:29 ) [20]

> ячейки пустые(зеленые) хотя я в них текст добавляю

Вот с выводом текста:

procedure TForm1.Button1Click(Sender: TObject);
begin
st.Cells[1, 1] := «aaa»;
colored := True;
st.Refresh;
end;

procedure TForm1.stDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (colored) and (ACol mod 2 = ARow mod 2)
then st.Canvas.Brush.Color := clWhite
else st.Canvas.Brush.Color := clBlack;

st.Canvas.FillRect(Rect);
st.Canvas.TextRect(Rect, Rect.Left, Rect.Top, st.Cells[ACol, ARow]);
end;


И. Павел © ( 2011-04-05 14:29 ) [21]

Даже можно без «st.Canvas.FillRect(Rect);», т.к. TextRect сам фон рисует.


Basilisk ( 2011-04-05 14:42 ) [22]

procedure Tmain.stDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var i,j:integer;
begin
for i:=0 to st.RowCount-1 do
for j:=0 to st.ColCount-1 do
begin
if (coloured=true) and (j=opt[i])then st.Canvas.Brush.Color:= clGreen
else st.Canvas.Brush.Color:= clWhite;
st.Canvas.FillRect(Rect);
st.Canvas.TextRect(Rect, Rect.Left, Rect.Top, st.Cells[ACol, ARow]);
end;
end;

procedure Tmain.Button9Click(Sender: TObject);
var i,j:integer;
begin
for i:=0 to st.RowCount-1 do
for j:=0 to st.ColCount-1 do
begin
st.Cells[j,i]:=floattostr(reshc[i,j])+»\»+floattostr(resht[i,j]);
coloured:=true;
st.Refresh;
end;

Текст виден, но ячейки всё равно все закрашивает


И. Павел © ( 2011-04-05 14:44 ) [23]

> for i:=0 to st.RowCount-1 do
> for j:=0 to st.ColCount-1 do

Этот цикл в stDrawCell не нужен. stDrawCell для каждой ячейки вызывается свой, при этом координаты ячейки, для которой был вызван stDrawCell можно узнать, прочитав параметры ACol и ARow. Т.е. внутри stDrawCell нужно разукрашивать только одну ячейку — с координатами [ACol; ARow]:

if (coloured=true) and (ACol=opt[i])then st.Canvas.Brush.Color:= clGreen
else st.Canvas.Brush.Color:= clWhite;
st.Canvas.FillRect(Rect);
st.Canvas.TextRect(Rect, Rect.Left, Rect.Top, st.Cells[ACol, ARow]);


Медвежонок ХМЛ © ( 2011-04-05 14:45 ) [24]

зачем этот дебильный двойной цикл внутри события отрисовки?


Медвежонок ХМЛ © ( 2011-04-05 14:47 ) [25]

if (coloured=true) and (ACol=opt[i])then st.Canvas.Brush.Color:= clGreen


Basilisk ( 2011-04-05 14:51 ) [26]

Источник

Adblock
detector