Jedno ListView i kilka Listitems

0

Witam kolegów.
Zatrzymałem się ostatnio nad niby błahym problemem.

Otóż w konfiguracji (pod postacią string) trzymam listę składników które chcę wyświetlić w ListView.
Problem polega na tym że w jednym stringu trzymam konfigurację dla 4 kolumn.
Wygląda to tak:

str := 'aa1,aa2,aa3,aa4; bb1,bb2; cc1; dd1';

składniki są oddzielone przecinkami, a poszczególne kolumny średnikami

Na formie mam 1 ListView, i naciskając buttony od 1 do 4 chciałbym wyświetlać konfigurację dla danej kolumny.

Wydawało mi się że zrobię to tak:
str1,str2,str3,str4 : TListItems;

{w onCreate}
str1 := TListItems.Create(ListView1);
str2 := TListItems.Create(ListView1);
str3 := TListItems.Create(ListView1);
str4 := TListItems.Create(ListView1);
ListView1.Items := str1;

procedure TForm1.sbtnKol1Click(Sender: TObject);
begin
ListView1.Items := str1;
end;

procedure TForm1.sbtnKol2Click(Sender: TObject);
begin
ListView1.Items := str2;
end;

i tak dalej


ale niestety to nie działa, tak jak należy. Po wczytaniu listy do ListView wyświetla się kofiguracja dla 1 kolumnu, al;e po naciśnięciu 2 buttona i następnie 1 buttona lista jest wyczyszczona. 

Czy możecie podpowiedzieć jak to zrobić ?, ewentualnie gdzie robię błąd ?
0

Widzę że nie ma odzewu , więc może doprecyzuję o co mi chodzi. :(

Chodzi mi oto aby w prosty sposób przełączać się pomiędzy np. kilkoma ListItems i wyświetlać za pomocą jednego ListView.

Chyba że macie jakiś prostszy sposób.

Oczywiście mogę trzymać zmienne w 4 odrębnych stringach i za każdym razem przepisywać to w pętli do listview, ale szukam prostszego sposobu.

Będę wdzięczny za każdą podpowiedź

0

wydaje mi sie, ze to wina tego co podajesz w konstruktorze jako Owner:

  str1 := TListItems.Create(ListView1);
  str2 := TListItems.Create(ListView1);
  str3 := TListItems.Create(ListView1);
  str4 := TListItems.Create(ListView1);

juz na tym etapie itemy sa przypisywane do konkretnego ListView.
nawet jesli potem zmieniasz:

ListView1.Items:=str2;

to i tak reszta "str*" jest wciaz przypisana do ListView1 (bo to jest ich Owner).
proste doswiadczenie: stworz str* tak jak wyzej i wypelnij danymi ale nie przypisuj nic do listview1.items - zobaczysz, ze mimo braku takiego przypisania, i tak listview wypelni sie wartosciami - ze wszystkich "str*".
niestety Owner jest tylko do odczytu wiec go nie zmienisz.
ja bym sobie dal spokoj z tym rozwiazaniem, choc moge sie mylic.
chyba najlepiej trzymac dane gdzis w tablicy a potem dynamicznie czyscic listview i dodawac po kolei itemy. przyspieszyc tylko przez beginUpdate i endUpdate.

0

Faktycznie. Przypisanie danych bezpośrednio do str zamiast do listview działa.
tylko nie odświeża szę po dodaniu a dopiero po ponownym przypisaniu. :(
Ehhh. Myślałem że da się to jakoś przeskoczyć.

Dzięki za radę.

0

W końcu zdecydowałem się na rozwiązanie takie:
Umieściłem 4 ListView na 4 tabSheet-ach w PageControl
i pod zmienną globalną typu TListView na formularzu przypisuję odpowiednie listview z tabsheeta, przełączając odpowiedni tabsheet na activ.

Może nie jest to zbyt eleganckie ale działa.

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