Модераторы: Vitalik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UniSynEdit и Delphi 2009, есть проблемы 
:(
    Опции темы
ta2i4
Дата 1.8.2009, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!

Я в своем текстовом редакторе юзаю 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?showtopi...t&p=1808675

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

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

Это сообщение отредактировал(а) ta2i4 - 1.8.2009, 06:30
PM MAIL   Вверх
ta2i4
Дата 1.8.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Так, Unihighlighter - та же проблема. Видимо, что-то таится в SynEditHighlighter.pas, потому что UniHighlighter кажется тоже его юзает.
PM MAIL   Вверх
Krott
Дата 2.8.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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;


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

PM MAIL   Вверх
ta2i4
Дата 3.8.2009, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо!
PM MAIL   Вверх
ta2i4
Дата 8.8.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Что-то мне подсказывает, что это не очень хорошее решение.
PM MAIL   Вверх
Krott
Дата 9.8.2009, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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

Удачи!
PM MAIL   Вверх
ta2i4
Дата 9.8.2009, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Разработчик 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).

PM MAIL   Вверх
Krott
Дата 9.8.2009, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

The problem is that in SynEdit a word=identifier.


Вот об этом я и говорил)
Разработчик UniSynEdit лишь подтвердил мои слова. Надеюсь, что функций, использующих IsIdentChar всё-таки не так много, в этом случае исправление не займёт много времени.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | SynUniHighlighter и SynEdit | Следующая тема »


 




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


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

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