Delphi TListView DoubleBuffered не работает, если вы используете стили

Когда вы включаете стили приложения и устанавливаете для свойства DoubleBuffered TListView значение True, это не работает. Когда вы обновляете элементы списка и их подэлементы, он мерцает. У кого-нибудь есть решение для этого?

Мне на самом деле понравились стили, но все еще есть технические проблемы. Теперь я не могу доверять стилям.

Спасибо, К.


person blacksun    schedule 22.09.2012    source источник
comment
Вы приложили обновления от ListView.Items.BeginUpdate и ListView.Items.EndUpdate ?   -  person TLama    schedule 22.09.2012
comment
Да, я пробовал это. Скажем, у меня есть 25 элементов в списке, и я обновляю их подэлементы каждые 1 секунду. Я использую items.BeginUpdate перед изменением и items.EndUpdate после завершения. Это вызывает больше проблем. Все ушли из поля зрения и очень быстро возвращаются.   -  person blacksun    schedule 22.09.2012
comment
Вы имеете в виду стили VCL? Не используйте двойную буферизацию. В любом месте. Это всегда вызывает проблемы со стилями и темами. Лучшим подходом для представления списка является виртуальный режим.   -  person David Heffernan    schedule 22.09.2012
comment
@DavidHeffernan Да, я имею в виду стили VCL. Вы имеете в виду, что это решает проблему, если я использую список в виртуальном режиме?   -  person blacksun    schedule 22.09.2012
comment
Но даже если мы используем виртуальный режим, я думаю, он будет мерцать. Потому что мы будем добавлять/редактировать элементы.   -  person blacksun    schedule 22.09.2012
comment
В виртуальном режиме всегда визуализируется только видимая часть содержимого элемента управления, поэтому, если вы добавите новый элемент ниже последнего видимого узла, перерисовка не будет выполнена.   -  person TLama    schedule 22.09.2012
comment
Нам нужно включить OwnerData и нам нужно закодировать событие OnData. Я прав? Если у нас есть какие-либо изменения, нам нужно использовать ListView1.Refresh; обновить вид. Это лучший способ использовать виртуальный режим?   -  person blacksun    schedule 22.09.2012
comment
он снова мерцает, потому что я использую ListView1.Refresh при каждом изменении...   -  person blacksun    schedule 22.09.2012
comment
Не звоните Обновить. Вы можете аннулировать только те элементы, которые вы изменили, вызвав UpdateItems. Если он все еще мерцает, отправьте отчет о контроле качества и прекратите использование стилей VCL. Они сосут.   -  person David Heffernan    schedule 22.09.2012
comment
Это ХЕ2. Итак, мы заказали XE3. Как вы думаете, они исправили проблему в XE3?   -  person blacksun    schedule 22.09.2012
comment
Что ж, стили XE2 VCL были фабрикой ошибок. Они исправят множество ошибок стилей VCL в XE3. Не знаю, поможет ли это вам.   -  person David Heffernan    schedule 22.09.2012
comment
@blacksun: Это все равно, что сказать: я наложил на кожу пластырь, а потом принял ванну, и он смылся. Двойная буферизация — это свойство нижележащего слоя, а слой VCL Styles — это наложенный слой. В зависимости от свойств базовых вещей, которые взламываются, это не ваша проблема. и двойная буферизация не является лекарством от мерцания. Как указывает Дэвид, вы также можете перестать делать то, что заставляло его мерцать, вместо того, чтобы говорить: «О нет, моя повязка отклеилась, пока я был в ванне». Глупые бинты.   -  person Warren P    schedule 22.09.2012
comment
Проведя несколько тестов в Delphi XE3 (пробная версия v.17.0.4625.53395) могу сказать следующее. С использованием таймера обновления 10 мс (знаю, экстремальная частота обновления) я могу сказать, что это единственный действительно плавный дисплей, который я видел в стиле Windows с использованием двойного буфера (неважно, если бы я использовал стиль Windows или VCL). , виртуальный или невиртуальный режим). Поэтому в качестве обходного пути к вашей проблеме я предлагаю вам внедрить двойной буфер для стилей VCL (вы можете сделать это, переопределив хуки стилей), игнорируя приведенные выше комментарии, говорящие о чем-то плохом. о двойных буферах :-)   -  person TLama    schedule 23.09.2012
comment
@TLama Это правда, что двойная буферизация может уменьшить мерцание. Но в основном мерцание вызвано неаккуратной прорисовкой фона. Способ исправить это — устранить настоящую причину, а не замазывать трещины. Еще одна моя проблема с двойной буферизацией заключается в том, что она нарушает некоторые эффекты родной темы. Но я предполагаю, что это не имеет значения, как только вы начнете использовать стили VCL, так что давайте отложим это в сторону. И, конечно же, двойная буферизация — отстой для удаленного рабочего стола/сервера терминалов. Во всяком случае, это только моя точка зрения. Если ваши испытания показывают, что LVS_EX_DOUBLEBUFFER приносит пользу, восстановите свой ответ.   -  person David Heffernan    schedule 23.09.2012
comment
DoubleBuffered не всегда равно Not Flickering. Это, конечно, помогает уменьшить мерцание, но не устраняет его полностью. Мерцание может быть результатом многих других недостатков.   -  person Jerry Dodge    schedule 23.09.2012
comment
@TLama, ты имеешь в виду, что они исправили это в XE3? Кстати, я люблю DoubleBuffer :) Я не знаю, как использовать Style Hooks, но я нашел веб-сайт, я не уверен, что это он: theroadtodelphi.wordpress.com/2011/12/16/   -  person blacksun    schedule 23.09.2012
comment
Кстати, мерцание происходит только в затронутом подэлементе. Если я изменю Subitems[1], затронет только этот подэлемент   -  person blacksun    schedule 23.09.2012
comment
Не могу сравнить с XE2, но со стилями VCL каждое обновление жутко мерцает в XE3 с включенными стилями VCL (даже в виртуальном режиме). Единственной комбинацией, которая выглядела действительно гладкой, был (как вы упомянули) стиль Windows с DoubleBuffered установленным на True. Об авторе блога he's here и я уверен, что он уже работает над этим :-)   -  person TLama    schedule 23.09.2012
comment
Это УЖАСНАЯ проблема :) Ну, я также установил для HotTrackStyles значение htHandPoint (HotTrack ложно). Когда я двигаю мышкой, кажется, что муравьи работают :))   -  person blacksun    schedule 23.09.2012
comment
PS - Аналогичная проблема, я использую элемент управления TMemo с включенным DoubleBuffered, и я не использую стили VCL, но у меня все еще есть проблема с мерцанием. И это более легкий элемент управления, чем TListView.   -  person Jerry Dodge    schedule 23.09.2012
comment
Это все еще происходит в Delphi Seattle Update 1 :)   -  person hikari    schedule 25.09.2016


Ответы (1)


Кажется, работает предложение в конце этой темы:
https://forums.embarcadero.com/thread.jspa?messageID=849037

Просто удалите seClient из StyleElements и вручную настройте фон на цвет стиля.

person hikari    schedule 25.09.2016