Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2009, 21:14   #1
SpaceIQ
 
Регистрация: 02.07.2009
Сообщений: 7
По умолчанию Мерцание StringGrid (CLX)

Добрый вечер!

Меня интересуют сложные заголовки (составные) StringGrid в CLX. Я сделал все как положено, написал свой компонент, переопределил метод DrawCell, там написал то что мне нужно. Все рисуется ровно один раз, никаких перегрузок сложных нет. Но при любом действии заголовки мерцает.

То есть как это работает, насколько я понял. Вначале рисует стандартный фон у заголовка, потому уже вызывается переписаный метод DrawCell. И так для каждой ячейки. Неплохо было бы как-то запретить рисовать стандартный фон.

В VCL так же есть различные хорошие вещи такие как DoubleBuffered, WM. В CLX этого нет. Как быть? Как бороться с мерцанием?

Заранее спасибо.
SpaceIQ вне форума Ответить с цитированием
Старый 13.07.2009, 08:39   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Самому ввести буферизацию . Используйте промежуточный StringGrid, но только невидимый. Все действия проводите в нем. Затем из него через определенные равные промежутки времени выводите информацию в Ваш StringGrid.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 13.07.2009, 09:34   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но при любом действии заголовки мерцает.
А можно потискать программу и исходники?
Просто я лично никогда на мигание не жаловался. и в CLX тоже.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.07.2009, 12:36   #4
SpaceIQ
 
Регистрация: 02.07.2009
Сообщений: 7
По умолчанию

Stilet,
пример добавил в приложение.

TestStringGrid - сам компонент
TestProjectGrid - проект с ним

Моргание, например, можно увидеть, если кликать по ячейкам.

Utkin, а как я такое сделать? Ведь все равно будет моргать. Как это происходит:
1) Произошло событие, требующее перерисвоки грида.
2) Грид StringGrid перерисовывает себя (какой-то метод из родителя DrawGrid вызывается, который рисует сетку, потом уже DrawCell наследника).
3) Потом я перерисовываю его из буфера.
Вот если бы он изначально в мой буфер рисовать на втором шаге.

что же делать...
Вложения
Тип файла: rar MyStringGrid.rar (208.6 Кб, 13 просмотров)

Последний раз редактировалось SpaceIQ; 13.07.2009 в 12:38.
SpaceIQ вне форума Ответить с цитированием
Старый 13.07.2009, 13:02   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
SpaceIQ
Потестил. Не вижу мерцания (Core2Duo 3GB ОЗУ)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.07.2009, 14:10   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Смысл в том, что из невидимого компонента перерисовка в видимый происходит синхронно через равные промежутки времени (если грубо то в таймере), поэтому побочных эффектов типа мерцания чего-то там быть не должно в принципе. Перерисовка из теневого в видимый компонент происходит независимо от изменений в теневом компоненте, поэтому никаких дерганий и мерцаний (хотя все зависит от того каким образом ты будешь организовывать перерисовку из одного компонента в другой). В принципе всякие буферизации работают примерно таким же образом (ну различаются детали алгоритма).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 13.07.2009, 15:21   #7
SpaceIQ
 
Регистрация: 02.07.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Смысл в том, что из невидимого компонента перерисовка в видимый происходит синхронно через равные промежутки времени (если грубо то в таймере), поэтому побочных эффектов типа мерцания чего-то там быть не должно в принципе. Перерисовка из теневого в видимый компонент происходит независимо от изменений в теневом компоненте, поэтому никаких дерганий и мерцаний (хотя все зависит от того каким образом ты будешь организовывать перерисовку из одного компонента в другой). В принципе всякие буферизации работают примерно таким же образом (ну различаются детали алгоритма).
А как скрыть этот самый теневой компонент? Я сейчас попробывал, вроде работает, да. Но у меня одновременно видны два компонента. Если сделать visible = false. Я копирую изображение из него через Canvas.CopyRect.
SpaceIQ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мерцание vladi Microsoft Office Excel 0 03.06.2009 17:42
Мерцание на Канве SERG1980 Мультимедиа в Delphi 3 30.04.2008 08:14
мерцание shad0w Общие вопросы C/C++ 3 11.12.2007 12:31
Мерцание объектов Chaos-Delta Мультимедиа в Delphi 4 02.07.2007 13:59