Filtrowanie StringGrida z kilkoma warunkami

Odpowiedz Nowy wątek
2014-12-13 18:31
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ć?


quidquid Latine dictum sit, altum videtur

Pozostało 580 znaków

2014-12-13 18:52
1

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


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

2014-12-13 21:46
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ć.


edytowany 2x, ostatnio: furious programming, 2014-12-13 21:48
VirtualStringTree jest pieruńsko szybkie w te klocki :) - abrakadaber 2014-12-13 22:15
Jak każda kontrolka pracująca w trybie wirtualnym - np. zwykły TListView jest równie szybki; Virtual jest słowem kluczem. - wloochacz 2014-12-14 00:17

Pozostało 580 znaków

2014-12-13 22:22
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.


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Tu chodzi o rodzaj filtra (jak w excelu) ? Wiec filtruj dane (strukturę, zapytanie do bazy itd). Ukrywanie wierszy grida to chyba zły pomysł i pewnie wolno działa ? No i do struktury wprowadź set jak radzili wyżej koledzy. Wówczas cała informacja o statusie będzie w jednej kolumnie a iterować i tak trzeba ale tylko jedna kolumnę do porównywania seta. Set zachowuje się jak liczba binarna gdzie bit 1 to stan nr 1 , bit2 to stan2 itd. - andrzej.kmicic 2014-12-17 00:23
umiesz poprawnie odpowiadać? Bo komentarz do tego nie służy. Poza tym nie ja jestem autorem pytania - abrakadaber 2014-12-17 08:28

Pozostało 580 znaków

2014-12-17 21:12
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 :)


quidquid Latine dictum sit, altum videtur
Pieniędzy nie trzeba - daj plusika i będziemy kwita ;) - furious programming 2014-12-18 00:02
A tak przy okazji - jeżeli problem rozwiązany to zakończ wątek; - furious programming 2014-12-18 00:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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