[Delphi7] Wyszukiwanie w ListView

0

Potrzebuję stworzyć coś w stylu tego programiku :)
http://www.ajt.com.pl/uploads/Main/setup.exe

Nie chodzi mi o głupoty takie jak zawsze na wierzchu, wygląd itd.

Chodzi mi o WYSZUKIWANIE!
a) dokładnie trzeba wpisać, aby zaznaczyło w ListView ITEM 0 i pokazał się tylko 1 wyraz
b) ,,DOWOLNY POCZĄTEK" - czyli... pokazywanie wszystkich słów które kończą sie na dany tekst wpisany w Edit1... ale musi usuwać te wyrazy które się nie kończą na litery wpisane w Edit1
c) ,,DOWOLNE ZAKOŃCZENIE" - wyszukuje słówka zaczynające się na litery wpisane w Edit1, ale usuwa inne itemy, które się zaczynają na inne litery niż te wpisane w Edit1.
d) DOWOLNY POCZĄTEK" oraz DOWOLNE ZAKOŃCZENIE" - wyszukuje litery wpisane w Edit1 w dowolnym miejscu itemów (usuwa te itemy, w których nie ma liter , które są wpisane w Edit1)

z wyjaśnienieniami słowa już sam se poradze

Troche się rozpisałem. Ale zależy mi na tym. Bo dzięki temu, będę mógł zrobić wiele programów, stosując takie coś. Proszę o kody. Z góry :*

0

A regulamin kolega czytał?
Zadawanie pytań na forum to nie jest prawo, to jest przywilej, którego każdy może być pozbawiony jeżeli nie będzie umiał z niego korzystać. Nie wymagaj więc natychmiastowej odpowiedzi. Nie proś od o kod źródłowy, forum jest po to, żeby pomagać ludziom przy pisaniu programu, a nie żeby inni pisali za Ciebie. Forum jest miejscem dla inteligentnych ludzi, ja zawsze staram się podać drogę do rozwiązania problemu, a nie od razu rozwiązanie.

Więc tylko podpowiem.
ad1)
Pobierasz dany element i sprawdzasz czy jest równy.
ad2)
Obcinasz początek tekstu i porównujesz z tym z edita lub funkcja z linku poniżej , tzn pobierasz dokładnie tyle znaków ile masz w edit. to samo ad 3 tylko końcowe.
ad4) Połączenie ad2 i ad3.
Pomoc:
Operacje
a dokładniej:

AnsiStartsStr
AnsiSameStr
AnsiRightStr
0

Hehe... najbardziej mnie zastanawia jak zrobić tak, aby po wpisaniu w Edit1 słówka lub części słówka, pojawiało się w ListView1 niebieskie zaznaczenie na ITEM 0 (nie wiem jak to zrobić, aby móc pisać i automatycznie SetFocus na ListView'a zrobić) - z tym pomóżcie... z resztą myślę sobie poradze...
Z góry dzięki!

0
{Funkcja przeszukuje dwie kolumny ListView (Caption i SubItems[0])
Jeśli natrafi na podobną do Textu frazę to zaznacza wpis w ListView.

Funkcja szuka dalej po kliknięciu przycisku od ostatniego miejsca, w którym
znaleziono podobną do Textu frazę.

Created by Opi (17.11.2006)}
function FindTextLV(ListView: TListView; Text: string; SelectItem: integer): boolean;
var
 x, y: integer;
 tmp: string;
begin
 {Sprawdź czy Text ma więcej niż 2 znaki, inaczej przekaż Wynik jako pusty
 i zakończ dzaiałanie całej funkcji}
 if (Text = '') or (Length(Text) < 2) then
   begin
    Result := False;
    Exit;
   end;

 {Odznacz wszystkie wpisy w ListView, inaczej przekazany parametr nie spełni warunku}
 ListView.Selected := ListView.Items[-1];

 {Przekazany parametr jest teraz potrzebny do miejsca skąd rozpocznie się
 iteracja, czyli od szukania Textu w ListView od kolejnego wpisu, dzięki czemu
 znalezione zostaną także inne pasujące do siebie Texty z innych komórek}
 y := SelectItem;
 Result := False;//ListView.FindCaption( 0, AnsiLowerCase(Text), False, True, False);

 for x := y to ListView.Items.Count-1 do
   begin
    {Pobranie do zmiennej nazwy szukanego ciągu}
    tmp := AnsiLowerCase(ListView.Items[x].Caption);

    {Przetworzenie stringa tak, aby sprawdzić, czy szukana fraza jest
    identyczna jak nazwa Itema w ListView, tzn.:
    Obcięcie Wpisu w ListView o długość szukanego Textu}
    Delete(tmp, Length(Text) + 1, Length(Text) + 200);

    {Jeśli Text jest zgodny z wpisem z ListView, to zaznacz ten wpis w ListView
    i zakończ działanie funkcji z wynikiem = nr komórki w której znaleziono frazę}
    if tmp = AnsiLowerCase(Text) then
      begin
       ListView.SetFocus;

       {Zaznacz i przewiń na znalezioną pozycje}
       ListView.Selected := ListView.Items[x];
       ListView.Scroll(0, (ListView.Items[x].Top) - 100);

       Result := True;
       Break;
      end
    else
      begin
       {Pobranie do zmiennej nazwy szukanego ciągu ponownie, bo tmp został pocięty}
       tmp := AnsiLowerCase(ListView.Items.Item[x].SubItems[0]);

       {Przetworzenie stringa tak, aby sprawdzić, czy szukana fraza jest
       identyczna jak nazwa PodItema w ListView, tzn.:
       Obcięcie Wpisu w ListView o długość szukanego Textu}
       Delete(tmp, Length(Text) + 1, Length(Text) + 200);

       {Jeśli Text jest zgodny z wpisem z PodItema w ListView, to zaznacz ten wpis
       w ListView i zakończ działanie funkcji z wynikiem = nr komórki w której znaleziono frazę}
       if tmp = AnsiLowerCase(Text) then
         begin
          ListView.SetFocus;

          {Zaznacz i przewiń na znalezioną pozycje}
          ListView.Selected := ListView.Items[x];
          ListView.Scroll(0, (ListView.Items[x].Top) - 100);

          Result := True;
          Break;
         end
       else
       {Jeśli nadal nie jest to identyczny Text co we wpisie w ListView to przeszukuj
       pojedynczo literka za literką Items w ListView}
       if Pos(AnsiLowerCase(Text), AnsiLowerCase(ListView.Items[x].Caption)) > 0 then
         begin
          ListView.SetFocus;

          {Zaznacz wybrana pozycje i przewin na wybrana pozycje}
          ListView.Selected := ListView.Items[x];
          ListView.Scroll(0, (ListView.Items[x].Top) - 100);

          Result := True;
          Break;
         end
       else
       {Jeśli nadal nie jest to identyczny Text co Items w ListView to przeszukuj
       pojedynczo literka za literką PodItems w ListView}
       if Pos(AnsiLowerCase(Text), AnsiLowerCase(ListView.Items.Item[x].SubItems[0])) > 0 then
         begin
          ListView.SetFocus;

          {Zaznacz wybrana pozycje i przewin na wybrana pozycje}
          ListView.Selected := ListView.Items[x];
          ListView.Scroll(0, (ListView.Items[x].Top) - 100);

          Result := True;
          Break;
         end

       {Text nie jest identyczny z żadnym wpisem więc przekazany wynik jest pusty}
       else Result := False;
      end;
   end;
end;


var
 i, Idx: integer;
begin
 {
 Znajdź zaznaczony pierwszy wpis w ListaOpisy i przekaż do zmiennej, która służy
 za parametr dla funkcji FindTextLV. Parametr jest potrzebny, aby funkcja przeszukiwała
 po kolei każdy wpis i zaznaczała następny na liście, który się zgadza z tekstem.
 Inaczej funkcja zaznaczy tylko pierwszy napotkany zgadzający się z tekstem wpis,
 a pozostałe nie są brane pod uwagę w ogóle! - ten parametr usuwa ten problem.
 }
 Idx := 0;

 for i := 0 to ListaOpisy.Items.Count-1 do
  if ListaOpisy.Items[i].Selected then
    begin
     Idx := ListaOpisy.Items[i].Index + 1;
     Break;
    end;
 {
 Jeśli index osiągnął liczbę wpisów w ListaOpisy to ustaw Idx na 0, aby funkcja
 FindTextLV sprawdzała pozycje z tekstem od początku listy ListaOpisy.
 }
 if Idx = ListaOpisy.Items.Count then Idx := 0;
 {
 Przeszukaj ListeWynikow pod kątem Textu w Edit1, mając parametr Index, od
 którego aktualnie Itema w TodoList zacząć szukanie.

 Jeśli wynik funkcji FindTextLV to Prawda to oznacza, że znaleziono frazę.
 Oznacz więc Edit na kolor zielony dając graficzną informację użytkownikowi.
 Inaczej oznacz Edit na czerwono .
 }
 if FindTextLV(ListaOpisy, EditWyszukaj.Text, Idx) then EditWyszukaj.Color := $00A6FFD2
 else EditWyszukaj.Color := $00A7A7FE;
 {
 Włączenie tego fokusa spowoduje, że nie zaznaczy pozycji w ListaOpisy
 EditWyszukaj.SetFocus;
 }
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1