Rich Edit - какая именно часть текста изменилась?
От: Went  
Дата: 07.08.20 13:03
Оценка:
И еще один вопрос по Rich Edit. При изменении текста он посылает уведомление EN_CHANGE. Если документ достаточно большой, то "просто так брать весь текст и целиком отослать его клиенту" не хочется. Хочется вычленить только изменившуюся часть, и дальше уже что надо делать. Можно, конечно, кешировать старое состояние текста и сравнивать с новым, но это все равно огромный оверхед. Есть способ узнать, что именно изменилось в окне редактирования?
Re: Rich Edit - какая именно часть текста изменилась?
От: pilgrim_ Россия  
Дата: 07.08.20 19:15
Оценка: 4 (1)
Здравствуйте, Went, Вы писали:

W>И еще один вопрос по Rich Edit. При изменении текста он посылает уведомление EN_CHANGE. Если документ достаточно большой, то "просто так брать весь текст и целиком отослать его клиенту" не хочется. Хочется вычленить только изменившуюся часть, и дальше уже что надо делать.


Уже плохо помню, но возможно следующая схема подойдет: получить ITextRange на весь документ, получить его дубликат (GetDublicate), оригинальный text-range будет отслеживать все изменения текста, дубликат (вероятно) останется прежним, соотв. изменения получать их диффом. Тут важно понимать, что измениться могут несколько участков текста (напр. при драг-н-дроп текста — удаление и вставка), ну и разумно дифф делать после некоторого таймаута после событий об изменении текста.

W>Можно, конечно, кешировать старое состояние текста и сравнивать с новым, но это все равно огромный оверхед


Имхо без этого не обойтись
Re[2]: Rich Edit - какая именно часть текста изменилась?
От: Went  
Дата: 10.08.20 08:39
Оценка: 1 (1)
Здравствуйте, pilgrim_, Вы писали:

_>Уже плохо помню, но возможно следующая схема подойдет: получить ITextRange на весь документ, получить его дубликат (GetDublicate), оригинальный text-range будет отслеживать все изменения текста, дубликат (вероятно) останется прежним, соотв. изменения получать их диффом.

Ну, в любом случае придется хранить "старую версию", то есть копировать туда-сюда по пол-мегабайта данных, сравнивать эти куски, чтобы узнать, что вписали одну букву... Ну, так, значит так.

_>Тут важно понимать, что измениться могут несколько участков текста (напр. при драг-н-дроп текста — удаление и вставка), ну и разумно дифф делать после некоторого таймаута после событий об изменении текста.

Да, я думаю, раз уже сравнивать весь текст целиком, то можно откладывать это до, например, секунды после последнего изменения. Грубо говоря, если пользователь секунду не печатает — происходит синхронизация.
Re: Rich Edit - какая именно часть текста изменилась?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 05.09.20 18:53
Оценка:
Здравствуйте, Went, Вы писали:

W>И еще один вопрос по Rich Edit. При изменении текста он посылает уведомление EN_CHANGE. Если документ достаточно большой, то "просто так брать весь текст и целиком отослать его клиенту" не хочется. Хочется вычленить только изменившуюся часть, и дальше уже что надо делать. Можно, конечно, кешировать старое состояние текста и сравнивать с новым, но это все равно огромный оверхед. Есть способ узнать, что именно изменилось в окне редактирования?

А как именно будет меняться текст? Только пользователем? Клавитура, мышь, вырезать\копировать\вставить? Или нужно еще отслеживать изменения сторонним кодом? Ну, к примеру через EM_STREAMIN, EM_INSERTIMAGE, EM_INSERTTABLE и.т.д…
Aml Pages Home
Re[2]: Rich Edit - какая именно часть текста изменилась?
От: Went  
Дата: 07.09.20 07:08
Оценка:
Здравствуйте, Carc, Вы писали:
C>А как именно будет меняться текст? Только пользователем? Клавитура, мышь, вырезать\копировать\вставить? Или нужно еще отслеживать изменения сторонним кодом?
Ну, например, еще, чрез ReplaceSel. В принципе, все.

C>Ну, к примеру через EM_STREAMIN, EM_INSERTIMAGE, EM_INSERTTABLE и.т.д…

Нет, без такой экзотики. Это, фактически, редактор кода.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.