![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StringGrid событие DrawCell [D2005, XP]
alex810 © (2006-11-17 09:10:00)Помогите пожалуйста как мне можно вызвать процедуру DrawCell щелчком по кнопке. Я думаю так но не знаю что такое Rect: TRect
procedure TForm1.Button1Click(Sender: TObject);;
begin
TForm3.StringGrid2DrawCell(StringGrid2, X, Y, ?????, gdFixed);
end
Плохиш (2006-11-17 12:09:00) [21]
> procedure TForm3. StringGrid2DrawCell(Sender: TObject; ACol,
> ARow: Integer;
> for X := 1 to stringgrid1.colcount do
> for y := 1 to stringgrid1.rowcount do
А я - Папа Римский. Спокойно дети мои, спокойно. Там со всеми разберутся...
Elen (2006-11-17 12:08:00) [22]
> alex810
Так. Давай спочатку - тебе нужно проверить цифру в ячейке, найти соответствующий ей цвет и отрисовать в такой же ячейке по позиции в другом гриде. Так?
Плохиш (2006-11-17 12:07:00) [23]
> alex810 © (17.11.06 12:02) [131]
Враньё, этот код компилятор делфи даже не пропустит.
Elen (2006-11-17 12:06:00) [24]
> alex810
Когда я говорю Вот это if Stringgrid1.Cells[x,y] = '1' then лучше перенести
> в OnDrawCellимеется только это, а тоы весь цикель дтуда зафигачил. Совет : попробовать на более простых задачах и примерах понять механизм отрисовки.
KilkennyCat (2006-11-17 12:05:00) [25]тайнопись.
ASoft (2006-11-17 12:04:00) [26]та
> alex810 © (17.11.06 12:02) [131]
>
>
> FillRect(Rect);
так и хочется сказать известную здесь фразу "чукча писатель..." :(
alex810 (2006-11-17 12:02:00) [27]
> Вот это if Stringgrid1.Cells[x,y] = '1' then лучше перенести
> в OnDrawCell
Я так и сделал не получается
procedure TForm3.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var x,y:integer;
begin
if (state = [gdSelected]) then
with TStringGrid(Sender), Canvas do
begin
Brush.Color := SelectedColor;
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
FillRect(Rect);
end
else
for X := 1 to stringgrid1.colcount do
for y := 1 to stringgrid1.rowcount do
begin
if Stringgrid1.Cells[x,y] = '1' then
begin
if (state = [gdSelected]) then
with TStringGrid(Sender), Canvas do
begin
Brush.Color := Edit2.Color;
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
FillRect(Rect);
end
end;
end;
end;
Elen (2006-11-17 12:01:00) [28]Удалено модератором
ASoft (2006-11-17 11:58:00) [29]так.. на чем остановились? :)
>alex810 ©
автор, пока ты не поймешь где, как и что рисуется в принципе вообще и не сделаешь, простенький пример окрашивания столбца/строки СтрингГрида, тебе будет сложно сваять что-то серьезное!
Elen (2006-11-17 11:56:00) [30]Удалено модератором
Плохиш (2006-11-17 11:52:00) [31]
> Elen © (17.11.06 11:41) [112]
>
> > А что он нарисует???????
>
> То что ты пропишеш в OnDrawCell.
> Автор не обижайся - просто ты и сам не знаеш чего хочеш.
В данном случае, автор как раз знает что хочет :-) Только степень его знаний по теме не позволяет ему не только найти правильное решение, но, к сожалению, даже понять это решение уже нмогократно пережёванное здесь.
ЮЮ (2006-11-17 11:51:00) [32]
> Только что попробовал не получается.
Код OnDrawCell - в студию!!!
alex810 (2006-11-17 11:50:00) [33]
> Это все что тебе нужно. Осталось в нужным местах заполнять
> и изменять массив цветов, вызывая после этого перерисовку
> всего грида StringGrid2.Invalidate
Только что попробовал не получается.
ЮЮ (2006-11-17 11:50:00) [34]Вынужден был кричать авторским неправильным кодом.
Brush.Color := ЦВЕТА_ЯЧЕЕК[ARow, ACol];
FillRect(Rect);
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
Естественно, сначала стереть с доски, а потом на ней написать :)
Elen (2006-11-17 11:49:00) [35]
> Как сделать чтобы она прорисовывалась опять так как была
.Invalidate. Все вычисления по колору помести в обработчик отрисовки.
> Та я понимаю что прийдется делать цикл он у меня уже есть
>
> for X := 1 to stringgrid1.colcount do
> for y := 1 to stringgrid1.rowcount do
> begin
> if Stringgrid1.Cells[x,y] = '1' then
> begin
> Сюда что надо написать
Ничего. Вместо этого цикла Stringgrid1.invalidate; Он сам организует прорисовку.
Вот это if Stringgrid1.Cells[x,y] = '1' then лучше перенести в OnDrawCell
Плохиш (2006-11-17 11:49:00) [36]
> alex810 © (17.11.06 11:41) [114]
Чукча-писатель!
Товагищь, в oncreate формы читаешь из файла, сохранённый ранее, массив цветов и вариант, многократно озвученный ЮЮ, отрисует твой грид без каких-либо дополнительных телодвижений с твоей стороны.
ЮЮ (2006-11-17 11:48:00) [37]
procedure TForm3.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (state = [gdSelected]) then
with TStringGrid(Sender), Canvas do
begin
Brush.Color := ЦВЕТА_ЯЧЕЕК[ARow, ACol];
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
FillRect(Rect);
end;
end;
Это все что тебе нужно. Осталось в нужным местах заполнять и изменять массив цветов, вызывая после этого перерисовку всего грида StringGrid2.Invalidate
Для невменяемого автора. Может заметит
ЮЮ (2006-11-17 11:47:00) [38]
procedure TForm3.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (state = [gdSelected]) then
with TStringGrid(Sender), Canvas do
begin
Brush.Color := ЦВЕТА_ЯЧЕЕК[ARow, ACol];
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
FillRect(Rect);
end;
end;
Это все что тебе нужно. Осталось в нужным местах заполнять и изменять массив цветов, вызывая после этого перерисовку всего грида StringGrid2.Invalidate
alex810 (2006-11-17 11:46:00) [39]
> Когда ты выделяешь мышью грид рисует только ячейку с которой
> ты ушел и в которую ты пришел. Проведи над гридом после
> этого другой формой и удивись тому, как у тебя всё запущено.
> :)
Вот моя проблема. Как сделать чтобы она прорисовывалась опять так как была
Сергей М. (2006-11-17 11:45:00) [40]
> alex810 © (17.11.06 11:41) [114]
> Он рисует когда я выделяю мышью. А мне надо чтобы он рисовал
> еще и тогда когда создается форма.
>
Он рисует всегда, когда по тем или иным причинам требуется перерисовать ячейку. И одна из этих "причин" (в том числе и в первуюочередь) - создание грида в ходе создания формы