![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уменьшить мерцание DBGrid'a при перемещении курсора
DelphiLexx © (2006-08-08 09:01:00)DBGrid у меня отображает некоторые строки разными цветами. При перемещении курсора у меня в AfterScroll'e вызывается Refresh DBGrid'a (так нужно), что приводит к мерцанию.
Как уменьшить мерцание DBGrid'a при перемещении курсора?
evvcom (2006-08-09 16:46:00) [1]> [34] sniknik © (09.08.06 16:40)
> > Нужен тщательный анализ VCL
> искать где светлее? а код автора значит "ака невиная овечка
> в этом плане", ну вот не может сей "титан мысли" лажу написать...
> ага, верю. ;)
:) Тщательный анализ VCL не для того, чтобы ТАМ ошибки найти, а чтобы у себя их не наделать неумелым перекрытием методов.
> выше вроде бы упоминалось о DoubleBuffered, и о том что
> мерцание и при нем есть?
Видимо пропустил или уже забыл. 35 постов уж воду в ступе толчем :)
sniknik (2006-08-09 16:40:00) [2]> Нужен тщательный анализ VCL
искать где светлее? а код автора значит "ака невиная овечка в этом плане", ну вот не может сей "титан мысли" лажу написать... ага, верю. ;)
> Только эти методы чистят целиком весь фон, из-за чего и наблюдается эффект мерцания
не изза этого. выше вроде бы упоминалось о DoubleBuffered, и о том что мерцание и при нем есть? ... ну какая разница чистится или нет в неотображаемом битмаме фон, для мерцания?
evvcom (2006-08-09 16:25:00) [3]> [31] Silver... © (09.08.06 16:00)
> глянь в справку
На фиг мне это? Я в подобных случаях обычно Invalidate вызывал, но в некоторых случаях этого недостаточно. Нужен тщательный анализ VCL в частности TDBGrid. И хорош писать свои посты в духе, будто это я вопросы задаю, и я жду ответа на [0]. Я свои предложения уже в [8] изложил, не переубеждая автора использовать один метод вместо другого.
> в место DataSet.Refresh
Вообще-то до сих пор я считал, что речь идет о DBGrid.Refresh, который вызывает в свою очередь Repaint :)
Только эти методы чистят целиком весь фон, из-за чего и наблюдается эффект мерцания, уменьшить который автор и возжелал в [0] :-)
DelphiLexx (2006-08-09 16:20:00) [4]
> в место DataSet.Refresh - DbGrid1.Invalidate/Repaint (не
> помню точно как там правильней глянь в справку)
А разницы собственно нет т.к. Refresh вызывает Repaint.
Silver... (2006-08-09 16:00:00) [5]в место DataSet.Refresh - DbGrid1.Invalidate/Repaint (не помню точно как там правильней глянь в справку)
evvcom (2006-08-09 15:46:00) [6]> [29] Silver... © (09.08.06 15:34)
> имел ввиду как рялизована "перекраска"
Аткель я знаю, как реализована у автора перекраска?
> если a) или b) то Refresh не нужен
Для того, что нужно автору, нужен. Обработчики OnDraw* вызываются только для тех строк, которые грид считает нужным перерисовать. Если происходит перемещение курсора с одной строки на другую, то грид считает, что надо перерисовать строку, с которой курсор ушел, и строку, на которую пришел. Автору же требуется ПЕРЕРАСКРАСИТЬ ВСЕ строки грида, обозначая особым цветом все строки с параметром (-ами), схожим(и) с текущей выделенной строкой. Может я уже чего и не помню про стандартный грид, давно не юзал, но вроде все так.
Silver... (2006-08-09 15:34:00) [7]> Крашу не я, а автор. Все же
имел ввиду как рялизована "перекраска"
a) DBGrid1.OnDrawCollumnCell
b) DBGrid1.OnDrawDataCell
c) иное
>Кстати данные в DataSet-е не меняются
если a) или b) то Refresh не нужен (...хотя сначала раскажи о методе раскраски, потом поговорим)
... или ты Refresh для перерисовки вызываесь (попытка телепнуть) тогда Invalidate
evvcom (2006-08-09 15:10:00) [8]> [26] Silver... © (09.08.06 15:01)
> как красишь?
Крашу не я, а автор. Все же
> Чтобы раскрасить
правильнее было написать "Чтобы перекрасить"
Кстати данные в DataSet-е не меняются.
Silver... (2006-08-09 15:07:00) [9]в догонку ...
при этом изменяются данные в DataSet-е?
Silver... (2006-08-09 15:01:00) [10]
> Чтобы раскрасить
при чем тут Refresh
как красишь?
zdm (2006-08-09 14:56:00) [11]DBGridEh форева
evvcom (2006-08-09 14:49:00) [12]> [23] Silver... © (09.08.06 14:46)
> не пойму зачем Refresh
Чтобы раскрасить ВСЕстроки грида уже ДРУГИМИцветами.
Silver... (2006-08-09 14:46:00) [13]
> При перемещении курсора у меня в AfterScroll'e вызывается
> Refresh DBGrid'a (так нужно), что приводит к мерцанию.
при этом изменяются данные в DataSet-е?
не пойму зачем Refresh
evvcom (2006-08-08 14:36:00) [14]> [21] sniknik © (08.08.06 14:22)
> оно и так не мерцает... (чтото делаю не так?)
Сам не пробовал... А может у тебя машинка супер-пупер интел-пень > 3ГГц? :-)
sniknik (2006-08-08 14:22:00) [15]не надо ничего переписывать... оно и так не мерцает... (чтото делаю не так?)
evvcom (2006-08-08 14:05:00) [16]> [17] DelphiLexx © (08.08.06 11:20)
> Ну и как должен выглядеть код MyRefresh?
Смотришь как реализован Refresh, находишь очистку фона. Пишешь аналогичную MyRefresh, но без очистки фона. Долго и муторно вылавливаешь глюки. Или предлагаешь мне за тебя проделать сию работу?
> [19] Desdechado © (08.08.06 11:45)
> а не избавиться о него полностью :))
О, да... Я этого не учел. :)
Desdechado (2006-08-08 11:45:00) [17]> А где это условие разместить?
Логично предположить, что перед вызовом Refresh, не так ли?
evvcom © (08.08.06 11:17) [15]
Автор же просил "Уменьшить мерцание DBGrid'a", а не избавиться о него полностью :))
DelphiLexx (2006-08-08 11:23:00) [18]
> DBGridEh.OnGetCellParams
Я тоже пользуюсь DBGridEh, а в каких случаях генерируется событие OnGetCellParams?
DelphiLexx (2006-08-08 11:20:00) [19]
> Лучше все же, думаю, свой MyRefresh написать без популярной
> в данном случае полной очистки фона.
Ну и как должен выглядеть код MyRefresh?
DelphiLexx (2006-08-08 11:20:00) [20]
> Вызывать refresh не каждый раз, как переходишь со строки
> на строку.
> А, например, при выполнении условия, которое требует перерисовки
> (т.е. когда надо подкрасить или снять подкраску). Еслитаких
> случаев мало, мерцать будет меньше.
А где это условие разместить?