ExtendedListView i indeksy

dział ogólny

ExtendedListView i indeksy

Nowy postprzez Slynx » poniedziałek, 5 września 2011, 21:01

Wracam do tematu, który zacząłem kiedyś. Dotyczy ExtendedListView, czyli ListView z większymi możliwościami (progressbary, obrazki, itp). Doszedłem do ciekawego momentu. Jak wcześniej wspomniałem, miałem problem z układaniem indeksów i sposobem przechowywania ich dla parent-childs.
Tak konkretniej, przedstawię problem do którego rozwiązania dążę.

KOD cpp:     UKRYJ  
int temp = this->extObject->Table_access->SelectedItems[0]->GetHashCode();

int temp2 = this->extObject->FindParent(temp);
if (temp2 != -1)
{
        for each (THashCode^ hash in SL::main_table)
        {
                if (hash->listViewIndex->Key == temp2)
                {
                        for each(Row^ row in this->extObject->GetChilds(temp2))
                        {
                                if (row->GetHashCode() == temp)
                                {
                                        MessageBox::Show(this->extObject->GetChilds(temp2)->IndexOf(row).ToString());
                                }
                        }
                }
        }
}
 

Już tłumaczę.
Do identyfikacji danego elementu na liście używam wygenerowanego haszkodu. Wszystkie elementy (rodzice) są trzymani w słowniku, gdzie kluczem jest jego haszkod, a wartością obiekt klasy Childs, który zawiera listę dzieci rodzica.
Z drugiej strony, innej metody aktualnie nie znalazłem. Mam na myśli to, że informacje, które są w wierszu danego elementu nie pozwalają na jednoznaczną jego identyfikację w zbiorze. Tak więc jedynym pomysłem było wygenerowanie haszkodu dla całego wiersza (obiekt klasy Row).

Dalej, funkcja FindParent zwraca haszkod rodzica dla dziecka podanego w argumencie (opcji gdy go nie ma aktualnie nie rozpatrujemy).
Następnie oprócz samego elementu na liście musimy znaleźć w bazie pełen obiekt (THashcode). Następuje porównanie po kluczu (haszkodzie).
Funkcja GetChilds zwraca wszystkie dzieci rodzica, którego haszkod został podany jako argument. Zwracana jest tablica elmentów typu Row (czyli zwykły wiersz).
Na końcu iteracja przez całą tablicę Row (czyli dzieci), by ostatecznie znaleźć indeks.
Indeks nie jest indeksem na liście, a indeksem w zbiorze dzieci danego rodzica. Jest niezbędny do dalszego "działania".

Problem ? Wydajność, zagmatwanie i bardzo pożądane ułatwienie.
Co do wydajności - problemów nie było, wszystko działa idealnie, żadnego "przycieńcia", czy coś. Jednak nawet nie o to chodzi. Chciałbym, żeby to było zrobione po prostu dobrze, a to co tutaj napisałem mnie przeraża. Nie ma chyba innego sposobu by odnaleźć indeks weryfikując jednocześnie czy element jest dzieckiem czy rodzicem, dlatego, błąd może jest w samym składowaniu ? W jakiś inny sposób przechowywać indeksy dzieci / rodziców, by szybciej i prościej można było odnaleźć dany element.
Chyba takim głównym problemem tego jest fakt, że trzeba odnajdywać dany element w pewnym zbiorze, który jest zaledwie częścią prawdziwego obiektu (THashcode).
Trzeba zidentyfikować, którym przyciskiem myszy użytkownik nacisnął, czy był to rodzic czy dziecko (tym samym zdecydować, które menu kontekstowe wyświetlić), odnaleźć indeks danego elementu w zbiorze ogólnym i zwrócić tenże obiekt lub jego część.

Proszę o jakąś sensowną opinię, bo nie za bardzo wiem, co z tym zrobić.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 7 gości