Wątek zablokowany 2012-06-08 12:24 przez ŁF.

przyspieszanie listboxa...

0

Witam
mam do dodania do listboxa pare tysiecy linii,
niestety kazda musze dodac osobno a jak wiadomo dodanie linii
laczy sie z przepisaniem calej listy w nowe miejsce w pamieci:/
no wiec po pewnym czasie dodanie jednej linii trwa bardzo dlugo...

ma ktos moze pomysl jak ustawic na poczatku pozadany rozmiar listboxa?
tak aby nie bylo potrzeby przepisywania go.

pozdrawiam

0

Dopisz przed rozpoczeciem wypelniana linie:

ListBox1.Items.BeginUpdate

a po zakonczeniu dodawania nowych lini:

ListBox1.Items.EndUpdate
0

Możesz skorzystać z TStringList (jest o wiele bardziej szybszy).

Wykorzystanie:

var Lista : TStringList;
begin
 Lista : TStringList.Create; // tworzysz Listę 
 //...
 Lista.Add(//dodajesz...);
 //... 
 Lista.Free; // usuwasz z pamięci
end;

//na koniec dodawania mozna zrobic
ListBox1.Items := Lista;
i w listboxie bedzie to co w pamieci - pedros

0

zgadzam sie ze obie te metody przyspieszaja prace z listboxem/lista
ale
niestety zadna z tych metod nie pozwala ominac problemu z przepisywaniem calosci przy dodawaniu kolejnych linii...

jest to dla mnie spory poblem gdyz cala ta operacja zajmuje PONAD MINUTE!

0

Mnie się wydaje że Twoje (Wasze) podejscie nie zlikwiduje problemu z prostej przyczyny. Mianowicie obiekty wizualne musza działać wolniej przy dużej liczbie itemów (nie tylko listbox). Dlatego lepiej w sytuacji kiedy chcemy operować dużą liczbą danych (kilka(set) tysięcy) trzymać je na zewnatrz a listobowi podawac tylko kilka ,te , które maja byc widoczne. W tej sytuacji trzeba zrezygnowac ze scrollbara w listboxie i uzyc odrębnego (dostepnego w delphi) oprogramowując jego zdarzenia w których będzie następowało przepisywanie listy. Robiłem kiedys takie cos trzymajac dane na dysku i z dysku przepisujac po 30-50 w zaleznosci od wielkosci okna i dzialało to calkiem niezle nawet dla miliona itemow. Oczywiscie w przypadku az miliona itemow trudno o precyzję przy scrollowaniu ale to juz odrebny problem:-)

0
Opi napisał(a)

ListBox1.Items := Lista;

a fe :) a od czego jest Assign
ListBox.Items.Assign(Lista);

0
Misiekd napisał(a)
Opi napisał(a)

ListBox1.Items := Lista;

a fe :) a od czego jest Assign
ListBox.Items.Assign(Lista);

To nie moje, to Pedros dopisał :D

0
Opi napisał(a)
Misiekd napisał(a)
Opi napisał(a)

ListBox1.Items := Lista;

a fe :) a od czego jest Assign
ListBox.Items.Assign(Lista);

To nie moje, to Pedros dopisał :D

fakt :D
Pedros brutalu :P

0
Misiekd napisał(a):
Opi napisał(a)

ListBox1.Items := Lista;

a fe :) a od czego jest Assign
ListBox.Items.Assign(Lista);

Mam teraz taki sam problem i niestety Assign także w połączeniu z BeginUpdate zbytnio nie przyśpiesza. 800 000 wpisów ładuje sięi bardzo wolno do lsitboxa :(

0
anonimowy napisał(a):
Misiekd napisał(a):
Opi napisał(a)

ListBox1.Items := Lista;

a fe :) a od czego jest Assign
ListBox.Items.Assign(Lista);

Mam teraz taki sam problem i niestety Assign także w połączeniu z BeginUpdate zbytnio nie przyśpiesza. 800 000 wpisów ładuje sięi bardzo wolno do lsitboxa :(

Archeologu, ten temat ma 7 lat, zrób nowy i wytłumacz o co chodzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1