Wyszukiwanie ciągu znaków w Stringgrid

0

Witam Wszystkich.

Czy ktoś wie w jaki sposób można wyszukiwać ciąg znaków przeszukując wszystkie komórki Stringgrida??

Podobny efekt uzyskałem wykorzystując Memo i FindDialog, ale w żaden sposób nie wiem jak to ugryźć ze Stringgridem.

Chciałbym aby wpisując ciąg znaków np. w jakimś Edit i póżniejszym wciśnięciu buttona „szukaj” zaznaczył mi daną komórkę w Stringgridzie z szukanym ciągiem znaków,a w przypadku kolejnego wciśnięcia „szukaj” zaznaczył kolejną komórkę z szukanym ciągiem znaków itp...

Np.
Szukam ciąg znaków = ’ma
Przykładowy Stringgrid (1 wiersz, 3 kolumny): ’mama’ ‘tata’ ‘tama’

Wynik:
zaznaczenie komórki pierwszej: ‘mama’
w przypadku kolejnego 'szukaj' zaznaczenie komórki pierwszej: ‘mama
w przypadku kolejnego 'szukaj' zaznaczenie komórki trzeciej: ‘tama

Korzystam z Delphi 5.

0

lecisz po wszystkich komorkach i sprawdzasz czy:
pos(szukany, text_w_komorce)>0
jesli pos>0 tzn ze szukany wyraz znajduje sie gdzies (a konkretnie z miescu zwracanym przez pos) w tekscie komorki
jesli znalazles to przerywasz petle i zapisujesz w zmiennej globalnej pozycje tej komorki.
przy ponownym kliknieciu nie szukasz juz od poczatku tylko od pozycji zapamietanej w tej globalnej zmiennej.
musisz tylko pamietac o wyzerowaniu tej zmiennej w odpowiednim momencie (np gdzy nic nie znajdziesz, lub zmienisz text w edicie).

P.S. ale zanim sie zabierzesz za pisanie to poszukaj, bo nie wierze, ze jestes jedyna osoba na tej planecie ktora chce zrobic wyszukiwanie w stringgridzie :P

0

Dzięki za wskazówki.

Początkowo byłem przekonany, że to jest bardzo banalne, więc sam spróbowałem to napisać. Po kilku ciężkich godzinach, zacząłem szukać w sieci. Oczywiście znalazłem wyszukiwanie ciągu znaków w ListBoxie, w Memo, RechEdit... ale nie w StringGridzie. Jedynie co znalazłem na temat StringGrida to to, że wyszukiwany ciąg znaków musiał być równy zawartości komórki tzn:

Szukam ciąg znaków = ’ma’
Przykładowy Stringgrid (1 wiersz, 3 kolumny): ’mama’ ‘tata’ ‘tama’

Wynik: żadna komórka nie będzie zaznaczona, gdyż nie ma komórki, której wartość równa się szukanemu ciągu znaków.

Wcześniej zapomniałem dopisać, że stringGrid posiada kilka wierszy, a nie jak pisałem tylko jeden.

"jesli pos>0 tzn ze szukany wyraz znajduje sie gdzies (a konkretnie z miescu zwracanym przez pos) w tekscie komorki
jesli znalazles to przerywasz petle i zapisujesz w zmiennej globalnej pozycje tej komorki.
przy ponownym kliknieciu nie szukasz juz od poczatku tylko od pozycji zapamietanej w tej globalnej zmiennej."

Próbowałem również z przerwaniem pętli, ale kończyło się tym, że przeszukiwanie odbywało się tylko w pierwszej kolumnie lub tylko w pierwszym wierszu.
Próba zapisywania aktualnej pozycji w komórce do zmiennej globalnej również mi nie wyszła....

Udało mi się stworzyć coś takiego, ale jest to dalece od mojej pierwotnej potrzeby:

for k:=1 to StringGrid1.RowCount-1 do
  begin
     for kk:=1 to StringGrid1.ColCount-1 do
        begin
        tekstWkomorce:=StringGrid1.Cells[kk,k];
           if pos(szukany,tekstWkomorce)>0 then
                begin
                  StringGrid1.row:=k;
                  StringGrid1.col:=kk;
                  ShowMessage('Znalazelem szukany ciag znaków');
                end ;

        end;
  end;

Ktoś pomoże?

0

cos w ten deseń, pewnie mozna jeszcze poprawic pare rzeczy, optymalizacja itd...:

lastFound:TPoint; //globalna
procedure TForm1.SzukajClick(Sender: TObject);
var x,y:integer;
    szukanafraza:string;
    s:string;
begin
  lastFound:=Point(1,1);
  szukanafraza:=LowerCase(Edit1.text);

  for y:=1 to StringGrid1.RowCount-1 do
      for x:=1 to StringGrid1.ColCount-1 do
          begin
            s:=lowercase(StringGrid1.Cells[x,y]);
            if Pos(szukanafraza, s)>0 then
               begin
                 lastFound:=Point(x,y);
                 StringGrid1.Col:=x;
                 StringGrid1.Row:=y;
                 Exit;
               end;
          end;
  ShowMessage('Wyszukiwanie zakonczone');
end;



procedure TForm1.SzukajNastepnegoClick(Sender: TObject);
var x,y:integer;
    szukanafraza:string;
    s:string;
begin
  szukanafraza:=LowerCase(Edit1.text);

  x:=lastFound.x;
  y:=lastFound.y;

  repeat
    Inc(x);//x:=x+1;
    if x>StringGrid1.ColCount-1 then
        begin
          x:=1;
          Inc(y)//y:=y+1;
        end;

    s:=lowercase(StringGrid1.Cells[x,y]);
    if Pos(szukanafraza, s)>0 then
       begin
         StringGrid1.Col:=x;
         StringGrid1.Row:=y;
         lastFound:=Point(x,y);
         break;
       end;
  until (x>=StringGrid1.ColCount-1) and (y>=StringGrid1.RowCount-1);

  if (x>=StringGrid1.ColCount-1) and (y>=StringGrid1.RowCount-1)
     then ShowMessage('Wyszukiwanie zakonczone');
end;
0

Dzięki za kod.

Wszystko działa prawidłowo.
Musiałem tylko zamienić wersję Delphi z 5 na 7, gdyż 5 nie chciała skompilować kodu, ze względu na zapis: "lastFound:=Point(x,y)".
Dodatkowo dodanie klasy "Types" w zupełności pomogło.

Dziękuję raz jeszcze.

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