Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.013 c
14-50936
ch-z
2002-08-21 14:22
2002.09.16
Вопрос??


1-50712
reach
2002-09-02 12:41
2002.09.16
Как получить версию ActiveX компонента


6-50906
???
2002-05-24 11:38
2002.09.16
таблица внутри html - файла. Можно ли обратиться к ней как к БД


3-50632
ShuraGrp
2002-08-22 17:33
2002.09.16
DBRestore ??


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




   Наверх