Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Мерцание TListBox [D7, XP]


Страницы:   1 2 3

kukuikar ©   (2010-07-30 14:32:00) 

Здравствуйте, мастера.
Есть длинный цикл

for i := 0 to 300000 do
 begin
 ...
 ...
 ListBox1.Items[ListBox1.Items.Count - 1] := 'la-la-la - ' + IntToStr(i + 1);
 end;


Можно ли уменьшить или вообще убрать мерцание ListBox?


Плохиш   (2010-07-30 18:11:00) [21]

Удалено модератором


Palladin   (2010-07-30 18:11:00) [22]

Удалено модератором


Leonid Troyanovsky   (2010-07-30 18:09:00) [23]

Удалено модератором


Leonid Troyanovsky   (2010-07-30 18:06:00) [24]


> DVM ©   (30.07.10 17:58) [21]

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

Хранят обычно в БД, бо программисту заподло пополнять оные списки,
а юзер, ввёдший более 10 элементов, искренне за них переживает.

--
Regards, LVT.


Amoeba_   (2010-07-30 18:02:00) [25]


> 1) Так ли уж надо иметь в ListBox такое большое число элементов.
>  В них же неудобно ориентироваться будет.

И не только неудобно, а просто невозможно.


DVM   (2010-07-30 17:58:00) [26]


> kukuikar ©   (30.07.10 17:05) [15]


> отвечая на свой вопрос скажу так:
> никак
>
>

Ну выход есть вообще то. Но стоит хорошо подумать над следующими вещами:
1) Так ли уж надо иметь в ListBox такое большое число элементов. В них же неудобно ориентироваться будет.
2) Так ли необходимо элементы хранить именно в самом визуальном компоненте? У многих визуальных компонентов-списков есть виртуальный режим, когда данные в них самих не хранятся, а хранятся в сторонних списках, органихация которых может быть много эффективнее чем у визуальных компонентов, визуальные же компоненты просто выполняют отрисовку в своих раницах видимых в данный момент элементов списка, каждый раз запрашивая значения из внешних списков.

Во внешний список можно добавлять элементы и в фоновом режиме и во вторичном потоке например, а потом одной строкой прикреплять его к визуальному компоненту списка и получим мгновенное как бы отображение.
Решения есть.


Leonid Troyanovsky   (2010-07-30 17:55:00) [27]

Удалено модератором


Плохиш   (2010-07-30 17:43:00) [28]

Удалено модератором


Leonid Troyanovsky   (2010-07-30 17:36:00) [29]

Удалено модератором


Leonid Troyanovsky   (2010-07-30 17:34:00) [30]

Удалено модератором


Плохиш   (2010-07-30 17:19:00) [31]

Я вылечил своё воспаление.


kukuikar   (2010-07-30 17:05:00) [32]


> DVM ©   (30.07.10 16:12) [12]

понятно, спасибо. отвечая на свой вопрос скажу так:
никак


Leonid Troyanovsky   (2010-07-30 17:04:00) [33]


> sniknik ©   (30.07.10 16:14) [13]

> убрать BeginUpdate/EndUpdate,

ListBox1 тоже убрать.

--
Regards, LVT.


sniknik   (2010-07-30 16:14:00) [34]

kukuikar ©   (30.07.10 14:53) [7]
> ListBox1.Items.BeginUpdate;
> for i := 0 to 300000 do
> begin
> ...
> ...
> ListBox1.Items[ListBox1.Items.Count - 1] := 'la-la-la - ' + IntToStr(i + 1);
> end;
> ListBox1.Items.EndUpdate;

убрать BeginUpdate/EndUpdate, убрать цикл и в выделенной строчке поменять i на 300000.


DVM   (2010-07-30 16:12:00) [35]


> kukuikar ©   (30.07.10 16:01) [11]


> вообщем если бегинапдейт перед циклом, то обновления вообще
> не происходит

Суть BeginUpdate в том чтобы ListBox линий раз не перерисовывался и не дергал свои механизмы в процессе добавления множества элементов. Самом собой пока идет процесс добавления он не будет перерисовываться. Если надо чтобы перерисовывалось - убери BeginUpdate. Но тогда  замедлится добавление и при постоянной перерисовке будет мерцание.


kukuikar   (2010-07-30 16:01:00) [36]

вообщем если бегинапдейт перед циклом, то обновления вообще не происходит, а если в теле цикла, то все равно мерцает.


DVM   (2010-07-30 15:49:00) [37]


> kukuikar ©   (30.07.10 14:53) [7]


> не работает

Что значит не работает?


Юрий Зотов   (2010-07-30 15:03:00) [38]

> kukuikar ©

Стандартная схема такая:  

BeginUpdate;
try
 ... // любые операции по обновлению, хоть в цикле, хоть без него
finally
 EndUpdate;
end;


Плохиш   (2010-07-30 14:54:00) [39]


> Palladin ©   (30.07.10 14:49) [6]

У меня воспаление доброты :-P


kukuikar   (2010-07-30 14:53:00) [40]


ListBox1.Items.BeginUpdate;
for i := 0 to 300000 do
begin
...
...
ListBox1.Items[ListBox1.Items.Count - 1] := 'la-la-la - ' + IntToStr(i + 1);
end;
ListBox1.Items.EndUpdate;


не работает


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо