Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
ВнизTStringGrid: Найти похожие ветки
← →
^Sanya (2002-09-05 14:39) [0]как избежать генерации события OnDrawCell при изменении свойства Cell[x,x] ?
Задача: менять цвет ячейки посредством FillRect.
FillRect хакрашивает всё вместе с надписью...
Ей нужно восстановить, но т.к. FillRect идёт в OnDrawCell, возникает бесконечный цикл...
← →
MBo (2002-09-05 14:42) [1]где-то ошибка. код OnDrawCell покажи
← →
pasha_golub (2002-09-05 14:43) [2]Используй ФиллРект не в обработчике события!
← →
Shaman_Naydak (2002-09-05 15:35) [3]Или сам восстанавливай надпись
Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
← →
Song (2002-09-05 16:23) [4]FillRect() не может вызвать бесконечного цикла. Какого TCanvas FillRect() Вы вызываете?
← →
^Sanya (2002-09-05 16:58) [5]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.: указанное выше несомненно работает, но я был бы рад увидеть менее ресурсоёмкий метод...
Заранее благодарен...
← →
Юрий Зотов (2002-09-06 00:57) [6]> Можно ли "меньшей кровью" менять цвет разделителя (border"а)?
1. F1. FrameRect. Polyline.
2. Написав свой TextOut, Вы не увеличиваете загрузку машины. Просто внутренний TextOut заменяется Вашим.
← →
Aleks1 (2002-09-06 03:05) [7]Не подвергая сомнению ответ Юрий Зотов © (06.09.02 00:57),
предложу лишь автору вопроса понять когда и для чего вызывается событие OnDraw"Something".
← →
^Sanya (2002-09-06 11:28) [8]
> Юрий Зотов © (06.09.02 00:57)
Благодарю за ответ.
> Aleks1 (06.09.02 03:05)
???
Когда необходима перерисовка, когда ж ещё?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c