Filtrowanie StringGrida z kilkoma warunkami

0

Witam, mam następujący problem:
Mam stringgrida w którym przechowuję dane plików. Każdy plik ma opcję 'Status' i trzy możliwe statusy: Nowy, Zaakceptowany i Odrzucony. Do tego mam 3 checkboxy które mają sterować wyświetlaną zawartością wg statusu (checkbox1-Nowy itd.). Trudność polega na tym, że można wybrać kilka opcji naraz.
Próbowałem to załatwić pętlą if w taki sposób, że najpierw sprawdzam czy checkbox1.ischecked=true a potem przelatywało całą kolumnę i sprawdzało czy wartość komórki=warunek1 - jeśli nie to sprawdzało czy checkbox2=true i czy spełnia warunek2 itd. Jeśli nie spełni żadnych warunków to ukrywam wiersz. Ale ta metoda prowadzi donikąd, bo w efekcie mam gigantyczną wolno działającą pętlę. Tym większą im więcej warunków.
Da się to jakoś inaczej rozwiązać?

1

zrób sobie zbiór stanów
Zbiory
i sobie sprawdzaj in state...

3
maniutek20 napisał(a)

Mam stringgrida w którym przechowuję dane plików.

I to jest główny problem, bo komponenty nie służą do przechowania danych, a do ich wyświetlania; Dlatego też wszelkie modyfikacje są powolne, bo wiążą się z aktualizowaniem interfejsu; Odczyt też nie jest jakiś szczególnie szybki, z racji wewnętrznych warunków itd. w kodzie komponentu; Dane trzymaj poza komponentem, a w nim wyświetlaj to co użytkownik powinien widzieć;

Każdy plik ma opcję 'Status' i trzy możliwe statusy: Nowy, Zaakceptowany i Odrzucony.

Zadeklaruj sobie typ wyliczeniowy, zawierający wartości stanów, np.:

type
  TFileState = (fsNew, fsAccepted, fsRejected);

oraz typ zbioru enumów:

type
  TFileStates = set of TFileState;

Teraz aby dodać wartość do zmiennej ze zbiorem, można użyć procedury Include, a żeby usunąć ze zbioru - Exclude; Aby sprawdzić, czy dana wartość znajduje się w zbiorze, można użyć operatora In, tak jak podał poprzednik;

[...] Da się to jakoś inaczej rozwiązać?

Najpierw pokaż swój kod, bo z opisu dość mało wynika - wtedy będzie można coś pomyśleć.

0
for i := 0 to sg.RowCount - 1 do
  if (chk1.checked and (sg.cells[i, 1] = '1')) or (chk2.checked and (sg.cells[i, 2] = '2')) or (chk3.checked and (sg.cells[i, 3] = '3')) then
    sg.Rows[i].Height := 16
  else 
    sg.Rows[i].Height := 0;

jedną pętlą. Ale i tak dużo lepszy rezultat uzyskasz przy użyciu VirtualStringTree.

0

Problem rozwiązałem tak:
Po pierwsze źle zorganizowałem program, bo faktycznie komponenty nie służą do przechowania danych. Ta jednozdaniowa porada jest warta każde pieniądze:) W związku z powyższym utworzyłem lokalną bazę SQLite i zacząłem w niej zapisywać dane (wyszukuję pliki na dysku, po czym dodaje ich dane do bazy). Samo sortowanie zamieniło się w bajkę, a to dzięki możliwości konstrukcji zapytania w dowolny sposób (nie znam za bardzo SQL, ale znalazłem w necie pracę magisterską pewnego jegomościa nt. SQLite i po 2 godzinach lektury tworzę zapytania jak czarodziej). Więcej: po ponownym uruchomieniu nie muszę przeszukiwać dysku żeby znaleźć pliki, tylko wczytuję sobie wszystko z bazy - same zalety. Sorry za zawracanie gitary, ale czasami tak się zamotam, że sam sobie tworzę problemy :)

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