Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.16;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
3-50576
7Up
2002-08-23 10:49
2002.09.16
ODBC для Delphi (продолжение)


1-50850
d_oleg
2002-09-04 14:28
2002.09.16
передача переменных в DLL - в чём я ошибаюсь?


1-50751
kerkonst
2002-09-03 11:18
2002.09.16
Как дождатся конца работы проги, запущенной через ShellExecute ?


3-50644
savva
2002-08-23 14:26
2002.09.16
Блокировка файла не возможна - что это и с чем едят:))


7-51005
Чайник2
2002-07-04 06:42
2002.09.16
Click