Šta je novo?

algoritam

  • Začetnik teme Začetnik teme range
  • Datum pokretanja Datum pokretanja
R

range

Guest
Evo ovako, treba da napisem auto complete(znate ono, recimo krenes da kucas adresu u Outlooku, a on iz liste adresa ti dopunjava). Jel zna neko otprilike kako treba da izgleda algoritam?
 
Evo ti ga izvod iz listinga; pisano u Delphiju, doduse, ali ne bi trebalo da ti predstavlja problem da "izvuces" algorita odatle.
Radi se o VCL/CLX combobox komponenti, koja sadrzi subkomponentu "Items" koja opet predstavlja listu (bolje reci kolekciju) stringova -> taman history koji ti treba. Sam isecak koda je event-handler OnKeyPress samog comboboxa.


[code:1]

...
begin
if Key in ['a'..'z'] then Dec(Key,32);
with (Sender as TComboBox) do
begin
SelSt := SelStart;
if (Key = Chr(vk_Back)) and (SelLength <> 0) then
TmpStr := Copy(Text,1,SelStart)+Copy(Text,SelLength+SelStart+1,255)
else if Key = Chr(vk_Back) then
TmpStr := Copy(Text,1,SelStart-1)+Copy(Text,SelStart+1,255)
else
TmpStr := Copy(Text,1,SelStart)+Key+Copy(Text,SelLength+SelStart+1,255);
if TmpStr = '' then Exit;

if (Key = Chr(vk_Back)) and (SelSt > 0) then Dec(SelSt)
else if Key <> Chr(vk_Back) then Inc(SelSt);
Key := #0;
if SelSt = 0 then
begin
Text:= '';
Exit;
end;

Found := False;
for i := 1 to Items.Count do
if Copy(Items[i-1],1,Length(TmpStr)) = TmpStr then
begin
Text := Items[i-1];
ItemIndex := i-1;
Found := True;
Break;
end;
if Found then
begin
SelStart := SelSt;
SelLength := Length(Text)-SelSt;
end
else Beep;
end;
end;
[/code:1]
 
Hvala puno, nisam ocekivao da cu dobiti kod vec samo smernice. Lako cu ga prebaciti u javu. U svakom slucaju hvala:wave;
 
Pa sad, sam nacin je manje-vise vrlo jednostavan, zato sam radije i pastovao source, jer mi se algo cini prostim; treba izabrati samo pravi event (na pritisak samo jednog, bilo kojeg tastera u fokusu te komponente). Browsiras samo listu prethodno unesenih vrednosti, te prikazes samo prvi koji odgovara unesenom patternu - ako je pritisnuto jedno slovo, npr "a", onda prvi entry u listi koji pocinje sa "a".
S tim da ono sto si dodao markiras kao selected - u tu svrhu postoje ovde u delphijevim edit komponentama atributi SelStart i SelLength -> prvi karakter od kojeg krece obelezavanje i broj koliko njih u nizu obelezavas (respektivno). Naravno, pamtis interno sta je korisnik uneo (moze na dva nacina; bilo da pamtis string, bilo da pamtis samo zavrsni index zadnjeg unesenog karaktera -> ionako je uneo od 1 do n karaktera).

Tu je samo jedna jos odluka na tebi: koliko je ovo restriktivno; tacnije, da li dozvoljavas da se kucanjem bira samo i samo ono sto je u history, ili ces dopustiti da se unosi i ono sto ne postoji u listi. Ovaj source je, konkretno, restriktivan (meni je trebalo da se dozvoli izbor servera, ali samo stvarno raspolozivih servera u mrezi - punjenje i refresh te liste odradjuje sasvim drugi objekat i ne smem dozvoliti garbage tu). Tebi vrlo verovatno treba dozvoliti i unos vrednosti koje ne postoje u history, te mozes da uradis samo izmenu Else grane u "If Found" grananju, pa da ide nesto drugo umesto Beep. U tom slucaju mozes da setujes i neki dodatni flag koji oznacava da se doslo do tacke kada nema matching patternova vise u listi, te da na dalje eventove KeyPress ne radi loop kroz celu listu (jer ionako nece nista odgovarajuce naci). Nije neophodno, ali eto, mala optimizacija -> pogotovo ako radis svoju klasu sa takvim ponasanjem.
 
Ne zelim da ovo ispadne neki zlocesti komentar ..
ali u Delphiju 6 postoji property ComboBox.AutoComplete koji je mene bas iznenadio kada sam hteo da napravim isti algoritam 🙂)
 
Daleko od toga da je zlocest, ali ... covek nije trazio kako to ide u delphiju, nego mu je trebao algoritam za drugi jezik (javu); ovo je source radjen dosta *pre* sestice i postovao sam ga vise kao ilustraciju (ili da sam mu napisao radije "upotrebi TComboBox.AutoComplete" ? 🙂 )
 
Nazad
Vrh Dno