@Interface

Возможно ли (и как если возможно?) получить разницу (diff) текстового поля по onChange?

Есть проблема: хочется получить в собитии onChange какого-нибудь текстового компонента внесенную пользовотелем разницу с предыдущей версией.

Например:
Поле Memo1 содержит:
"Hello world!",
дальше пользователь вносит изменения и становится:
"Hello my world!"

т.е. добавлено слово "my":

"Hello my world!"

Как эффективно узнать, что именно было изменено? Можно сравнивать текст до и после и находить разницу известными алгоритмами, но этот способ в данном случае мне не подходит, потому что видится неэффективным.

Хотелось бы как-то отслеживать операцию которую делает пользователь и исходя из нее получать diff.
Например: навесить обработчик на onKeyUp (при вводе символов или стирании посредствам delete или backspace).
Однако, помимо ввода с клавиатуры есть также копирование, drag-n-drop и прочие, что делает такой способ довольно громоздким.

Может есть способ навесить обработчик на скажем что-то такое:
procedure OnTextAdd(OpType: Boolean; Str: String; Pos: Integer); 
//.. где OpType - добавление или удаление текста, Str - сам текст
// Pos - позиция в исходной строке, где произведено изменение


Возможно есть какие-то готовые компоненты реалиующие это?
  • Вопрос задан
  • 398 просмотров
Решения вопроса 1
@zedxxx
Посмотрите в сорцы компонента SynEdit (замена стандартного Memo). Компонент весьма продвинутый и там есть нужная вам логика: при любом изменении текста запоминается дифф для Undo операции (TSynEditUndoList).

Пример, как оно там используется:
// add to undo list
fUndoList.AddChange(Item.ChangeReason, Item.ChangeStartPos,
  Item.ChangeEndPos, Item.ChangeStr, Item.ChangeSelMode);

И я думаю, что в любом другом компоненте, с вменяемым Undo, должно быть что-то похожее.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы