Форум: "Начинающим";
Текущий архив: 2011.07.17;
Скачать: [xml.tar.bz2];
ВнизИзменение цвета ячейки в 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.004 c