Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.24;
Скачать: CL | DM;

Вниз

Мерцание TListBox   Найти похожие ветки 

 
kukuikar ©   (2010-07-30 14:32) [0]

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

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


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


 
Плохиш ©   (2010-07-30 14:34) [1]

BeginUpdate/EndUpdate.


 
kukuikar ©   (2010-07-30 14:41) [2]

в теле цикла или до цикла?


 
Palladin ©   (2010-07-30 14:45) [3]

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


 
Amoeba_   (2010-07-30 14:46) [4]


> kukuikar ©   (30.07.10 14:41) [2]
>
> в теле цикла или до цикла?

Разумеется, никак не в теле цикла.

BeginUpdate - перед циклом
EndUpdate - после цикла


 
Плохиш ©   (2010-07-30 14:46) [5]


> в теле конечно

Вообще-то цикл между ними надо делать.


 
Palladin ©   (2010-07-30 14:49) [6]

у тебя детектор сарказма сломался? )


 
kukuikar ©   (2010-07-30 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;


не работает


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


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

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


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

> kukuikar ©

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

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


 
DVM ©   (2010-07-30 15:49) [10]


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


> не работает

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


 
kukuikar ©   (2010-07-30 16:01) [11]

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


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


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


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

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


 
sniknik ©   (2010-07-30 16:14) [13]

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.


 
Leonid Troyanovsky ©   (2010-07-30 17:04) [14]


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

> убрать BeginUpdate/EndUpdate,

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

--
Regards, LVT.


 
kukuikar ©   (2010-07-30 17:05) [15]


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

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


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

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


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

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


 
Leonid Troyanovsky ©   (2010-07-30 17:36) [18]

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


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

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


 
Leonid Troyanovsky ©   (2010-07-30 17:55) [20]

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


 
DVM ©   (2010-07-30 17:58) [21]


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


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

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

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


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


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

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


 
Leonid Troyanovsky ©   (2010-07-30 18:06) [23]


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

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

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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2010-07-30 18:09) [24]

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


 
Palladin ©   (2010-07-30 18:11) [25]

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


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

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


 
Palladin ©   (2010-07-30 18:13) [27]

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


 
Palladin ©   (2010-07-30 18:16) [28]

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


 
Leonid Troyanovsky ©   (2010-07-30 18:17) [29]

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


 
Leonid Troyanovsky ©   (2010-07-30 18:20) [30]


> Palladin ©   (30.07.10 18:16) [28]

> о... второй раз это не я...

Бывает.
А DVM никто не преследовал, IMHO, токмо развили мысль
о хранилище данных.

--
Regards, LVT.


 
KilkennyCat ©   (2010-07-30 21:19) [31]

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


 
KilkennyCat ©   (2010-07-30 21:20) [32]

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


 
KilkennyCat ©   (2010-07-30 22:12) [33]


> Amoeba_   (30.07.10 18:02) [22]
>
>
> > 1) Так ли уж надо иметь в ListBox такое большое число
> элементов.
> >  В них же неудобно ориентироваться будет.
>
> И не только неудобно, а просто невозможно.

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


 
Smile   (2010-07-31 00:21) [34]

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


 
Германн ©   (2010-07-31 01:55) [35]

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


 
Германн ©   (2010-07-31 03:12) [36]

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


 
_Юрий   (2010-07-31 09:37) [37]

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


 
kukuikar ©   (2010-07-31 09:58) [38]


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

дело в том что не будет в листбоксе 300000 строк.
в данном случае листбокс отображает прогресс выполнения парсинга файла, собственно говоря я не добавляю в цикле строки, а назначаю последней строчке новое значение на каждом шаге цикла:
ListBox1.Items[ListBox1.Items.Count - 1] := "la-la-la - " + IntToStr(i + 1);


 
Игорь Шевченко ©   (2010-07-31 10:13) [39]


> в данном случае листбокс отображает прогресс выполнения
> парсинга файла


О сколько нам открытий чудных
Готовят просвещенья дух.
И опыт, сын ошибок трудных,
И гений, парадоксов друг.


 
kukuikar ©   (2010-07-31 10:42) [40]


> Игорь Шевченко ©   (31.07.10 10:13) [39]

А.С. Пушкин



Страницы: 1 2 вся ветка

Текущий архив: 2010.10.24;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.008 c
2-1280306017
Jimmy
2010-07-28 12:33
2010.10.24
ComboBox


2-1280316293
Danz1
2010-07-28 15:24
2010.10.24
СУБД в доп.потоке


15-1279626101
Demo
2010-07-20 15:41
2010.10.24
Поиск по ключевым словам


15-1279534576
azlk
2010-07-19 14:16
2010.10.24
установка неизвестного устройства


15-1279609592
abun
2010-07-20 11:06
2010.10.24
Кто-нибудь работал из Delphi с Autocad?