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());
}
}
}
}
}
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ć.