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


Автор: ta2i4 1.8.2009, 06:27
Здравствуйте!

Я в своем текстовом редакторе юзаю Unicode SynEdit 2008/10/03 на Delphi 2009:
http://mh-nexus.de/downloads/UniSynEdit.zip или http://biredit.googlecode.com/files/unisynedit-20081003.zip

Недавно обнаружил проблему со встроенными идущими в комплекте с компонентом подсветками.
Если кликнуть двойным щелчком на английском слове, то оно выделяется. Если же на русском - не выделяется. Если отключить подсветку - русское слово выделяется.
Более того, перед вызовом окна поиска я выделяю слово, на котором стоит каретка, функцией
Код
Edit.ExecuteCommand(198, 'A', @Edit.Lines);
SearchText := Edit.SelText;

Без использования подсветок русские и английские слова выделяются нормально, а вот с использованием подсветок та же проблема.

Есть ли какие-либо способы решения проблемы? И подойдет ли в качестве решения данной проблемы портированный UniHighlighter на Delphi 2009  для UniSynEdit отсюда: http://forum.vingrad.ru/index.php?showtopic=226376&view=findpost&p=1808675

PS: На днях в качестве варианта стал подумывать о следующем способе решения проблемы со стандартной подсветкой:
Код
Edit.Highlighter := nil;
Edit.ExecuteCommand(198, 'A', @Edit.Lines);
SearchText := Edit.SelText;
Edit.Highlighter := {Нужная нам подсветка};

Пока его приводить в действие не пробовал, да и не нравится он мне.

Автор: ta2i4 1.8.2009, 10:41
Цитата
Есть ли какие-либо способы решения проблемы? И подойдет ли в качестве решения данной проблемы портированный UniHighlighter на Delphi 2009  для UniSynEdit отсюда: http://forum.vingrad.ru/index.php?showtopi...t&p=1808675

Так, Unihighlighter - та же проблема. Видимо, что-то таится в SynEditHighlighter.pas, потому что UniHighlighter кажется тоже его юзает.

Автор: Krott 2.8.2009, 15:37
ta2i4, проблема именно в нём.

Загляните в этот файл. Там вы обнаружите следующий код:

Код

function TSynCustomHighlighter.IsIdentChar(AChar: WideChar): Boolean;
begin
  case AChar of
    '_', '0'..'9', 'A'..'Z', 'a'..'z':
      Result := True;
    else
      Result := False;
  end;
end;


Заметьте, среди символов нет русских. Исправим:

Код

function TSynCustomHighlighter.IsIdentChar(AChar: WideChar): Boolean;
begin
  Result := (AChar >= #33) and not IsWordBreakChar(AChar)
end;


Пересобираем и проверяем результат.

Автор: ta2i4 3.8.2009, 08:03
Спасибо!

Автор: ta2i4 8.8.2009, 14:26
Krott, вот ответ разработчика UniSynEdit:
Цитата
But most programming languages just allows these characters. Changing this would cause identifiers to be valid which aren't.

Что-то мне подсказывает, что это не очень хорошее решение.

Автор: Krott 9.8.2009, 00:40
Вы правы. Но что поделать, если в ядре SynEdit для определения границ СЛОВА во всех функциях вида SetWordXXX, GetWordXXX, NextWordXXX и проч. используется функция IsIdentChar? Это, конечно, просчёт в логике, причём трудноисправимый.

В моём случае изменение этой функции было самым лёгким и, к тому же, некритичным способом - надо было подсвечивать HTML, CSS и проч, а там все ключевые слова фиксированы и отступление от них - синтаксическая ошибка.

Альтернативой может быть только изменение всех функций определения слова, а их приличное количество (SetWordBlock, NextWordPosEx, PrevWordPosEx, GetWordAtRowCol).

Удачи!

Автор: ta2i4 9.8.2009, 02:44
Разработчик UniSynEdit предложил подобное решение:
Цитата
The problem is that in SynEdit a word=identifier.

To get the behavior you want you would have to replace calls to IsIdentChar with "not (IsWhiteChar(AChar) or IsWordBreakChar(AChar))" in all procedures in SynEdit.pas.
However this would break the assumption mentioned above. I haven't designed SynEdit like this, and I am wary of changing it as it might break other peoples code.

If you know that a specific highlighter (or better say the programming language) accepts cyrillic characters then you can override IsIdentChar of this specific highlighter to make it accept them. You could use something like SynIsCharAlpha or SynIsCharAlphaNumeric to identify valid characters (but check the documentation of that language to know what characters are really accepted).

Автор: Krott 9.8.2009, 08:50
Цитата

The problem is that in SynEdit a word=identifier.


Вот об этом я и говорил)
Разработчик UniSynEdit лишь подтвердил мои слова. Надеюсь, что функций, использующих IsIdentChar всё-таки не так много, в этом случае исправление не займёт много времени.

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