Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];
ВнизМерцание 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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.003 c