Filtrowanie StringGrida z kilkoma warunkami

Filtrowanie StringGrida z kilkoma warunkami
maniutek20
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 3 godziny
  • Postów:138
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
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
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.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:11 minut
  • Lokalizacja:Tuchów
  • Postów:12171
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.:

Kopiuj
type
  TFileState = (fsNew, fsAccepted, fsRejected);

oraz typ zbioru enumów:

Kopiuj
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ć.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
abrakadaber
abrakadaber
VirtualStringTree jest pieruńsko szybkie w te klocki :)
WL
Jak każda kontrolka pracująca w trybie wirtualnym - np. zwykły TListView jest równie szybki; Virtual jest słowem kluczem.
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0
Kopiuj
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ą.
andrzej.kmicic
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.
abrakadaber
abrakadaber
umiesz poprawnie odpowiadać? Bo komentarz do tego nie służy. Poza tym nie ja jestem autorem pytania
maniutek20
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 3 godziny
  • Postów:138
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
flowCRANE
Pieniędzy nie trzeba - daj plusika i będziemy kwita ;)
flowCRANE
A tak przy okazji - jeżeli problem rozwiązany to zakończ wątek;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.