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

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

TStringGrid: [D6, WinXP]


^Sanya ©   (2002-09-05 14:39:00) 

как избежать генерации события OnDrawCell при изменении свойства Cell[x,x] ?
Задача: менять цвет ячейки посредством FillRect.
FillRect хакрашивает всё вместе с надписью...
Ей нужно восстановить, но т.к. FillRect идёт в OnDrawCell, возникает бесконечный цикл...


^Sanya   (2002-09-06 11:28:00) [1]


> Юрий Зотов © (06.09.02 00:57)


Благодарю за ответ.


> Aleks1 (06.09.02 03:05)

???
Когда необходима перерисовка, когда ж ещё?


Aleks1   (2002-09-06 03:05:00) [2]

Не подвергая сомнению ответ Юрий Зотов © (06.09.02 00:57),
предложу лишь автору вопроса понять когда и для чего вызывается событие OnDraw"Something".


Юрий Зотов   (2002-09-06 00:57:00) [3]

> Можно ли "меньшей кровью" менять цвет разделителя (border"а)?

1. F1. FrameRect. Polyline.

2. Написав свой TextOut, Вы не увеличиваете загрузку машины. Просто внутренний TextOut заменяется Вашим.



^Sanya   (2002-09-05 16:58:00) [4]

2All:
Во-первых, кто опровергнет тот факт, что
StringGrid1.Cells[1,1] := "test"вызывает
OnDrawCell для ячейки [1,1] ?

Вывод №1:
Так вот, из этого следует, что писать подобные вещи в обработчике события OnDrawCell не следует из-за возникновения бесконечной рекурсии.

Вывод №2:
Писать что-то типа:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
StringGrid1.Canvas.Brush.Color := cllime;
StringGrid1.Canvas.FillRect(rect);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
StringGrid1.Cells[1,1] := "gffdfdfd"
end;


также не имеет смысла, т.к. после нажатия на BitBtn и изменения св-ва Cells произойдёт перерисовка, т.е. OnDrawCell, и текст закрасится, т.е. исчезнет.

Вывод №3:
как правильно заметил Shaman_Naydak © (05.09.02 15:35)
один из возможных вариантов - это TextOut, но оправдан ли этот вариант??? Возможно есть что-то менее грузящее машину, вроде того, чтобы метод закраски не трогал текст...
[честно говоря, сам сомневаюсь...]

Но цель-то состоит в том, чтобы в первую очередь менять цвет не фона, а бордеров, т.е. разделителей ячеек посредством:

StringGrid1.Canvas.Brush.Color := цвет фона;
StringGrid1.Canvas.Pen.Color := цвет бордера;
StringGrid1.Canvas.Rectangle(Rect.Left-1, Rect.Top-1, Rect.Right+1, Rect.Bottom+1);

В итоге для изменения цвета разделителя приходится дёргать все записи и фоны...

А FillRect я написал для простоты...

Корректирую вопрос:
Можно ли "меньшей кровью" менять цвет разделителя (border"а)?
P.S.: указанное выше несомненно работает, но я был бы рад увидеть менее ресурсоёмкий метод...

Заранее благодарен...


Song   (2002-09-05 16:23:00) [5]

FillRect() не может вызвать бесконечного цикла. Какого TCanvas FillRect() Вы вызываете?


Shaman_Naydak   (2002-09-05 15:35:00) [6]

Или сам восстанавливай надпись
Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);


pasha_golub   (2002-09-05 14:43:00) [7]

Используй ФиллРект не в обработчике события!


MBo   (2002-09-05 14:42:00) [8]

где-то ошибка. код OnDrawCell покажи


Наверх

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