Patryk27 napisał(a)
Problem jest w tym, że aktualizacja tego komponentu wymaga jego całkowitego wyczyszczenia i tworzenia wszystkich node-ów na nowo, przez co po aktualizacji całe TTreeView jest całkowicie zwinięte, podczas gdy ja chciałbym, aby pozostało w takim stanie, jakim było przedtem.
Na pewno musisz kasować i tworzyć na nowo całe drzewo? To nie jest rozwiązanie, bo przy dużej ilości aktualizacja drzewa będzie trwała długo...
To co podał @ergo jest oczywiście rozwiązaniem, bo możesz zapisać stan gałęzi w jakiejś pomocniczej zmiennej/obiekcie, ale zwróć uwagę, że jeśli zapiszesz taki stan to po stworzeniu nowego drzewa i tak musisz sprawdzić które gałęzie i wartości są nowe, a które nie i te, które były przed aktualizacją odpowiednio zwinąć/rozwinąć;
Skoro i tak będziesz musiał sprawdzić co jest nowe a co nie, to równie dobrze możesz drzewo wyposażyć jedynie w nowe elementy, a stare pozostawić takie, jakimi były; Na pewno istnieje lepsze rozwiązanie i na pewno jest stosowane w innych IDE, więc trzeba takie coś wymyślić i zaimplementować - takie rozwiązanie będzie na pewno efektywniejsze i efektowniejsze; Jedynym minusem będzie prawdopodobnie większa ilość kodu do napisania, choć niekoniecznie;
Niestety nie wiem dokładnie jak wygląda obecny kod realizujący aktualizację drzewa, więc traktuj mój post jako teoretyczne rozważania;
Patryk27 napisał(a)
Edit: mógłbym co prawda aktualizować tylko te node-y, które uległy zmianie, lecz byłoby to nieco wolne w momencie, kiedy byłoby ich naprawdę sporo...
Na pewno? Według mnie wolniejsze będzie tworzenie całego nowego drzewa i rozwijanie wybranych gałęzi, niż aktualizacja pojedynczych elementów; Zwróć uwagę na to, że potrzebujesz tylko dodać kilka elementów, więc przy wspomnianych przez @marogo BeginUpdate
i EndUpdate
drzewo zaktualizuje się szybko, a przemalowanie go nastąpi tylko raz (bo przecież te metody do tego służą), stąd powinieneś zyskać na szybkości.