BCB odswiezanie listy- czemu to tak powoli dziala?

0

Ostatnio dodalem do mojego odtwarzacza (www.SuperPlayer.prv.pl) funkcje wyszukiwania na liscie - dziala dokladnie tak samo jak "Skocz do pliku" w winampie.

Problem w tym, ze po dodaniu duzej ilosci plikow to nie ma sensu, bo lista musi byc odswiezana po kazdym wcisnieciu klawisza. A przy duzej ilosci plikow usuniecie kilku elementow z listy trwa nawet ponad sekunde! (tak bylo u mnie jak dodalem okolo 6000 plików).

Jestem w kropce i nie wiem co zrobic - a wiem ze nie musi tak byc bo w Winampie dziala to bardzo szybko nawet dla kilku tysiecy elementow.

Moze ktos mi cos podpowie?

0

Jeśli mowa o TListView to poczytaj o TListView::OwnerData i TListView::Count.

0

Jeśli mowa o TListView to poczytaj o TListView::OwnerData i TListView::Count.

Mowa o zwyklej liscie czyli TListBox. Chodzi o to ze jak jest bardzo duzo elementow na liscie to wszystko bardzo powoli dziala - a nie powinno. Jezeli komus by sie chcialo, to mozna sciagnac moj program i sprawdzic - wyszukiwanie na liscie klawiszem S.

Poza tym nie wiem co miales na mysli .... poczytaj o ... TListView::Count to ilosc elementow ... no i co w zwiazku z tym ?

Czyzby to kwestia wydajnosci aplikacji pisanych w BCB ? Sprobuje jeszcze zrobic ta liste w czystym API nie uzywajac TListBox ale nie wydaje mi sie ze to moze pomoc.. gdyby ktos mial jakis pomysl to bede wdzieczny za odpowiedz.</quote>

0
othello napisał(a)

Mowa o zwyklej liscie czyli TListBox

Takie rzeczy trzeba od razu pisać ;)

othello napisał(a)

Poza tym nie wiem co miales na mysli .... poczytaj o ... TListView::Count to ilosc elementow ... no i co w zwiazku z tym ?

Zgadza się, tyle że przy odczytywaniu. W przypadku gdy TListView::OwnerData ustawisz na true to przy pomocy TListView::Count możesz ustawić ilość wirtualnych elementów. Oczywiście używanie TListView w trybie wirtualnym jest nieco bardziej złożone - zewnętrzna lista z elementami, zaimplementowanie TListView::OnData i TListView::OnDataHint. Miałem podobny problem jak pisałem kontrolkę TFolderView - wyświetlenie paru tysięcy plików trwało pare sekund :-/. Teraz śmiga prawie jak oryginał (explorator windowsa) ;).

Sprobuje jeszcze zrobic ta liste w czystym API nie uzywajac TListBox ale nie wydaje mi sie ze to moze pomoc..

Troche przyśpieszy ale bez rewelacji.

gdyby ktos mial jakis pomysl to bede wdzieczny za odpowiedz.

Napisz własną kontrolkę ;).

0

Hmm czy chodzi ci o styl Virtual albo VirtualOwnerDraw ? Teraz pisze z pamieci wiec moglem co pokrecic ale jezeli to o to chodzilo to TListBox tez ma cos takiego. Nie wiedzialem o co ci chodzi bo nigdy tego nie uzywalem.
Wiec to jest sposob na przyspieszenie odswiezania listy?

Hm a co do napisania wlasnej kontrolki ... jak wszystko inne zawiedzie to pewnie tak zrobie :) Jak juz inaczej sie nie uda ale to ostatecznosc :)

0
othello napisał(a)

Hmm czy chodzi ci o styl Virtual albo VirtualOwnerDraw

Hmm.... u mnie czegoś takiego nie ma (BCB 5), ewentualnie lbOwnerDrawFixed, lbOwnerDrawVariable. Nie sądze żeby to coś dało bo w przypadku tych dwóch styli chodzi o to, żeby aplikacja miała wpływ na to jak ma być rysowany element w TListBoxie - kolor, tekst etc.

Hm a co do napisania wlasnej kontrolki ... jak wszystko inne zawiedzie to pewnie tak zrobie

I słusznie ;). Troche będzie z tym zabawy ale osiągniesz pożądany efekt ;).

0

Hmm w BCB6 jest jeszcze lbVirtual i lbVirtualOwnerDraw. Wiec bede potrzebowac lbVirtualOwnerDraw do listy odtwarzania i lbVirtual do listy w wyszukiwaniu plików.

Tylko nie bardzo wiem jak zaprogramowac OnData i OnDataFind :| W helpie nie znalazlem przykladow. Mozesz mi troche przyblizyc jak ty to robiles...? W ListBox bedzie na pewno podobnie.

0
othello napisał(a)

Tylko nie bardzo wiem jak zaprogramowac OnData i OnDataFind W helpie nie znalazlem przykladow. Mozesz mi troche przyblizyc jak ty to robiles...? W ListBox bedzie na pewno podobnie.

Dobra. Napisze w skrócie jak to zrobiłem w TListView.

Najpierw OnDataHint. To zdarzenie wywoływane jest przed zdarzeniem OnData i zawiera informacje o zakresie elementów jakie będą rysowane. Początek i koniec tego zakresu zapisuje do zmiennych globalnych g_start_index i g_end_index.

void __fastcall SomeObject::OnDataHint(System::TObject* Sender, int StartIndex, int EndIndex)
{
  g_start_index=StartIndex;
  g_end_index=EndIndex;
}

No i tyle z OnDataHint ;). Teraz OnData. Wywoływane jest tuż przed rysowaniem elementu. Tutaj ustawiasz wszystkie właściwości elementu o indeksie Item->Index. Oczywiście, przypisane danemu elementowi właściwości nie są trwałe - potrzebne są tylko na czas rysowania elementu w oknie. Dlatego też, o listę zawierającą elementy musi zadbać aplikacja.

void __fastcall SomeObject::OnData(System::TObject* Sender, TListItem* Item)
{
   if(Item->Index<g_start_index||Item->Index>g_end_index)return;
   
   /* tu ustawiasz właściwości elementu TListItem z zewnętrznej listy */
   Item->Caption=........;
   Item->ImageIndex=.......;
   ....
   ....
}

Co do OnDataFind to nie wiem ale nie powinno być problemu - cała sztuczka polega na tym, że w trybie wirtualnym operujesz na zewnętrznej liście. Więc takie operacje jak dodawanie, usuwanie, sortowanie i wyszukiwanie elementów wykonujesz bez udziału kontrolki.

0

Ok, mysle ze teraz juz sobie poradze, dzieki. [browar]

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