Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Поиск и выделение (не step by step) в SynMemo


Автор: Aehn 26.6.2008, 11:36
Есть такая задача:

текст находится в Memo:TSynMemo;
В EditSearch:TEdit находится некий текст/слово.
Кнопка PressMe:TButton

Необходимо при нажатии на кнопку в тексте Memo найти все включения, соответствующие содержимому EditSearch, с подсветкой ВСЕХ этих включений.

Осуществить замену подсвеченного.


Пробовал
                 Memo.SelStart:= позиция в строке;
                 Memo.SelLength:= протяженность подсветки;
Не дало нужного результата;

Пробовал вызывать функцию
                 Memo.SearchReplace(EditSearch.Text,EditSearch.Text, ??? );
Но не понял, как задавать Option:TSynSearchOption;

Если не трудно, поделитесь идеями с нужными методами и (главное) способами их воплощения!

Автор: Frees 26.6.2008, 12:38
Цитата(Aehn @  26.6.2008,  11:36 Найти цитируемый пост)
Пробовал                 Memo.SelStart:= позиция в строке;                 Memo.SelLength:= протяженность подсветки;Не дало нужного результата;

а что дало, и что не так



Цитата(Aehn @  26.6.2008,  11:36 Найти цитируемый пост)
Пробовал вызывать функцию                 Memo.SearchReplace(EditSearch.Text,EditSearch.Text, ??? );Но не понял, как задавать Option:TSynSearchOption;


  TSynSearchOption = (ssoMatchCase, ssoWholeWord, ssoBackwards,
    ssoEntireScope, ssoSelectedOnly, ssoReplace, ssoReplaceAll, ssoPrompt);
 ssoSelectedOnly выделит вхождения

Автор: morpheyushka 26.6.2008, 13:34
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Функция замены в строке всех вхождений одной подстроки на другую

В отличие от других подобных функций, эта - не зависнет, если в строке нужно 
заменить не только одно слово совершенно другим,
но и допустим, слово "Штаны" на "-Штаны-"
(Т.е. начальное слово после замены остается, но к нему добавляется какой нибудь 
символ справа, или слева. В данном случае по краям слова добавлен знак минуса).

Я пересмотрел много примеров, и ни один из них не справился с этой задачей.
(Может я плохо искал?).

Зависимости: Windows, SysUtils
Автор:       Матюшкин Сергей, [email protected], ICQ:162733776, Днепропетровск
Copyright:   Sergey_M
Дата:        26 мая 2003 г.
***************************************************** }

Код

function Replace(Str, X, Y: string): string;
{Str - строка, в которой будет производиться замена.
 X - подстрока, которая должна быть заменена.
 Y - подстрока, на которую будет произведена заменена}

var
  buf1, buf2, buffer: string;
  i: Integer;

begin
  buf1 := '';
  buf2 := Str;
  Buffer := Str;

  while Pos(X, buf2) > 0 do
  begin
    buf2 := Copy(buf2, Pos(X, buf2), (Length(buf2) - Pos(X, buf2)) + 1);
    buf1 := Copy(Buffer, 1, Length(Buffer) - Length(buf2)) + Y;
    Delete(buf2, Pos(X, buf2), Length(X));
    Buffer := buf1 + buf2;
  end;

  Replace := Buffer;
end;
Пример использования: 

procedure TForm1.Button1Click(Sender: TObject);
var
  a: Integer;
begin
  for a := 0 to Memo1.Lines.Count do
    Memo1.Lines[a] := Replace(Memo1.Lines[a], 'Штаны', '-Штаны-');
end;


или 2-ой вариант:
Код

function StrReplace(const Str, Str1, Str2: string): string;
// str - исходная строка
// str1 - подстрока, подлежащая замене
// str2 - заменяющая строка
var
  P, L: Integer;
begin
  Result := str;
  L := Length(Str1);
  repeat
    P := Pos(Str1, Result); // ищем подстроку
    if P > 0 then
    begin
      Delete(Result, P, L); // удаляем ее
      Insert(Str2, Result, P); // вставляем новую
    end;
  until P = 0;
end;


Автор: Frees 26.6.2008, 14:02
morpheyushka
это случмаем не  тоже самое что ReplaceStr из StrUtils?

Автор: Aehn 26.6.2008, 14:27
[QUOTE=Frees, 26.6.2008,  12:38, post1562398]
Цитата(Aehn @  26.6.2008,  11:36 Найти цитируемый пост)
Пробовал                 Memo.SelStart:= позиция в строке;                 Memo.SelLength:= протяженность подсветки;Не дало нужного результата;


а что дало, и что не так

Memo.SelStart := 10;
Memo.SelLength :=20;
Memo.SelStart := 50;
Memo.SelLength :=20;

Дает сплошную подсветку.
Мне же нужно такое:

У попа была собака, 
Он ее любил 
Она съела, кусок мяса 
Он ее убил 

Ну и еще!

Почему var Option:TSynSearchOption; ошибка?
И как мне сделать:
Options:=Options+[ssoSelectedOnly];

Можно пример, если не очень трудно?

Автор: Frees 26.6.2008, 14:45
Цитата(Aehn @  26.6.2008,  14:27 Найти цитируемый пост)
Почему var Option:TSynSearchOption; ошибка?И как мне сделать:Options:=Options+[ssoSelectedOnly];

помоему ты мудриш 
там скорее всего вот так
Memo.SearchReplace(EditSearch.Text,EditSearch.Text, ssoSelectedOnly );

Автор: morpheyushka 26.6.2008, 14:48
Цитата(Frees @  26.6.2008,  14:02 Найти цитируемый пост)
morpheyushka, 
это случмаем не  тоже самое что ReplaceStr из StrUtils?


Не знаю...я это из DelphiWorld взял smile
Мало ли...может это хозяину и нужно...в любом случае лучше чем просто зашел и посмотрел smile 

Автор: Frees 26.6.2008, 14:54
Цитата(Aehn @  26.6.2008,  14:27 Найти цитируемый пост)
Дает сплошную подсветку.

если бы у тя был не просто мемо а RichEdit
то можно было бы так выделять
Код

Memo.SelStart := 10;
Memo.SelLength :=20;
Memo.SelAttributes.Color := clred;
Memo.SelStart := 50;
Memo.SelLength :=20;
Memo.SelAttributes.Color := clred;


Добавлено через 2 минуты и 4 секунды
и еще SynEditTypes в uses напиши

Автор: Aehn 26.6.2008, 15:26
и еще SynEditTypes в uses напиши 

Кажется он и не описан!.

Автор: Aehn 26.6.2008, 16:11
Memo.SearchReplace(EditSearch.Text,EditSearch.Text, ssoSelectedOnly );
Все-таки правильно будет
Memo.SearchReplace(EditSearch.Text,EditSearch.Text, [ssoSelectedOnly]);
Потому что ssoSelectedOnly - элемент множества. Тогда работает поиск и выделение первого найденного элемента. А мне нужно, чтобы было выделение всех элементов, идентичных с EditSearch.Text

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)