SynEdit: Znajdź, Zamień itp

Odpowiedz Nowy wątek
2006-02-05 18:43
0

Witam :) W swoim edytorze mam opcję wyszukiwania tekstu w komponencie SynEdit. Niestety jest to dość skromne udogodnienie. Powiedzmy, że mam na innej formie do (frm_znajdz) Edita (edtFraza) i Buttona, który rozpoczynałby szukanie (sbZnajdz). Mam taki kod pod Buttona:

procedure Tfrm_znajdz.sbZnajdzClick(Sender: TObject);
var
  i : integer;
begin
  i := Pos(edtFraza.Text, frm_main.Edytor.Lines.Text);
  if i > 0 then
  begin
    frm_main.Edytor.SelStart := i -1;
    frm_main.Edytor.SelLength := Length(edtFraza.Text);
    frm_main.Edytor.SetFocus;
  end else
    ShowMessage('Nie znaleziono szukaniej frazy!');
end;

I tak: chciałbym dodać funkcję typu "Znajdź następny" (bo to co zaprezentowałem znajduje pierwszy ciąg, jaki występuje w tekscie - a gdy chcę jechać po całym tekście i znajdywać następne podciągi to legnie) oraz możliwość rozbudowania o takie funkcje jak "Rozrówniaj wielkość liter", "Kierunek" (Przód i Tył) itd.

Drugie moje pytanie. Chciałbym stworzyć o podobnym możliwościach funkcję "Zamień" ("Zamień wszystko" i inne) ;)

Jak ktoś ma może kawałek kodu z jakiegoś swojego edytora, mógłby go użyczyć? Byłbym wdzięczny [browar]

P.S. -> Jakby co, to zaglądałem do demka załączonego do SynEdita, nawet próbowałem co nie co wykorzystać, ale akurat te example są jakieś niechyrze i nie mogłem sobie z nimy poradzić [sciana]


homepage
<font size="1">Jeśli starasz się, by Twój system był idiotoodporny, zawsze znajdzie się idiota, który jest bardziej pomysłowy od Ciebie.</span>

Pozostało 580 znaków

2006-02-05 21:42
0

Skorzystaj z gotowych komponentow FindDialog i ReplaceDialog w zakladce Dialogs


Pozostało 580 znaków

2006-02-06 07:15
0
dRum napisał(a)

Skorzystaj z gotowych komponentow FindDialog i ReplaceDialog w zakladce Dialogs

z tego co widac to gosciu nie chce ich uzywac
ja tez kiedys chcialem zrobic bez komponentow na synedicie ale nie udalo mi sie
:|


Pozostało 580 znaków

2006-02-06 10:20
0

A nie mozesz przeszukiwac tekstu w petli? Dopoki nie znajdziesz ostatniego wyrazu...


Pozdrawiam. Karol

Pozostało 580 znaków

2006-02-06 10:29
0
uses SynEditTypes;

var
  SearchSetup: TSynSearchOptions;
  Down, MathCase, WholeWord: Boolean;
  Szukany_Text: string;
begin
SearchSetup := [ssoPrompt];
if not (DOWN) then
    Include(SearchSetup, ssoBackwards);
  if (MathCase) then
    Include(SearchSetup, ssoMatchCase);
  if (WholeWord) then
    Include(SearchSetup, ssoWholeWord);
  if SynEdit.SearchReplace(Szukany_Text, '', SearchSetup) = 0 then
    ShowMessage('Szukany element nie został znaleziony!');
end;

Opis zmiennych:

Down, MathCase, WholeWord: Boolean; // odpowiednio: szukanie w dół, tylko ta wielkość liter, tylko całe wyrazy
Szukany_Text: string; // chyba nie trzeba opisu..

Pozostało 580 znaków

2006-02-06 17:11
0

Eee, Deti, do czego to ma słuzyć? :) Do szukania raczej. W każdym razie w trakcie działania wywala popularny błąd ...Access Volation... :(

To ma ktoś może coś na znajdź następny/poprzedni oraz na zamianę tekstu (zamień wszystko, poprzedni, następny itp) [???] Jest mi to bardzo potrzebne :)


homepage
<font size="1">Jeśli starasz się, by Twój system był idiotoodporny, zawsze znajdzie się idiota, który jest bardziej pomysłowy od Ciebie.</span>

Pozostało 580 znaków

2006-02-06 17:36
0

Do znajdź następny: PosEx. Do znajdź poprzedni - można kombinować z Odwróceniem ciągu i PosEx, ale są szybsze sposoby. Ot choćby Szukanie normalne z PosEx aż trafi się na aktualny i podanie pozycji poprzedniego znalezionego.


Grunt to uziemienie...

Pozostało 580 znaków

2006-02-06 17:41
0

Ludzie kochani .. przecież napisałem rozwiązanie : bez żadnych PosEx, petli czy innych: SynEdit.SearchReplace - do szukania i zamiany.


Pozostało 580 znaków

2006-02-06 18:11
0
Deti napisał(a)

Ludzie kochani .. przecież napisałem rozwiązanie : bez żadnych PosEx, petli czy innych: SynEdit.SearchReplace - do szukania i zamiany.

procedure Tfrm_znajdz.sbZamienClick(Sender: TObject);
var
  Found : integer;
  SearchSetup: TSynSearchOptions;
begin
  Found := Pos(edtFraza.Text, (frm_main.ActiveMDIChild as Tfrm_edytor).Edytor.Lines.Text);
  SearchSetup := [ssoPrompt];
  if Found > 0 then
  begin
    (frm_main.ActiveMDIChild as Tfrm_edytor).Edytor.SelStart := Found -1;
    (frm_main.ActiveMDIChild as Tfrm_edytor).Edytor.SelLength := Length(edtFraza.Text);
    (frm_main.ActiveMDIChild as Tfrm_edytor).Edytor.SearchReplace(edtFraza.Text,'tekst_do_zamiany',SearchSetup);
    (frm_main.ActiveMDIChild as Tfrm_edytor).Edytor.SetFocus ;
  end else
    ShowMessage('Nie znaleziono szukaniej frazy!');
end;

Przerobiłem z wyszukiwania :) To się komiluje, ale wywala błąd w trakcie działania, tj przechodzi do SynEdit.pas i zatrzymuje sie na linijce 8061 (zaznaczyłem w kodzie):

...
  if not assigned(fSearchEngine) then
  begin

// to ta na poniżej :)
Raise ESynEditError.Create('No search engine has been assigned'); <-- TO TA
// to ta powyżej :)

  end;
...

Jakby co to dodałem moduł SynEditType.
;(


homepage
<font size="1">Jeśli starasz się, by Twój system był idiotoodporny, zawsze znajdzie się idiota, który jest bardziej pomysłowy od Ciebie.</span>

Pozostało 580 znaków

2006-02-06 19:03
0

Dodaj na formę SynEditSearch i przypisz do SynEdit Search Engine


Pozostało 580 znaków

2006-02-07 15:34
0
Deti napisał(a)

Dodaj na formę SynEditSearch i przypisz do SynEdit Search Engine

OK, wyszukiwanie działa :) A "Znajdź następny" i "Znajdz poprzedni" to jak? :)
I jeszcze jedno: odnoszę wrażenie, że kod nie działa na zastępowanie? [sciana]

  if (frm_main.ActiveMDIChild as Tfrm_edytor).Edytor.SearchReplace(Edit1.Text, edit2.text, SearchSetup) = 0 then

Wyszukuje, a zamieniać na tekst w Edicie2 nie chce :( Po drugim kliknięciu na buttona informuje, że nie znaleziono już tekstu...


homepage
<font size="1">Jeśli starasz się, by Twój system był idiotoodporny, zawsze znajdzie się idiota, który jest bardziej pomysłowy od Ciebie.</span>

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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