Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменение цвета ячейки в StringGrid при заполнении таблицы [D7, XP]


Страницы:   1 2

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) - таблица будет сама себя рисовать по мере необходимости.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо