TToolbar несовместим с TForm.DoubleBuffered?

Я использую Delphi XE3.
Когда я создаю новый проект VCL и добавляю в него TToolbar, все работает нормально, за исключением случаев, когда я активирую Form1.DoubleBuffered.
С этого момента отображение панели инструментов прерывается - во время разработки , он либо черный, прозрачный, либо в него копируются части IDE (статусбар, тулбар и т.д.). Он переключается между этими параметрами, когда я нажимаю на него, и когда я переключаюсь на исходный код (F12) и обратно.
Во время выполнения он всегда черный.

С DrawingStyle=dsGradient все работает как положено. Переключение обратно на dsNormal снова ломает его.

Деактивация Form1.DoubleBuffered восстанавливает его.

Любые подсказки, как обойти эту проблему?


person Pharaoh    schedule 25.03.2013    source источник
comment
См. When not to use DoubleBuffered. Обходной путь здесь состоит в том, чтобы поместить TToolBar в TPanel.   -  person LU RD    schedule 25.03.2013
comment
Спасибо LU RD - работает отлично. Если вы опубликуете это как ответ, я отмечу его как решенный.   -  person Pharaoh    schedule 25.03.2013
comment
Или вы можете заполнить клиентский прямоугольник панели инструментов в событии OnAdvancedCustomDraw на этапе рисования cdPrePaint (хотя это довольно dirty workaround).   -  person TLama    schedule 25.03.2013
comment
Спасибо за эту ссылку, Дэвид. Мне не нужно DoubleBuffered для устранения мерцания компонентов VCL, но для TPaintBox, который рисует диаграмму (с взаимодействием с пользователем, таким как масштабирование и перетаскивание). Я знаю, что мог бы использовать TBitmap (или TImage), но пока работает Form.Doublebuffered (и никаких других проблем не возникает), я предпочитаю решение с одним щелчком мыши.   -  person Pharaoh    schedule 25.03.2013
comment
Двойная буферизация создает множество проблем во многих элементах управления, не только в TToolbar. Но если вы отключите его, у вас будет много мерцания в некоторых областях вашей программы... Так что... выбирайте свой яд.   -  person Z80    schedule 17.08.2015


Ответы (2)


На мой взгляд, решение состоит в том, чтобы установить TForm.DoubleBuffered на False. Использование значения True вызывает всевозможные другие проблемы. Это свойство работало достаточно хорошо до появления тем XP, но с момента их появления использование TForm.DoubleBuffered, на мой взгляд, стало нежизнеспособным.

В дополнение к проблемам, с которыми вы столкнулись, я столкнулся с множеством недостатков рисования при использовании темы Windows Basic. Я знаю, что это не мейнстрим, но я часто вижу это с удаленным доступом. И это еще не все. Когда вы дважды буферизуете форму, вы останавливаете анимацию темы. Например, кнопка по умолчанию пульсирует, указывая на то, что это кнопка по умолчанию.

Если вы получаете мерцание при изменении размера без двойной буферизации формы, используйте идеи из моего ответ на другой вопрос. Из комментариев кажется, что мерцание, с которым вы хотите бороться, находится в коробке с краской. Я, очевидно, не знаю подробностей, но мой опыт и чутье говорят, что с этим мерцанием на локальном уровне можно довольно легко справиться. Конечно, не должно быть необходимости в двойной буферизации глобальной формы.

person David Heffernan    schedule 25.03.2013
comment
Спасибо за ваши подсказки. Как я написал в вашем комментарии к моему вопросу, я пока буду использовать решение TPanel, но я буду иметь в виду ваши замечания и обязательно рассмотрю упомянутые вами проблемы; возможно, я сделаю то, что вы сказали. Еще раз спасибо. - person Pharaoh; 25.03.2013
comment
Устранить мерцание вашей коробки с краской очень просто. Двойная буферизация формы слишком чрезмерна. Это влияет на многое другое. Это глобальное решение локальной проблемы. Этого следует избегать. - person David Heffernan; 25.03.2013
comment
Да, я не могу отрицать то, что вы говорите. Я не знал, что TForm.DoubleBuffered вызывает столько проблем; Я думаю, что пойду и деактивирую его везде, где я его использовал до сих пор. Так что еще раз спасибо ;) - person Pharaoh; 25.03.2013

Как сообщается в этой статье, When not to use DoubleBuffered , некоторые элементы управления, такие как TToolBar и TRichEdit, плохо работают со свойством DoubleBuffered, для которого задано значение true.

Причину можно найти в документации, TWinControl.DoubleBuffered, где некоторые элементы управления WinControl не могут рисовать себя во временном растровом изображении (как это происходит, когда DoubleBuffered равно true).

Одним из обходных путей может быть установка TToolBar на TPanel.

person LU RD    schedule 25.03.2013