Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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]

А.С. Пушкин


 
DVM ©   (2010-07-31 11:49) [41]


> kukuikar ©   (31.07.10 09:58) [38]


> я не добавляю в цикле строки, а назначаю последней строчке
> новое значение на каждом шаге цикла

Я примерно понял что у тебя делается, напрное много-много строчек это уже обработанные файлы, да? А в последней строчке текущий обрабатываемый файл и там рядом с его именем типа процента выполнения, угадал?

Если так, то дам простой совет: не обновляй ListBox на каждой итерации цикла, обновляй через 1000 итераций или как то еще, смысла в очень частом обновлении да таком что листбокс перерисовываться не успевает и мерцает нет.

Короче то что я написал выше + двойная буфферизация и еще в идеале виртуальный режим полностью решат твою проблему.


 
kukuikar ©   (2010-07-31 12:37) [42]


> DVM ©   (31.07.10 11:49) [41]

понял, спасибо большое. буду копать дальше сам.


 
Плохиш ©   (2010-07-31 13:57) [43]

Achtung, Partizanen. Feuer!!!


 
kukuikar ©   (2010-07-31 15:45) [44]

уже можно успокоиться


 
Vladimir ©   (2010-08-01 21:33) [45]

Удалено модератором
Примечание: Задай свой вопрос в отдельной ветке


 
KilkennyCat ©   (2010-08-01 21:43) [46]

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



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

Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.003 c
6-1227811974
stas
2008-11-27 21:52
2010.10.24
Проверить наличие коннекта к определенному IP


11-1225839176
Jon
2008-11-05 01:52
2010.10.24
ANSI <-> WIDE


2-1280406895
И. Павел
2010-07-29 16:34
2010.10.24
Критическая ошибка при выполнении групповой политики


6-1227962984
dmitry_12_08_73
2008-11-29 15:49
2010.10.24
Выбор способа передачи данных с помощью протокола HTTP


15-1279538234
Kerk
2010-07-19 15:17
2010.10.24
WinXP &amp; keyboard layout





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский