Ĺadny brzuch
Mam problem. Chodzi oto, że na formie mamy Edita i ListBoxa. PO wpisaniu tekstu do Edita pozycje w ListBoxie mają się zredukować, ograniczyć, wyeliminować TYLKO do tych, które rozpoczynają się na tekst z Edita. Częściowe rozwiązanie znalazłem tu ( http://www.ks-eksper...ajTerms=ListBox ) przy odpowiedzi Oxi'ego. Czy ktoś pomoże mi rozwiązać ten problem do końca? Z gór THX!
K R Z E M A - spragniony wiedzy !!
GG#: 4391798
E-mail: krzema12@wp.pl
utwórz pętlę for, w której będziesz sprawdzał czy text z edita pasuje do textu w ListBoxie
//----------------------
z_forum_experta@beldzio.com
www.beldzio.com
www.beldzio.com/forum
gg :3183960
Proponowałbym utworzyć zmienną typu TStringList w której miałbyś wszystkie pozycje mogące się znaleźć w ListBox'ie. Wtedy wystarczy, że pod onchange Edita podepniesz sobie takie coś: ListBox1.Clear; for j:=0 to StringList.Count-1 do if Pos(Edit1.Text, StringList.Strings[j])=1 then ListBox1.Items.Add(dane.Strings[j]);i masz to o co Ci chodziło - na bieżąco aktualizowana jest zawartość ListBox'a i jest tam tylko to co zaczyna się na litery wpisane w Edit.
ICQ : 245-363-570
cytat:Oxi napisał:
Proponowałbym utworzyć zmienną typu TStringList w której miałbyś wszystkie pozycje mogące się znaleźć w ListBox'ie. Wtedy wystarczy, że pod onchange Edita podepniesz sobie takie coś: ListBox1.Clear; for j:=0 to StringList.Count-1 do if Pos(Edit1.Text, StringList.Strings[j])=1 then ListBox1.Items.Add(dane.Strings[j]);i masz to o co Ci chodziło - na bieżąco aktualizowana jest zawartość ListBox'a i jest tam tylko to co zaczyna się na litery wpisane w Edit.
Â
ICQ : 245-363-570
Niebardzo to rozumiem. Mógłbyś mi przesłać plik projektu na krzema12@wp.pl lub pkrzemi@tlen.pl ?? W praktyce lepiej skumam ;) A jeżeli nie masz zainstalowanego Delphi, to po prostu to dokładniej wytłumacz, bo np. nie kumam tego: "j:=0". Przecież "j" to nie zmienna liczbowa, chyba, że chodziło o "j:='0'", ale to by było wtedy bez sensu. Spróbuję jeszcze sam pokombinować ;)
Z góry THX!
K R Z E M A - spragniony wiedzy !!
GG#: 4391798
E-mail: krzema12@wp.pl
cytat:Krzema napisał:
Niebardzo to rozumiem. Mógłbyś mi przesłać plik projektu na krzema12@wp.pl lub pkrzemi@tlen.pl ?? W praktyce lepiej skumam ;) A jeżeli nie masz zainstalowanego Delphi, to po prostu to dokładniej wytłumacz
Jasne, że mam zainstalowane Delphi - do podstawa w moim systemie 8)
Ale napisze Ci tu bo kodu jest niedużo - a może komuś jeszcze się na coś przyda.
A więc tak:
Wrzuć sobie na formę Edit'a i ListBox'a. W ObjectInspectorze przechodzisz na zakładke Events i dwukrotnie klikasz w polu obok onchange. Teraz przechodzisz do kodu programu i utworzoną tam procedurę:
procedure TForm1.Edit1Change(Sender: TObject); begin end;podmieniasz na tą poniżej:procedure TForm1.Edit1Change(Sender: TObject); var j : integer; begin ListBox1.Clear; for j:=0 to StringList.Count-1 do if Pos(Edit1.Text, StringList.Strings[j])=1 then ListBox1.Items.Add(StringList.Strings[j]); end;Musisz jeszcze utworzyć StringList.
Dodaj ją na górze listingu w (np.) sekcji public.
public { Public declarations } StringList : TStringList;Teraz w zdarzeniu OnCreate głównej formy dodajesz: StringList := TStringList.Create; StringList.Add('[i]jakieś słowo[/i]'); StringList.Add('[i]kolejne słowo[/i]'); StringList.Add('[i]kolejne słowo[/i]'); [i]{ itd. }[/i] StringList.Add('[i]kolejne słowo[/i]');W zdarzeniu OnDestroy głównej formy dodajesz linijkę:
[code]
StringList.Free;
[code]
I to wszystko.
cytat:
bo np. nie kumam tego: "j:=0". Przecież "j" to nie zmienna liczbowa, chyba, że chodziło o "j:='0'", ale to by było wtedy bez sensu. Spróbuję jeszcze sam pokombinować ;)
j to zmienna typu integer - czyli przechowuje liczby całkowite. W powyższym przykładzie służy do zliczania kolejnych pętli i do wybierania kolejnych elementów z StringList'a.
ICQ : 245-363-570
Wielkie dzięki Oxi! O to mi chodziło!
Najlepiej uczyć się na własnych błędach.
GG#: 4391798 E-mail: krzema12@wp.pl WWW: http://www.krzema12.prv.pl/
Aha, i jeszcze jedno. Nie wiem, czy jest sens zakładania nowego tematu, więc jeszcze jedno pytanie napiszę tu. Jak zrobić, aby można było indetyfikować itemy po nazwie? Że nie np. ListBox1.ItemIndex := 2; tylko ListBox1.ItemNameIndex := 'Ustawienia'; ?? Coś mi się wydaje, że nie ma takiej gotowej właściwości. Czy da się to jakoś uzyskać?
Najlepiej uczyć się na własnych błędach.
GG#: 4391798 E-mail: krzema12@wp.pl WWW: http://www.krzema12.prv.pl/
ListBox1.Items.IndexOf(<tekst itema>)
Dobry programista umie przyznać się do błędu,
ale doskonały programista stara się popełniać ich jak najwięcej :)
Sajt mojej "grupy" programistycznej (inni wylecieli :)) http://chomik-programista.tripod.com
cytat:Krzema napisał:
Jak zrobić, aby można było indetyfikować itemy po nazwie? Że nie np. ListBox1.ItemIndex := 2; tylko ListBox1.ItemNameIndex := 'Ustawienia'; ?? Coś mi się wydaje, że nie ma takiej gotowej właściwości. Czy da się to jakoś uzyskać?
ListBox1.ItemIndex := ListBox1.Items.IndexOf('Ustawienia');
O to Ci chodzi ?
IndexOf zwraca indeks pierwszego napotkanego wystąpienia danego łańcucha (począwszy od 0). Jeśli podany łańcuch znajduje się na liście w kilku miejscach to zwrócony zostanie indeks tylko pierwszego z nich.
ICQ : 245-363-570
TLEN: oxisoft
cytat:Oxi napisał:
Jeśli podany łańcuch znajduje się na liście w kilku miejscach to zwrócony zostanie indeks tylko pierwszego z nich.
Szkoda :(. Jeżeli np. mamy na liście kilka pozycji, które rozpoczynają się na tekst, który jest zawarty w "Edycie" :), to chodzi mi o to, aby zaznaczały się w tej kolejności, jakie są, czyli żeby zostały zwrócone indeksy tych pozycji, w kolejności, w jakiej następują i po kolejnych wywoływaniach tej funkcji zaznaczały się kolejne itemy. Da się to jakoś zrobić?
Najlepiej uczyć się na własnych błędach.
GG#: 4391798 E-mail: krzema12@wp.pl WWW: http://www.krzema12.prv.pl/
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
K R Z E M A - spragniony wiedzy !!
GG#: 4391798
E-mail: krzema12@wp.pl
utwórz pętlę for, w której będziesz sprawdzał czy text z edita pasuje do textu w ListBoxie
//----------------------
z_forum_experta@beldzio.com
www.beldzio.com
www.beldzio.com/forum
gg :3183960
Proponowałbym utworzyć zmienną typu TStringList w której miałbyś wszystkie pozycje mogące się znaleźć w ListBox'ie. Wtedy wystarczy, że pod onchange Edita podepniesz sobie takie coś: ListBox1.Clear; for j:=0 to StringList.Count-1 do if Pos(Edit1.Text, StringList.Strings[j])=1 then ListBox1.Items.Add(dane.Strings[j]);i masz to o co Ci chodziło - na bieżąco aktualizowana jest zawartość ListBox'a i jest tam tylko to co zaczyna się na litery wpisane w Edit.
ICQ : 245-363-570
cytat:Oxi napisał:
Proponowałbym utworzyć zmienną typu TStringList w której miałbyś wszystkie pozycje mogące się znaleźć w ListBox'ie. Wtedy wystarczy, że pod onchange Edita podepniesz sobie takie coś: ListBox1.Clear; for j:=0 to StringList.Count-1 do if Pos(Edit1.Text, StringList.Strings[j])=1 then ListBox1.Items.Add(dane.Strings[j]);i masz to o co Ci chodziło - na bieżąco aktualizowana jest zawartość ListBox'a i jest tam tylko to co zaczyna się na litery wpisane w Edit.
Â
ICQ : 245-363-570
Niebardzo to rozumiem. Mógłbyś mi przesłać plik projektu na krzema12@wp.pl lub pkrzemi@tlen.pl ?? W praktyce lepiej skumam ;) A jeżeli nie masz zainstalowanego Delphi, to po prostu to dokładniej wytłumacz, bo np. nie kumam tego: "j:=0". Przecież "j" to nie zmienna liczbowa, chyba, że chodziło o "j:='0'", ale to by było wtedy bez sensu. Spróbuję jeszcze sam pokombinować ;)
Z góry THX!
K R Z E M A - spragniony wiedzy !!
GG#: 4391798
E-mail: krzema12@wp.pl
cytat:Krzema napisał:
Niebardzo to rozumiem. Mógłbyś mi przesłać plik projektu na krzema12@wp.pl lub pkrzemi@tlen.pl ?? W praktyce lepiej skumam ;) A jeżeli nie masz zainstalowanego Delphi, to po prostu to dokładniej wytłumacz
Jasne, że mam zainstalowane Delphi - do podstawa w moim systemie 8)
Ale napisze Ci tu bo kodu jest niedużo - a może komuś jeszcze się na coś przyda.
A więc tak:
Wrzuć sobie na formę Edit'a i ListBox'a. W ObjectInspectorze przechodzisz na zakładke Events i dwukrotnie klikasz w polu obok onchange. Teraz przechodzisz do kodu programu i utworzoną tam procedurę:
procedure TForm1.Edit1Change(Sender: TObject); begin end;podmieniasz na tą poniżej:procedure TForm1.Edit1Change(Sender: TObject); var j : integer; begin ListBox1.Clear; for j:=0 to StringList.Count-1 do if Pos(Edit1.Text, StringList.Strings[j])=1 then ListBox1.Items.Add(StringList.Strings[j]); end;Musisz jeszcze utworzyć StringList.
Dodaj ją na górze listingu w (np.) sekcji public.
public { Public declarations } StringList : TStringList;Teraz w zdarzeniu OnCreate głównej formy dodajesz: StringList := TStringList.Create; StringList.Add('[i]jakieś słowo[/i]'); StringList.Add('[i]kolejne słowo[/i]'); StringList.Add('[i]kolejne słowo[/i]'); [i]{ itd. }[/i] StringList.Add('[i]kolejne słowo[/i]');W zdarzeniu OnDestroy głównej formy dodajesz linijkę:
[code]
StringList.Free;
[code]
I to wszystko.
cytat:
bo np. nie kumam tego: "j:=0". Przecież "j" to nie zmienna liczbowa, chyba, że chodziło o "j:='0'", ale to by było wtedy bez sensu. Spróbuję jeszcze sam pokombinować ;)
j to zmienna typu integer - czyli przechowuje liczby całkowite. W powyższym przykładzie służy do zliczania kolejnych pętli i do wybierania kolejnych elementów z StringList'a.
ICQ : 245-363-570
Wielkie dzięki Oxi! O to mi chodziło!
Najlepiej uczyć się na własnych błędach.
GG#: 4391798 E-mail: krzema12@wp.pl WWW: http://www.krzema12.prv.pl/
Aha, i jeszcze jedno. Nie wiem, czy jest sens zakładania nowego tematu, więc jeszcze jedno pytanie napiszę tu. Jak zrobić, aby można było indetyfikować itemy po nazwie? Że nie np. ListBox1.ItemIndex := 2; tylko ListBox1.ItemNameIndex := 'Ustawienia'; ?? Coś mi się wydaje, że nie ma takiej gotowej właściwości. Czy da się to jakoś uzyskać?
Najlepiej uczyć się na własnych błędach.
GG#: 4391798 E-mail: krzema12@wp.pl WWW: http://www.krzema12.prv.pl/
ListBox1.Items.IndexOf(<tekst itema>)
Dobry programista umie przyznać się do błędu,
ale doskonały programista stara się popełniać ich jak najwięcej :)
Sajt mojej "grupy" programistycznej (inni wylecieli :)) http://chomik-programista.tripod.com
cytat:Krzema napisał:
Jak zrobić, aby można było indetyfikować itemy po nazwie? Że nie np. ListBox1.ItemIndex := 2; tylko ListBox1.ItemNameIndex := 'Ustawienia'; ?? Coś mi się wydaje, że nie ma takiej gotowej właściwości. Czy da się to jakoś uzyskać?
ListBox1.ItemIndex := ListBox1.Items.IndexOf('Ustawienia');
O to Ci chodzi ?
IndexOf zwraca indeks pierwszego napotkanego wystąpienia danego łańcucha (począwszy od 0). Jeśli podany łańcuch znajduje się na liście w kilku miejscach to zwrócony zostanie indeks tylko pierwszego z nich.
ICQ : 245-363-570
TLEN: oxisoft
cytat:Oxi napisał:
Jeśli podany łańcuch znajduje się na liście w kilku miejscach to zwrócony zostanie indeks tylko pierwszego z nich.
Szkoda :(. Jeżeli np. mamy na liście kilka pozycji, które rozpoczynają się na tekst, który jest zawarty w "Edycie" :), to chodzi mi o to, aby zaznaczały się w tej kolejności, jakie są, czyli żeby zostały zwrócone indeksy tych pozycji, w kolejności, w jakiej następują i po kolejnych wywoływaniach tej funkcji zaznaczały się kolejne itemy. Da się to jakoś zrobić?
Najlepiej uczyć się na własnych błędach.
GG#: 4391798 E-mail: krzema12@wp.pl WWW: http://www.krzema12.prv.pl/