Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Подробней о DoubleBuffered


Автор: Ak47black 29.9.2007, 14:09
Здравствуйте.
Я хотелбы узнать подробней про DoubleBuffered.
Какие есть минусы ?
И еше очень хочу узнать как сделать чтобы у всех например 100 объектов на форме свойство (которые имею это свойство) DoubleBuffered был на True.
Как массов присвоить и не писать каждому?  smile 

Автор: Rrader 29.9.2007, 14:34
Минусы состоят в том, что требуется больше ресурсов системы, а также иногда замечал глюки при отрисовке.

Автор: lukas 29.9.2007, 16:37
да и при XP Man-e все чекбоксы почему то черные... =(

Автор: ivan219 29.9.2007, 18:46
С Button в XP стиле тоже накладки так что делать DoubleBuffered надо там где он нужен а не вовсей форме.

Автор: Alexeis 29.9.2007, 20:10
Для DoubleBuffered при каждой перерисовке создается битмапник и рисуется все на нем. Эта фича доступна только при наличии стилей.

Автор: Coder 30.9.2007, 15:00
Куда же еще подробнее:
Код

Determines whether the control’s image is rendered directly to the window or painted to an in-memory bitmap first. 

Delphi syntax:
property DoubleBuffered: Boolean;

Description
When DoubleBuffered is false, the windowed control paints itself directly to the 
window. When DoubleBuffered is true, the windowed control paints itself to an in-memory 
bitmap that is then used to paint the window. Double buffering reduces the amount of 
flicker when the control repaints, but is more memory intensive.

When a windowed control is a dock site and has an associated dock manager, it must 
be double-buffered.

Note:    Some controls, such as TRichEdit, can’t paint themselves into a bitmap. 
For such controls, DoubleBuffered must be set to false.


устанавливаешь в среде Делфи курсор на DoubleBuffered и нажимаешь Ctrl+F1

Автор: Ak47black 30.9.2007, 16:11
Ну ситуация прояснилась.  smile 
Спасибо всем кто участвовал.
Следущий раз сначала Ctrl+F1 нажму Coder +

Автор: artemiy 14.11.2007, 14:17
Цитата(ivan219 @  29.9.2007,  18:46 Найти цитируемый пост)
С Button в XP стиле тоже накладки так что делать DoubleBuffered надо там где он нужен а не вовсей форме. 

А как узнать где doublebuffered нужен? Мне, например, он нужен практически для каждого элемента формы (я активно использую anchors, в т.ч. right и bottom), поэтому при ресайзе формы все элементы тоже ресайзятся и мигают практически как новогодняя ёлка. 
Ставил некоторым компонентам doublebuffered=true, так они все равно продолжали мигать... Может быть там надо и парентам этих компонет устанавливать doublebuffered?

В общем интересует как можно легко установить doublebuffered всему, чему можно?  smile Ну и есественно не переборщить smile

Автор: Alexeis 14.11.2007, 15:09
artemiy, всему ставить не стоит, так как это снижает скорость прорисовки и приводит к торможениям. 

Автор: artemiy 14.11.2007, 15:22
А чему тогда стоит? Хотелось бы свести мерцание формы к минимуму...

Автор: Alexeis 14.11.2007, 15:30
Цитата(artemiy @  14.11.2007,  15:22 Найти цитируемый пост)
А чему тогда стоит? Хотелось бы свести мерцание формы к минимуму... 

  Думаю следует для больших контролов, панелей и т.д. А вообще, с продвижением висты эта проблема теряет актуальность.

Автор: artemiy 14.11.2007, 17:06
Кстати, а как бороться с тем, когда поле установки DoubleBuffered объекты не полностью прорисовываются? ожет быть кто-то сталкивался с подобным?

Автор: Alexeis 14.11.2007, 17:16
artemiy, не все контролы умеют работать с двойной буферизацией. В том числе для этого и не устанавливают ее по умолчанию.

Автор: artemiy 14.11.2007, 17:27
Это понятно... но в данном примере у меня 2 GroupBox (один из них является родительским компонентом для другого), у обоих стоит DoubleBuffered=true. Т.е. можно предоложить что GroupBox не работает с двойной буферизацией.
Но если у родительского сделать DoubleBuffered=false (второй не трогать), то никаких непрорисованных областей не образуется... Тогда вышесделанный вывод у меня вызывает сомнения...

Как можно точно определить (не методом научного тыкаsmile ) работает ли компонент с двойной буферизацией или нет?

Автор: Alexeis 14.11.2007, 18:49
Цитата(artemiy @  14.11.2007,  17:27 Найти цитируемый пост)
Как можно точно определить (не методом научного тыка smile ) работает ли компонент с двойной буферизацией или нет? 

  У меня создалось ощущение, что эту двойную буферизацию лепили наспех и не довели до ума. Так, что боюсь что прийдеться именно методом тыка.

Автор: ivan219 15.11.2007, 20:22
Цитата(artemiy @  14.11.2007,  14:17 Найти цитируемый пост)
Мне, например, он нужен практически для каждого элемента

Сомневаюсь smile что делаешь? Выложи программу.

Автор: artemiy 15.11.2007, 21:43
Да вряд ли программа поможет... Просто я стараюсь при ресайзе формы сохранять пропорнции размеров элементов. Делаю это при помощи anchors. Так вот при ресайзе самой формы у меня ресайзятся все компоненты на ней, и, соответсвенно, мерцают. А это не есть гуд... И бороться с этим мерцанием с помощью DoubleBuffered не особо получается - одни компоненты перестают мерцать, другие нет :( 

Автор: Alexeis 24.5.2011, 10:08
  Сегодня еще раз столкнулся с указанной проблемой. К сожалению вопрос мигания групбокосов сохранился даже на семерке при включенной двойной буферизации.
  Красивого решения нет, но в принципе задача решается нормально при помощи сабклассинга групбокосов. Используя функцию SetWindowLongPtr подменяем функцию окна и запрещаем обработку сообщения WM_ERASEBKGND . Перед уничтожением компонента не забываем вернуть исходную оконную функцию опять же функцией  SetWindowLongPtr .
  Пока что не наблюдается артефактов из-за отключения WM_ERASEBKGND , но в принципе такой глюк может появиться. Еще раз отмечаю, что нормально работает при включенном флаге DoubleBuffered 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)