Главная страница
    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]

А.С. Пушкин



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

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

Наверх





Память: 0.54 MB
Время: 0.003 c
2-1280431419
MAXHO
2010-07-29 23:23
2010.10.24
Как вравнить дату ?


3-1247050667
Mamed1971
2009-07-08 14:57
2010.10.24
SQL server Replication


3-1246622240
amir
2009-07-03 15:57
2010.10.24
ширина колонок в DBGrid


15-1279139379
Юрий
2010-07-15 00:29
2010.10.24
С днем рождения ! 15 июля 2010 четверг


2-1280118410
linuxoid
2010-07-26 08:26
2010.10.24
как правильнее составить цикл?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский