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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Моргание и сброс выделения в SynEdit'е при вызове SynUni.Reset(), Выделено из темы "UniHighlighter 2.0 Beta4" 
:(
    Опции темы
Sep.
Дата 25.8.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2Vitalik
Есть вопрос: Я добавляю программно в подсветке в стиль типа Keylist слова. Теперь мне нужно вызвать SynUni.Reset чтобы перерисовалось все с новыми ключевыми словами?
Если так , то нельзя ли сделать чтобы Reset не сбрасывал выделение, а то даже если пишешь
Код

  i:=edit.SelStart;
  j:=edit.SelEnd;
  synuni.Reset; 
  edit.SelStart:=i;
  edit.SelEnd:=j;

видно моргание =(
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Seldon
Дата 26.8.2006, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



от моргания может избавить SynEdit.(Begin|End)Update или WM_SETREDRAW
и, как я понимаю, после обновления правил мало вызвать Reset - надо ещё сбросить хайлайтер у санэдита:
Код

SynEdit.Highlighter:=nil;
SynEdit.Highlighter:=SynUni;

по крайней мере так сделано в дизайнере.

я тут ниже темку создал с вопросами, там есть аналогичный вопрос, будем надеяцца что Виталик в воскресенье ответит, как и общеал smile
--------------------
MiBEditor v2.Alpha 10 - Программерский редактор
PM MAIL WWW   Вверх
Vitalik
Дата 3.9.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

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



Изрядно поэкспериментировав с разными комбинациями (Reset/Refresh/Prepare/BeginUpdate/Highlighter=nil и т.п.) я пришел к выводу, что с простым SynUni.Reset() и последующим SynEdit.Refresh() все замечательно работает smile
Ниже прикладываю простой проект-примерчик, показывающий работоспособность следующего кода:
Код
var
  SelStart, SelEnd: Integer;
begin
  //добавление нового KeyList'а в подсветку
  SynUniSyn1.MainRules.AddKeyList(...);
  SelStart := SynEdit1.SelStart;
  SelEnd   := SynEdit1.SelEnd;
  SynUniSyn1.Reset();
  SynEdit1.Refresh();
  SynEdit1.SelStart := SelStart;
  SynEdit1.SelEnd   := SelEnd;   
end;


Цитата(Seldon @  25.8.2006,  23:05 Найти цитируемый пост)
и, как я понимаю, после обновления правил мало вызвать Reset - надо ещё сбросить хайлайтер у санэдита:

Это (как и многое другое в том месте) делалось, наверное, "на всякий случай". Либо же действительно это со старыми версиями компонента было необходимо. Проверив сейчас эти моменты я на данный момент прихожу к выводу, что эти строки не нужны..

Цитата(Seldon @  25.8.2006,  23:05 Найти цитируемый пост)
я тут ниже темку создал с вопросами, там есть аналогичный вопрос, будем надеяцца что Виталик в воскресенье ответит, как и общеал

Прошу прощения, что не удалось ответить ни в то воскресение, ни много позже. По приезду в Харьков у меня только вчера появился интернет в общаге (там была произведена серьезная реорганизация сети). Сейчас попробую вникнуть в вопросы поднятые в той теме smile



Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  ResetWhenAddKeywords.zip 270,58 Kb
PM MAIL WWW ICQ YIM   Вверх
Sep.
Дата 3.9.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
я пришел к выводу, что с простым SynUni.Reset() и последующим SynEdit.Refresh() все замечательно работает

Никаких нареканий по поводу работоспособности и не было =) Вопрос был в другом:
Можно ли сделать так, чтобы выделение не сбрасывалось? Потому как даже если его восстанавливать, то видно моргание.
Я вообще нашел, что вместо SynUni.Reset() и SynEdit.Refresh() достаточно использовать только SynUni.Prepare(). И выделение лучше сохранять через блок, потому как SelStart и SelEnd будут некорректны в некоторых случаях при TrimTrailingSpace := enabled
Код

  BB:=edit.BlockBegin;
  BE:=edit.BlockEnd;
  SynUni.Prepare;
  edit.BlockBegin:=BB;
  edit.BlockEnd:=BE;

--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Vitalik
Дата 3.9.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

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



Цитата(Sep. @  3.9.2006,  13:47 Найти цитируемый пост)
Потому как даже если его восстанавливать, то видно моргание.

В том то и дело, что в том примере моргания нету  smile 

Цитата(Sep. @  3.9.2006,  13:47 Найти цитируемый пост)
Можно ли сделать так, чтобы выделение не сбрасывалось?

А вот это уже не знаю.. Если моргания и не будет, то может быть этого будет достаточно? Если нет, то не придется ли для этого ковырять SynEdit?..
PM MAIL WWW ICQ YIM   Вверх
Seldon
Дата 3.9.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Sep. @  3.9.2006,  14:47 Найти цитируемый пост)
Я вообще нашел, что вместо SynUni.Reset() и SynEdit.Refresh() достаточно использовать только SynUni.Prepare()

да, TSynUni.Prepare вызывает DefHighlightChange который вызывает TCustomSynEdit.HighlighterAttrChanged который вызывает SizeOrFontChanged(True) который вызывает TCustomSynEdit.Invalidate


Цитата(Sep. @  3.9.2006,  14:47 Найти цитируемый пост)
Можно ли сделать так, чтобы выделение не сбрасывалось?

выделение сбрасываецца в результате вызова TCustomSynEdit.ScanRanges (из TCustomSynEdit.HighlighterAttrChanged) т.к. там изменяецца содержимое всех строк (не текст, а Range)


Цитата(Sep. @  3.9.2006,  14:47 Найти цитируемый пост)
И выделение лучше сохранять через блок, потому как SelStart и SelEnd будут некорректны в некоторых случаях при TrimTrailingSpace := enabled

согласен


у меня моргания нет. у тебя какой процессор? может я просто не замечаю моргания... но даже если оно есть, SendMessage(Synedit.Handle,WM_SETREDRAW,1,0) перед обновлением и SendMessage(Synedit.Handle,WM_SETREDRAW,0,0) после должно избавить от него
--------------------
MiBEditor v2.Alpha 10 - Программерский редактор
PM MAIL WWW   Вверх
Sep.
Дата 3.9.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пасибо, WM_SETREDRAW помог. Только SendMessage надо делать в обратном порядке =) Возможно и SynEdit потом подправлю, посмотрю как лучше.
OFF: проц 1.7GHz, но тут дело наверно в том, что это обновление запускается из потока с idle приоритетом, а не из основного потока. А сама прога, это dll модуль... 
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Seldon
Дата 4.9.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



в принципе в тему: при загрузке подсветки в компонент, который уже связан с SynEdit'ом этот SynEdit не обновляецца.
1 путь: расскоментировать эту строку из TSynUniFormatNativeXml.ImportFromStream
Код

  ...
  if AObject is TSynUniSyn then
  begin
    Result := ImportHighlighter(TSynUniSyn(AObject), XMLDocument.DocumentElement);
    //TSynUniSyn(AObject).Prepare(); //TODO: Нужно ли это?.. Может убрать?..
    TSynUniSyn(AObject).FileName := '';
  end
  ...

2 путь: расскоментировать эту строку из TSynUniFormatNativeXmlAuto.ImportFromStream
Код

  ...
  //SynUniSyn.DefHighlightChange(SynUniSyn);
  ...

--------------------
MiBEditor v2.Alpha 10 - Программерский редактор
PM MAIL WWW   Вверх
Sep.
Дата 5.9.2006, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
при загрузке подсветки в компонент, который уже связан с SynEdit'ом этот SynEdit не обновляецца.

Погоди-ка, ты про SynUni.LoadFromFile? У меня нормально все обновляется при этом.
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Sep.
Дата 5.9.2006, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пардон, беру слова назад =)
Не заметил у меня SynEdit.Repaint; все же вызывается из другого места после LoadFromFile.
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Vitalik
Дата 9.9.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

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



Цитата(Seldon @  3.9.2006,  23:26 Найти цитируемый пост)
в принципе в тему: при загрузке подсветки в компонент, который уже связан с SynEdit'ом этот SynEdit не обновляецца.
1 путь: расскоментировать эту строку из TSynUniFormatNativeXml.ImportFromStream
2 путь: расскоментировать эту строку из TSynUniFormatNativeXmlAuto.ImportFromStream

Это было сделано для того, что это обновление не всегда нужно. 
Очень часто бывает нужно просто считать подсветку (или сборник подсветок) и проанализировать информацию, содержащуюся в них (хотя бы те же расширения)
Если после каждого считывания подсветки ее еще и Prepare'ить, то время загрузки подсветок будет крайне велико.
Мне кажется, что лучше уж если требуется именно обновить подсветку для SynEdit, то после SynUni.LoadFromFile просто вызывать SynEdit.Repaint или что-то подобное.

Что скажете? smile
PM MAIL WWW ICQ YIM   Вверх
Seldon
Дата 9.9.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Vitalik @  9.9.2006,  15:21 Найти цитируемый пост)
Очень часто бывает нужно просто считать подсветку (или сборник подсветок) и проанализировать информацию, содержащуюся в них
хм, да, возможно так и лучше. только надо тогда в документации описать этот момент
--------------------
MiBEditor v2.Alpha 10 - Программерский редактор
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | SynUniHighlighter и SynEdit | Следующая тема »


 




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


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

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