[ Srkis2006 @ 05.05.2007. 14:55 ] @
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 |
[ Srkis2006 @ 05.05.2007. 14:55 ] @
[ savkic @ 05.05.2007. 18:52 ] @
> 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. [ X Files @ 06.05.2007. 12:33 ] @
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. [ Miloš Baić @ 06.05.2007. 15:02 ] @
Napravio sam jedan mali primer kako bi se to moglo odraditi. Probaj, pa ako neko ima elegantnije rešenje neka ga prikaže.
[ X Files @ 06.05.2007. 15:35 ] @
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. [ Srkis2006 @ 06.05.2007. 16:39 ] @
@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! [ Miloš Baić @ 06.05.2007. 17:26 ] @
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. [ Srkis2006 @ 06.05.2007. 20:03 ] @
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.
[ X Files @ 06.05.2007. 20:27 ] @
Daj to sto si prebacio.
Sta ne radi dobro? Da nije do indeksa? U C++ idu od NULE... [ Srkis2006 @ 06.05.2007. 20:38 ] @
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; [ X Files @ 06.05.2007. 21:01 ] @
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. [ Miloš Baić @ 07.05.2007. 00:40 ] @
@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. [ Nemanja_666 @ 07.05.2007. 00:48 ] @
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. [ X Files @ 07.05.2007. 06:59 ] @
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. [ Srkis2006 @ 07.05.2007. 08:46 ] @
@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! [ Nemanja_666 @ 07.05.2007. 10:56 ] @
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. Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|