Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск и выделение (не step by step) в SynMemo, поиск и подсветка по тексту в SynMemo 
:(
    Опции темы
Aehn
Дата 26.6.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 24.4.2008

Репутация: нет
Всего: нет



Есть такая задача:

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

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

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


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

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

Если не трудно, поделитесь идеями с нужными методами и (главное) способами их воплощения!
PM MAIL   Вверх
Frees
Дата 26.6.2008, 12:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Цитата(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 выделит вхождения


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
morpheyushka
Дата 26.6.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


Профиль
Группа: Участник
Сообщений: 563
Регистрация: 26.2.2008
Где: Киев

Репутация: 2
Всего: 8



{ **** 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;




--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
Frees
Дата 26.6.2008, 14:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



morpheyushka
это случмаем не  тоже самое что ReplaceStr из StrUtils?


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Aehn
Дата 26.6.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 24.4.2008

Репутация: нет
Всего: нет



[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];

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

Это сообщение отредактировал(а) Aehn - 26.6.2008, 14:39
PM MAIL   Вверх
Frees
Дата 26.6.2008, 14:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



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

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


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
morpheyushka
Дата 26.6.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


Профиль
Группа: Участник
Сообщений: 563
Регистрация: 26.2.2008
Где: Киев

Репутация: 2
Всего: 8



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


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


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
Frees
Дата 26.6.2008, 14:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 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 напиши


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Aehn
Дата 26.6.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 24.4.2008

Репутация: нет
Всего: нет



и еще SynEditTypes в uses напиши 

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

Это сообщение отредактировал(а) Aehn - 26.6.2008, 15:27
PM MAIL   Вверх
Aehn
Дата 26.6.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 24.4.2008

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Aehn - 26.6.2008, 16:11
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.