Szukanie tekstu w RichEdit

arturfir

Zaczniemy od położenia na formę komponentu FindDialog z zakładki Dialog. W Inspektorze Obiektów wchodzimy do zakładki Events i klikamy dwa razy na właściwość OnFind.
W tym momencie zostanie stworzona definicja i deklaracja obsługi tego zdarzenia.
W kodzie procedury tej obsługi wprowadzamy poniższy kod:

var
  FoundAt: LongInt;
  StartPos, ToEnd: Integer;
begin
  with RichEdit1 do
  begin
{ jeśli jest zaznaczenie, to zaczyna szukać od momentu zaznaczonego tekstu w przeciwnym wypadku od początku tekstu}
    if SelLength <> 0 then
      StartPos := SelStart + SelLength
    else
      StartPos := 0;

  { ustala koniec przeszukiwanego tekstu  }
    ToEnd := Length(Text) - StartPos;

    FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
    if FoundAt <> -1 then
    begin
      SetFocus;
      SelStart := FoundAt;
      SelLength := Length(FindDialog1.FindText);
    end;
  end;

teraz tylko pozostaje nam przyporządkować wywołanie okienka szukania.
Do dowolnego Button'a tworzymy procedurę onClick, w której umieszczamy:

  FindDialog1.Execute;

No i oczywiście nie zapomnij wstawić komponentu RichEdit......

Milej zabawy :-)

9 komentarzy

{ jeśli jest zaznaczenie, to zaczyna szukać od momentu zaznaczonego tekstu w przeciwnym wypadku od początku tekstu}

Czego szukać?

Siema. Jest pewien sposób na to by skorzystać z opcji tj. kierunek szukania, uwzględnianie całych wyrazów, uwzględnianie wiekości liter. Nie jest to żaden algorytm ale mnie w programie się przydało. Sam spędziłem godziny na pisaniu algorytmu a ten sposób jest naprawdę prosty. Skorzystamy ze standardowych akcji jakie znajdziemy w ActionMenagerze. No to do dzieła.
Tworzymy nowy projekt. Najpierw wrzućmy na formę komponent na którym będziemy szukać naszego tekstu, ja wrzucam RichEdita z kategorii Win32. Na formę wrzucamy komponent ActionManager z kategorii Additional. Klikamy na niego dwa razy i pojawia się okno Editing ActionMenager-a. W prawym górnym rogu na zakładce Actions mamy przycisk ''New Action(Ins)". Klikamy i wybieramy "New Standard Action". W tym oknie są standardowe akcje które możemy sobie wybrać. Nas interesuje poszukiwanie tekstu tak więc w kategorii "Search" zaznaczamy TSearchFind i klikamy "OK". Mamy teraz dodane do "Categories" nową kategorie Search, klikając na nią pojawia się nam w Actions po prawej, nasza procedura "Find...". Zamykamy Editing ActionManager-a klikając na Close. Teraz od nas zależy gdzie umieścimy naszą akcję. My dodamy do naszej formy ActionMainMenuBar-a z kategorii Additional. Klikamy ponownie dwukrotnie na ActionMenagera. Teraz metodą przeciągnij i upuść, przeciągamy z ActionMamager-a naszą akcję "Find.." i puszczamy na ActionMainMenuBar. I po wszystkiemu. A jeszcze coś, jak szukamy tekstu to znaleziony tekst jest zaznaczany. Nie będzie widoczne nasze zaznaczenie ponieważ klikając na Find... wychodzimy z komponentu RichEdit. Aby zaznaczenie było widoczne należy dla komponentu RichEdit w Object Inspektorze ustawić "HideSelection" na False. Mam nadzieje, że skorzysta ktoś z tego. Narka

Taq metoda też nie działa na wyszukiwanie w zadeklarowanych polach Tekstowych (np: DB.Edit1.Text), nie wspomnę o filtrowaniu, z którym jest kłopot przy w.w. ustawieniu ;

Ta metoda nie działa dla SynEdit-a :(

A jak wyszukać np. kropę, a tekst skopiować do edit1 jak łańcuch będzie wyglądał tak: 1123.32.22.12.33.44.55566.8787.

Lipa,u mnie FindText undeclared identifier :(

Ale lipa.. dałbyś chociaż obługę opcji TFindDialog`a (kierunek szukania, uwzględniaj całe wyrazy, uwzględniaj wiekość liter itd...)

Jak dla mnie to do faq

No, nareszcie jakiś art na ten temat. Niech tylko ktoś teraz na forum się o to zapyta! :) Dzięki za wszystkich.