Extended List View - pomysł...

dział ogólny

Extended List View - pomysł...

Nowy postprzez Slynx » poniedziałek, 11 lipca 2011, 23:09

Zatrzymałem się w pewnym momencie podczas pisania swojej klasy, extended list View. W skrócie jest to listView z możliwością dodawania obrazków i progressbarów i najważniejsze - elementów podrzędnych na liście, tj. mamy coś takiego jak np. W eksploratorze gdy rozwijamy strukturę katalogów. I z tym mam problem. Piszę, piszę i tak na prawdę nie wiem jak do tego powinienem podejść (kilkukrotnie przerabiam ten sam kod, bo żaden pomysł nie jest wystarczająco dobry). W czym dokładnie jest problem ? Każdy element nadrzędny na liście (parent) ma przypisane swoje elementy podrzędne (childs), więc:

Kod: Zaznacz cały
/\Parent (index 0)
- Child    (index 1)
- Child    (index 2)
- Child    (index 3)
/\Parent (index 4)
- Child    (index 5)
- Child    (index 6)


przy czym bazowe indexy mamy 2 (index 0 i index 4 - rodzice), tj. powinno wyglądać to tak
Kod: Zaznacz cały
/\Parent (index 0)
- Child    (index 0)
- Child    (index 1)
- Child    (index 2)
/\Parent (index 1)
- Child    (index 0)
- Child    (index 1)


Takie rozwiązanie chyba najlepiej wymagałoby użycia nowego typu obiektu (rodzic) oraz obiektów (dzieci) do nich przypisanych.

Ale to do czego sam doszedłem.
Problem mam z pobieranie i przydzielaniem indeksów, mieszają się i wychodzą bzdury. Jako pierwsze rozwiązanie dałem sobie dodatkową zmienną typu List ( klasa System::Collections::Generic), której każdy kolejny element odpowiadał indeksowi rodzica, oraz przechowywał wartość z funkcji GetHashCode() by potem odróżnić, które elementy należą do rodziców, a które do dzieci ( funkcja GetHashCode() zwracana unikatową wartość int). Jak wspomniałem, lista jest zwijana, czyli OnClick na rodzica to wszystkie dzieci powinny się schować (remove). Siłą rzeczy trzeba było tworzyć kopie wszystkich elementów, by można było je potem skądś przywrócić. I tu sobie odpuściłem, bo zacząłem wątpić w słuszność tego rozwiązania, zwłaszcza, że kod zaczął się dziwnie rozrastać, a problem wydaje się w sumie prosty.
To co robiłem miało jakiś sens ? Jak w ogóle rozwiązuje się takie problemy ? Przydałoby mi się rozwiązanie, jak coś takiego się pisze, bo po prostu nie mam pomysłu i marnuje czas na kod, który i tak potem nie ma sensu :/
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

Re: Extended List View - pomysł...

Nowy postprzez Cyfrowy Baron » wtorek, 12 lipca 2011, 09:50

Ja stworzyłbym macierz vector-ów. Wtedy główne indeksy (/\Parent (index 0)) byłyby macierzą elementów typu vector, a pod-indeksy (- Child (index 1)) byłyby elementami tej macierzy typu String. W ten sposób nie miałbym problemów z odwoływaniem się do głównych indeksów i do ich elementów.


KOD cpp:     UKRYJ  
typedef vector< String > element;
typedef vector< element > macierz;

 element E1;
 E1.push_back("index 0 - element 1");
 E1.push_back("index 0 - element 2");
 E1.push_back("index 0 - element 3");
 E1.push_back("index 0 - element 4");
 E1.push_back("index 0 - element 5");
 E1.push_back("index 0 - element 6");
 E1.push_back("index 0 - element 7");

 element E2;
 E2.push_back("index 1 - element 1");
 E2.push_back("index 1 - element 2");
 E2.push_back("index 1 - element 3");
 E2.push_back("index 1 - element 4");
 E2.push_back("index 1 - element 5");
 E2.push_back("index 1 - element 6");
 E2.push_back("index 1 - element 7");

 macierz Index;

 Index.push_back(E1);
 Index.push_back(E2);
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Extended List View - pomysł...

Nowy postprzez Slynx » wtorek, 12 lipca 2011, 13:47

To nie takie proste, indeksy elementów zmieniają się jeśli któryś rodzic zostanie "rozwinięty" na liście. Weźmy również pod uwagę to, że listView musi odbierać dane , czyli kliknięcia użytkownika. Więc trzeba namierzyć nowy indeks rodzica. Tak czy inaczej, za pomocą samych indeksów... no można by spróbować rejestrować każde "rozwinięcie" rodzica na liście i dodawać indeksy, czyli te dorzucone przez pojawione na liście dzieci... ale to zrobił by się straszny syf.
Chyba zrobiłem. Chyba, bo jeszcze nie jestem w 100 % pewien co do bezbłędności i elastyczności tego rozwiązania.. Jak ?
Przy dodawaniu nowego rodzica na listę pobieramy jego unikalny identyfikator (hashcode) znajdujący się w obiekcie klasy Childs i wrzucamy go na listę (System::Collections::Generic::List), gdzie numer numer na liście odpowiada jego indeksowi. W klasie Childs znajduje się lista wszystkich dzieci danego rodzica + informacja o tym czy element został rozwinięty na liście.
Całość identyfikuje na podstawie wartości funkcji GetHashCode(), ustalając czy kliknięty element jest rodzicem (jest elementem listy) i czy jest rozwinięty (obiekt Boolean). To tak w dużym skrócie. Teraz, pisząc to, jeszcze zauważyłem, że problem będzie przy dodaniu nowego elementu na listę jeśli jakiś rodzic na liście jest rozwinięty (wtedy doda niepoprawny indeks), ale zaraz spróbuje coś z tym zrobić.

Anyway,
jakieś 5 minut temu dowiedziałem się, że dostałem się na studia w Toruniu :D
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


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

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 24 gości

cron