Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.07.17;
Скачать: CL | DM;

Вниз

Изменение цвета ячейки в StringGrid при заполнении таблицы   Найти похожие ветки 

 
Basilisk   (2011-04-05 13:20) [0]

Вывожу решения своей задачи в 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????


 
novichek   (2011-04-05 13:44) [5]

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;

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]

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


 
Basilisk   (2011-04-05 14:12) [10]

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


 
И. Павел ©   (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;

 st.Canvas.FillRect(Rect);
end;


 
Медвежонок ХМЛ ©   (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]

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


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

таблица заполняется

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


 
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]

Всем огромное спасибо))))



Страницы: 1 вся ветка

Текущий архив: 2011.07.17;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
3-1261473731
Xmen
2009-12-22 12:22
2011.07.17
Экспорт базы MySQL в FiriBird


15-1301902882
brother
2011-04-04 11:41
2011.07.17
Монитор не печатает и принтер не показывает...


1-1258987492
Diplomat
2009-11-23 17:44
2011.07.17
Удалить сведения об ранее подключенных устройствах


2-1302808428
Алекс_123
2011-04-14 23:13
2011.07.17
RichEdit прокрутка текста


4-1224073189
Dymok
2008-10-15 16:19
2011.07.17
Оценить сколько времени простаивает машина