![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение цвета ячейки в StringGrid при заполнении таблицы [D7, XP]
Basilisk © (2011-04-05 13:20:00)Вывожу решения своей задачи в StringGrid. Необходимо закрасить каким-нибудь цветом ячейки с оптимальным решением. То есть в одной строке только одна ячейка должна быть закрашена.
Как это реализовать?
Basilisk (2011-04-05 14:51:00) [1]Всем огромное спасибо))))
Медвежонок ХМЛ (2011-04-05 14:47:00) [2]if (coloured=true) and (ACol=opt[i])then st.Canvas.Brush.Color:= clGreen
Просто охренеть.
Медвежонок ХМЛ (2011-04-05 14:45:00) [3]зачем этот дебильный двойной цикл внутри события отрисовки?
И. Павел (2011-04-05 14:44:00) [4]> 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]);
Basilisk (2011-04-05 14:42:00) [5]
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:29:00) [6]Даже можно без "st.Canvas.FillRect(Rect);", т.к. TextRect сам фон рисует.
И. Павел (2011-04-05 14:29:00) [7]> ячейки пустые(зеленые) хотя я в них текст добавляю
Вот с выводом текста:
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:28:00) [8]вижу но ячейки пустые(зеленые) хотя я в них текст добавляю
Все что ты нарисовал - ты видишь.
Все чего ты не рисовал - ты не видишь.
По крайней мере не должен видеть в нормальном состоянии сознания.
И. Павел (2011-04-05 14:26:00) [9]> Вроде у меня так всё и есть кроме этого условия (ACol mod
> 2 = ARow mod 2)
>
> тогда он по шахматному закрашивает
Вместо этого условия вставьте свое: "if(j=opt[i])". сейчас оно у вас в Button9Click, но должно быть в stDrawCell. Сперва выполняется Button9Click и устанавливает colored в true. Потом, при необходимости перерисовки, выполняется stDrawCell, в котором вы должны проверить: нужно ли ячейку разукрасить и разукрасить ее.
Плохиш (2011-04-05 14:26:00) [10]
> Basilisk (05.04.11 14:12) [10]
>
> Медвежонок Пятачок
> а поподробней?
Подробности в справке и у преподавателя.
> Basilisk (05.04.11 14:19) [14]
>
> Медвежонок ХМЛ
> но по нажатию клавиши у меня ведь таблица заполняется
Заполнение таблицы и рисование её же операции разные и независимые.
Basilisk (2011-04-05 14:26:00) [11]Медвежонок ХМЛ
вижу но ячейки пустые(зеленые) хотя я в них текст добавляю
Медвежонок ХМЛ (2011-04-05 14:24:00) [12]таблица заполняется
и чего?
ты ее (таблицу) не видишь?
Basilisk (2011-04-05 14:19:00) [13]Медвежонок ХМЛ
но по нажатию клавиши у меня ведь таблица заполняется
Basilisk (2011-04-05 14:19:00) [14]И. Павел
Вроде у меня так всё и есть кроме этого условия (ACol mod 2 = ARow mod 2)
тогда он по шахматному закрашивает
Медвежонок ХМЛ (2011-04-05 14:15:00) [15]а поподробней?
куда еще-то подробнее?
текст не нарисован.
что должно быть при этом видно?
И. Павел (2011-04-05 14:14:00) [16]Условие, когда нужно закрашивать ячейку а когда нет нужно помещать в 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;
st.Canvas.FillRect(Rect);
end;
Basilisk (2011-04-05 14:12:00) [17]Медвежонок Пятачок
а поподробней?
Медвежонок Пятачок (2011-04-05 14:09:00) [18]ненарисованного текста и не должно быть видно
Basilisk (2011-04-05 14:04:00) [19]Почему-то закрашивается вся таблица и текста не видно:
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 13:47:00) [20]> а при этом надо использовать StringGrid.Repaint????
Если у вас раньше таблица не разукрашивалась и теперь (например, после нажатия на кнопку) вы решили, что она должна начать разукрашиваться (colored = true), то наверное, не помешает вызвать Refresh, иначе таблица может перерисоваться только когда это потребуется. Но после этого ни Repaint ни Refresh вызывать будет не надо (особенно в OnDrawCell) - таблица будет сама себя рисовать по мере необходимости.