SynEdit: Znajdź, Zamień itp

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]

0

Skorzystaj z gotowych komponentow FindDialog i ReplaceDialog w zakladce Dialogs

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
:|

0

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

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..
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 :)

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.

0

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

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.
;(

0

Dodaj na formę SynEditSearch i przypisz do SynEdit Search Engine

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...

0

Witam!!

Czy ktoś mógłby mi pomóc i podpowiedzieć jak przełożyć ten kod autorstwa Deti na język C++ do Buildera?? Nie znam sie za bardzo na Delphi. Z góry dziękuję za pomoc.

0

Wszystko jest pokazane w demach SynEdita. Wszyscy kombinują, a mają gotowca w Demos :D

0

a powiedzcie mi co dokladnie przechowuje zmienna "SearchSetup" (ktora widnieje niejednokrotnie w tym poscie :-) ) bo bez tego SearhRelpace nie działa i dalatego chce wiedziec .

Jestm poczatkujacym Delfinem tak wiec bez smiechu ;-P

pis

0

A ja mam pytanie jak użyć finddialog w synedit lub za pomocą SynEditSearch bo ja mam wyszukiwanie ale nie działają opcje takie jak wyszukiwanie do tyłu i te inne bajery?

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