Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1301721561
Kerk
2011-04-02 09:19
2011.07.17
Новые видеокурсы :)


1-1260213430
Leto
2009-12-07 22:17
2011.07.17
Странно работает thintwindow


2-1301685503
Gu
2011-04-01 23:18
2011.07.17
Еще раз про ani курсоры из ресурсов


15-1301380921
RGV
2011-03-29 10:42
2011.07.17
Скайп


2-1302557511
zulus
2011-04-12 01:31
2011.07.17
Интеграция кода ид С++ DLL В Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский