Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > SynUniHighlighter и SynEdit > Подсветить слово "форум" и все слова


Автор: PalR 5.4.2005, 19:55
Мне надо подсветить например слово "форум" и все слова где оно является частью слова в тексте, например "форумчанин".
Этот компонент мне поможет или нет? А то я весь вечер бьюс. Целые слова выделяет а части нет.

Автор: Vitalik 5.4.2005, 20:33
PalR, с текущей реализацией компонента, такого эффекта можно добиться, если добавить символы 'ф', 'о', 'р', 'у', 'м' в список разделителей родительского (в Вашем случае, наверное, корневого) диапазона.
Тогда парсер будет останавливаться на этих символах и найдёт лексему 'форум' в слове 'форумчанин'. smile

Я вот думаю, может для правила "ключевое слово" сделать отдельное свойство: разделители, которое отностилось бы только к нему... А то вот в данном случае как-то нехорошо получается изменять так разделители родительского диапазона... Или может свойство сделать для правила "ключевое слово" отдельное свойство: "может быть частью слова"...

Автор: PalR 5.4.2005, 21:10
Будь человеком примерчик накидай.
ЗЫ:У меня почему то не компилится HglEditor_source.
[Fatal Error] HighlightsU.pas(132): File not found: 'SynUniClasses.dcu'
D7, synedit-cvs-2005-02-26, unihighlighter не помню какой, вчера качнул.
Чего ещё не хватает. Инсталятор бы этим пакетам. Пока поставил .... .

Автор: Vitalik 6.4.2005, 15:13
Цитата(PalR @ 5.4.2005, 21:10)
Будь человеком примерчик накидай.

Примерчик накидал, прикрепляю к сообщению.
Правда выплыл недостаток: теперь эти символы считаются разделителями слов, то есть если с нажатой клавишей Ctrl бегать курсором влево и вправо, то в словах курсор будет останавливаться на буквах ф, о, р, у, м, а по отдельности он эти буквы за слова считать не будет и не остановится на них.
Вот такие дела...
В связи с этим вопрос: может тогда отдельно сделать задание символов-разделителей и отдельно символов, на которых нужно останавливаться парсеру... Правда я давно не лез в исходники компонента и уже точно не помню можно ли разделить эти понятия... smile

Цитата(PalR @ 5.4.2005, 21:10)
ЗЫ:У меня почему то не компилится HglEditor_source.
[Fatal Error] HighlightsU.pas(132): File not found: 'SynUniClasses.dcu'
D7, synedit-cvs-2005-02-26, unihighlighter не помню какой, вчера качнул.

У меня тоже Delphi 7 и тоже последний cvs'ный SynEdit. А UniHighlighter ты откуда качал? Это важно, так как для компиляции этого HglEditor_source необходима именно последняя версия UniHighlighter'a (версия 1.8 от 4 ноября).
Конечно, при большом желании можешь использовать и старую версию. По идее надо лишь убрать этот SynUniClasses из uses HglEditor'a.
Но лучше скачай последнюю версию smile

Цитата(PalR @ 5.4.2005, 21:10)
Чего ещё не хватает. Инсталятор бы этим пакетам. Пока поставил .... .

Да... Инсталлятор был бы удобен. Но я не предсавляю пока, как его писать. У тебя есть инфа по этому поводу? Или может знаешь как можно написать инсталлятор для пакетов Delphi?..

Автор: PalR 6.4.2005, 18:50
Спасибо. Сейчас попробую.
Насчет инсталятора пока помочь не могу. Если будет какая инфа о создании, то отпишусь обязательно.
Я недавно ставил большой пакет JVCL. Там вот инсталер несколько своеобразный. Но отработал четко.

Автор: PalR 6.4.2005, 21:01
Да версия была не та. Поставил стало компилиться. Только пока не разобрался как динамически загрузить слово "ф", "о", "р", "у", "м".

Автор: Vitalik 7.4.2005, 16:42
Цитата(PalR @ 6.4.2005, 21:01)
Только пока не разобрался как динамически загрузить слово "ф", "о", "р", "у", "м".

Что ты имеешь ввиду под "динамически загрузить слово"? smile

Автор: PalR 7.4.2005, 17:27
Vitalik
Ну тоесть в результате работы программы был некий текст. Теперь нужно подсветить слово("форум). Подсветили, посмотрели, оч хорошо. Поделали с прогой чего то, опять сфортировался некий текст, но уже другой. Теперь нужно подсветить слово "привет"(и естественно везде где оно встречается как часть слова "приветливый"). Опять поработали............................подсветить слово "дом" и т.д.
Т.е. загружать слова из Edit, например, или ещё откуда, куда ввел пользователь.

Автор: PalR 8.4.2005, 11:52
А как добавить свои Delimiters. В конструкторе добавляется. А при компиляции пропадают и ставятся дефолтные. А где дефолтные прописаны. Я бы туда вписал.
Метод изменения ещё чего нибудь ещё для сохранения изменений в SynUniSyn не помогает.

Автор: Vitalik 10.4.2005, 14:27
Добавляются свои Delimiters обыкновенно:
Код
  SynUniSyn1.MainRules.TermSymbols :=
    SynUniSyn1.MainRules.TermSymbols + ['ф', 'о', 'р', 'у', 'м'];
  SynEdit1.Repaint();

Но, странное дело... Добавляться они добавляются, но почему-то ключевые слова подсвечиваются также... Пока что не могу понять почему так происходит...

Автор: PalR 15.4.2005, 22:38
Вышел из положения переделав под свою задачу исходник старой версии. Работает так как мне надо.

Автор: Vitalik 16.4.2005, 10:17
Цитата(PalR @ 15.4.2005, 22:38)
Вышел из положения переделав под свою задачу исходник старой версии. Работает так как мне надо.

А что ты там переделал? smile

Автор: PalR 16.4.2005, 16:58
В делимитеры добавил весь алфавит.

Автор: Vitalik 16.4.2005, 18:12
Цитата(PalR @ 16.4.2005, 16:58)
В делимитеры добавил весь алфавит.

Оригинально smile

Автор: PalR 17.4.2005, 11:07
Главное работает.
Тут правда обнаружилось следующее.
Объясню на старом примере. Подсветил слово "форум". Посмотрел. Очистил SynEdit. Опять запихал в него текст. Теперь подсветил слово "дом". Всё нормально. Стал прокручивать текст (ну очень он у меня большой) и глядь, а слово "форум" тоже подсветилось. А мне оно не надо.
Я так понимаю что где то ещё чего то надо очистить. Делаю как в примере.
Код

    SynUniSyn.MainRules.Reset;
    SynEdit.Highlighter:=nil;
    SynSymbolGroup:=TSynSymbolGroup.Create('',TSynHighlighterAttributes.Create('unknown'));


Чем отличаются
SynUniSyn.MainRules.Reset;
и
SynUniSyn.MainRules.Clear;
С последним лучше.

Автор: Vitalik 17.4.2005, 15:15
Цитата(PalR @ 17.4.2005, 11:07)
Главное работает.

Это можно было сделать и без "изменения" кода компонента. Просто после изменения правил (в том числе изменения делимитеров) нужно написать:
Код

  SynUniSyn1.Prepare(); // подсветка должна переформировать дерево токенов
  SynEdit1.Repaint(); // редактор нужно перерисовать, чтобы увидеть изменения


Цитата(PalR @ 17.4.2005, 11:07)
Тут правда обнаружилось следующее.

Я предлагаю для этой задачи немного другой подход. Создать один раз правило для подсветки вводимого слова, а потом просто изменять свойство этого правила smile
Это мне кажется более логичным, да и не надо каждый раз всё очищать/загружать/перезагружать smile

Вот наваял небольшой примерчик работы такого приложения (файлик прикрепляю).
Там кнопка "Добавить делимитеры" - добавляет маленькие русские буквы в список разделителей. Этот код можно поместить на создание твоего приложения smile
Далее вводишь слово и нажимаешь "Подсветить" - программа подсветит слово во всём тексте.
Пользуйся на здоровье smile
Кстати, там используется последняя версия компонента (ver 1.8 от 4 ноября 2004), так что настоятельно рекомендую скачать именно её smile Там и ошибок по меньше, и возможностей по больше smile

Цитата(PalR @ 17.4.2005, 11:07)
Чем отличаются
SynUniSyn.MainRules.Reset;
и
SynUniSyn.MainRules.Clear;

Reset - разрушает дерево токенов, но сохраняет все правила. Эта продедура вызывается перед созданием дерева токенов при подготовке (Prepare) подсветки для подсветки (извини за тавталогию) smile
Clear - разрушает и дерево токенов и все правила. Т.о. после вызова этой процедуры подсветка не будет содержать ни одного правила smile

Highlight word (source).zip (3k)

Автор: Vitalik 17.4.2005, 15:19
А вот исходники вместе с exe (на всякий случай):

Highlight word (source+exe).zip (298k)

Автор: PalR 17.4.2005, 16:55
Спасибо. Попробую.
Пора версию 1.81 собирать. Где добавить в ключевых словах "Может быть частью слова".
Цитата(Vitalik @ 17.4.2005, 15:15)
Я предлагаю для этой задачи немного другой подход

К тому моменту других рабочих вариантов не было. Что пришло в голову то и реализовал.

Автор: Vitalik 15.5.2005, 00:02

 ! 
 
Обсуждение инсталлятора для компонента вынесено в отдельную тему "Инсталлятор для компонента"

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