![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 покажи