![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мерцание TListBox [D7, XP]
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;
не работает