Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Listbox pretraga

[es] :: Pascal / Delphi / Kylix :: Listbox pretraga

[ Pregleda: 2971 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Srkis2006

Član broj: 114662
Poruke: 11
*.gromnet.net.



Profil

icon Listbox pretraga05.05.2007. u 14:55 - pre 205 meseci
Pozdrav,

ima li neko ideju kako da odradim pretragu u listboxu kao sto je odradjeno u winampu npr. Uspeo sam da implementiram incremental pretragu, ali ona se veze samo za pocetak stringa. Dakle?

hvala
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Listbox pretraga05.05.2007. u 18:52 - pre 205 meseci
> ima li neko ideju kako da odradim pretragu u listboxu kao sto je odradjeno u winampu npr. Uspeo sam da implementiram incremental pretragu, ali ona
> se veze samo za pocetak stringa.

A Winamp radi kako? Da li Možda želiš pretragu po bilo kom delu teksta? Direktna podrška za to ne postoji u ListBox kontroli, moraš je sam napisati. Na primer handluj OnKeyPress i pronađi prvu stavku koja sadrži pritisnuto slovo, na novi KeyPress pronađi narednu stavku koja sadrži dva pritisnuta slova i tako dalje. Dodaj i neki timer tako da se pretrega resetuje (krene od početka) ako u određenom periodu ništa ne pritisne.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Listbox pretraga06.05.2007. u 12:33 - pre 205 meseci
Ne znam kako radi Incremental Saerch u WinAmp-u (jer ga i nemam na PC-ju), ali da bi postigao
klasican Incremental Saerch (tj njegovu simulaciju) kroz ListBox potrebno je da imas:

1. original listu (na primer TStringList)
2. listu u kojoj se prikazuju rezultati (TListBox)

Source i Exe koji sam ostavio je u Borland C++ Builderu /VCL/ pa ga popravljaj i doteruj po zelji,
lako ga je transformisati za Delphi jer je sve cist VCL.


Prikačeni fajlovi
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.dialup.neobee.net.



Profil

icon Re: Listbox pretraga06.05.2007. u 15:02 - pre 205 meseci
Napravio sam jedan mali primer kako bi se to moglo odraditi. Probaj, pa ako neko ima elegantnije rešenje neka ga prikaže.
Someone's sitting in the shade today because someone planted a tree a long time ago.
Prikačeni fajlovi
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Listbox pretraga06.05.2007. u 15:35 - pre 205 meseci
Moja greska, u gornjem primeru nisam implementrao klasican Incremental Saerch, vec
filter po nekom pattern-u.

Onda sam probao da sve to modifikujem da bude Incremental Search (sto je trebalo da
bude jos lakse), ali se ispostavilo da nije radilo najbolje.

Zapravo postoji nekakav bug (prijavljen je u QC), koji ne dozvoljava da se AutoComplete
postavi na FALSE iako mu se kaze.

Sva sreca da se onemogucivanje AutoComplete lako postize sa Key=0, čime se u korenu
ubije taj mehanizam.

Nov kod je u attachmentu.
Prikačeni fajlovi
 
Odgovor na temu

Srkis2006

Član broj: 114662
Poruke: 11
*.gromnet.net.



Profil

icon Re: Listbox pretraga06.05.2007. u 16:39 - pre 205 meseci
@X Files
hvala, to je ono sto mi treba, nece biti prob. da ga portujem na delphi :)

@Milos Baic
Hmm, probao sam tvoj primer, ali nesto nece bash da radi kako treba.


poz!
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.dialup.neobee.net.



Profil

icon Re: Listbox pretraga06.05.2007. u 17:26 - pre 205 meseci
Ako ti je potrebno, sad sam pogledao Winamp (pretraga - F3), da unosom nekog texta se u TListBox -u izbace samo one vrednosti koje sadrže taj text, onda moj primer nije korektan. A ako ti treba unosom texta pozicioniranje na prvu vrednost koja sadrži uneti text, trebalo bi da je koretno uz naknadne modifikacije spram potrebe.

Al dobro, Vladimir je odmah shvatio šta ti treba.

Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

Srkis2006

Član broj: 114662
Poruke: 11
*.gromnet.net.



Profil

icon Re: Listbox pretraga06.05.2007. u 20:03 - pre 205 meseci
Da, trebalo mi je kao iz winampa. Samo imam neke muke da ga prebacim u delphi, tacnije, prebacio sam ali nesto nece da radi kako treba.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Listbox pretraga06.05.2007. u 20:27 - pre 205 meseci
Daj to sto si prebacio.

Sta ne radi dobro? Da nije do indeksa? U C++ idu od NULE...
 
Odgovor na temu

Srkis2006

Član broj: 114662
Poruke: 11
*.gromnet.net.



Profil

icon Re: Listbox pretraga06.05.2007. u 20:38 - pre 205 meseci
Code:

var
a:integer;
s:integer;
pretraga:ansistring;
begin

pretraga:=pretraga+key;
if Key = '#08' then begin
    s:=length(pretraga);
      if s > 0 then 
         SetLength(pretraga, s-1 );
   end
   else if Key = '#1B' then begin
      Pretraga := '';
   end;

   test.caption:=pretraga;

if pretraga = '' then begin

    if listbox1.count > 0 then listbox1.ItemIndex:=0;
    end;

Key := #0;
    for a:=0 to listbox1.Items.Count do begin
    
      if (ansipos(pretraga,ListBox1.Items.Strings[a]) > 0 ) then break;

    end;

    if a = listbox1.Items.Count then listbox1.itemindex:=0 else listbox1.itemindex:=a;
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Listbox pretraga06.05.2007. u 21:01 - pre 205 meseci
Pazi ovako, ja se ne razumem u Pascal (pisem po secanju), pogotovo ne oko index intervala,
tj delova koda: for x:=0 to ListBox1.Items.Count-1 do, pa ti svakako proveri da li ide od:
0 -> Duzina
0 -> Duzina-1
1 -> Duzina
... ja sam stavio: 0 -> Duzina-1. Takodje proveri koji je prvi element liste:
ListBox1.ItemIndex := 0; ili ListBox1.ItemIndex := 1;

Tu leze svi problemi.

Ovaj kod se svakako moze i optimizovati, ali evo ga sad ovako kakav je i bio:

// netestirano
Code:

procedure TForm1.FormCreate(Sender: TObject);
begin
   Caption := '';
   SearchText := '';
   ListBox1.Items.LoadFromFile( ExtractFilePath( ParamStr(0) ) + 'spisak.txt' );
end;

procedure TForm1.ListBox1KeyPress(Sender: TObject; var Key: Char);
var
x : Integer;
begin

   if Ord(Key) > 31 then
   begin
      SearchText := SearchText + Key;
   end;

   if Ord(Key) = VK_BACK then
   begin
      if Length( SearchText ) > 0 then
         SetLength( SearchText, Length( SearchText ) - 1 );
   end;

   if Ord( Key ) = VK_ESCAPE then
   begin
      SearchText := '';
   end;

   Caption := SearchText;

   if SearchText = '' then
      begin
         if ListBox1.Count > 0 then
            ListBox1.ItemIndex := 0;
      end;

   Key := #0;

   for x:=0 to ListBox1.Items.Count-1 do
   begin
      if AnsiPos( SearchText, ListBox1.Items.Strings[x] ) > 0 then
         break;
   end;

   if  x = ListBox1.Items.Count  then
      ListBox1.ItemIndex := 0
   else
      ListBox1.ItemIndex := x;

end;

end.
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.dialup.neobee.net.



Profil

icon Re: Listbox pretraga07.05.2007. u 00:40 - pre 205 meseci
@X Files
Probao sam tvoj kod, vrši se obična incremental pretraga. Dakle, kao što je Srkis2006 rekao, njemu treba da se od seta podataka u TListBox izbace samo oni koje on unosi kao uslov, tačnije deo nekog naziva, početna slova, etc.

Evo sad na brzinu sam sklepao još jedan primer, nadam se ovaj put malo bolji od prethodnog!?! ;)
Koristio sam AnsiUpperCase funkciju, kao i Pos funkciju, dakle pretraga onog što se sadrži u stringu, ne samo po početnom slovu (mislim da je za c++ pandan funkcija PosEx, ali nisam siguran, nemam adekvatan help da pogledam).

@Srkis2006
Mislim da je ovo dobra osnova da osmisliš kako ćeš to implementirati.

BTW, primer je rađen u Turbo Delphi -ju.
Someone's sitting in the shade today because someone planted a tree a long time ago.
Prikačeni fajlovi
 
Odgovor na temu

Nemanja_666
Nemanja Tatic
Gradiska

Član broj: 116292
Poruke: 221
217.23.204.*



+19 Profil

icon Re: Listbox pretraga07.05.2007. u 00:48 - pre 205 meseci
Resenje je veoma lako ako radimo sa BrutalForce alogoritmima, ali javlja se problem kada se u listi nadje mnogo stavki onda je pretraga duga. Koriscenjem elemenata dinamickog programiranja(ne govorim o dinamicki kreiranim varijablama, nego pricam o alogoritmima DP-a) moze se ovo rijesiti na brzi nacin. Najlakse(najlakse je da cuvas podatke u nekoj bazi) je da indeksiras stavke u poseban fajl ili isti. Napravi niz koji ce cuvati indeksa u intervalu Ascii kodova za karaktera koji su dozvoljeni u stavki. Kada u pretragu ukucas neki karakter on se obraca tom nizu za index tog karaktera(etc "A" kod 65). Za taj index je vezana lista svih stavki koji sadrzi taj karakter. Kad se unese drugi karakter ponovo gledamo u niz pod kod za taj karakter. Onda u listi ispisujemo samo one stavke koje sadrze te karaktere ali moramo provjeriti da u tim stakama ta dva niza predtavljaju njegov podniz. Naravno nemoj ni slucajno pretrazivati stavke jer ce korisnici morati cekati dugo ako ima mnogo stavke. Nego koristi indexe ponovo. Sve u svemu kad pravis pretragu moras voditi racuna o brzini.

Pozz.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Listbox pretraga07.05.2007. u 06:59 - pre 205 meseci
Citat:

Miloš Baić: @X Files
Probao sam tvoj kod, vrši se obična incremental pretraga. Dakle, kao što je Srkis2006 rekao,
njemu treba da se od seta podataka u TListBox izbace samo oni koje on unosi kao uslov,
tačnije deo nekog naziva, početna slova, etc.

Hm... Ako se ne varam, Incremental Search *nije filtriranje* nego je samo pozicioniranje. Drugim recima, nema
sabijanja liste. E sad, rekoh da ne znam kako to radi u WinAmp-u, mozda se Srkis2006 pogresno izrazio.

To filtriranje sam mu uradio u prvom primeru, doduse potrebno je zameniti jednu liniju koda da bi se
pretraga vrsila po bilo kom delu koda, a ne samo pocetku (nisam bio dobro procitao pitanje).

Citat:

Nemanja_666: Resenje je veoma lako ako radimo sa BrutalForce alogoritmima,
ali javlja se problem kada se u listi nadje mnogo stavki onda je pretraga duga.

I ovo je tacno, ali mislim da u konkretnom slucaju nece biti problema. Srki2006 hoce pretragu po bilo kom
delu reci, a ne samo po prvom slovu, a to nije bas trivijalno za indeksiranje.

U principu prelomni moment je da li ce lista biti u RAM-u ili ce biti pokazivac na neki fajl STREAM.

Ako je sve u ramu, najobicinija Binarna pretraga resava sve probleme sa brzinom.

BTW: WinAmp sam odavno deinstalirao jer me je izludjivao njegov tromi listbox za stavke. Ne znam
kako je sada ali se secam nekog jako sporog osvezavanja te liste. O vucenju za klizace se nije moglo ni
razmisljati. Mozda je to nekome lepo, ali meni nije.
 
Odgovor na temu

Srkis2006

Član broj: 114662
Poruke: 11
91.150.71.*



Profil

icon Re: Listbox pretraga07.05.2007. u 08:46 - pre 205 meseci
@X-Files:
Odlicno, onaj gore napisan kod radi ono sto mi treba.

@Milos Baic:

Tvoj kod mi takodje odradjuje posao i bukvalno vrsi prikaz kao winamp, tacnije, odvaja rezultate sto je takodje korisno.

Ostalo je da se odlucim koji cu primer koristiti. U svakom slucaju HVALA VAM!



 
Odgovor na temu

Nemanja_666
Nemanja Tatic
Gradiska

Član broj: 116292
Poruke: 221
217.23.204.*



+19 Profil

icon Re: Listbox pretraga07.05.2007. u 10:56 - pre 205 meseci
Citat:
X Files:

U principu prelomni moment je da li ce lista biti u RAM-u ili ce biti pokazivac na neki fajl STREAM.

Ako je sve u ramu, najobicinija Binarna pretraga resava sve probleme sa brzinom.


Nema veze gdje se nalazi bice sporo. Da se covek nepati najpametnije uraditi bazu i gotova stavar.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Listbox pretraga

[ Pregleda: 2971 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.