Реализация Отменить / Повторить в TextArea - PullRequest
3 голосов
/ 02 декабря 2009

Мне интересно, как реализовать функцию отмены повтора с помощью TextArea. У меня уже работает функционал фреймворка undoredo, теперь у меня два вопроса.

  1. Когда я запускаю / останавливаю новую команду отмены / повторения, например, когда пользователь нажимает отмену, как далеко я иду назад.
  2. Как мне реализовать это (1.) В обычной TextArea

Мое мышление: Я думаю, что я должен создать новую команду отмены, когда что-нибудь, кроме алфавита + пробел ударил. Чтобы сделать это, я бы использовал событие keyDown и проверил, является ли ключ буквенно-цифровым, если нет, я сброслю команду.

Звучит хорошо?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2009

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

Я думаю, что лучшим подходом было бы прослушивать событие «изменение» в элементе управления (которое запускается всякий раз, когда содержимое изменяется при вводе пользователем), и просто выдвигать полное содержимое элемента управления (его «текст» или «htmlText») атрибут) с каждым событием изменения в буфер отмены (массив строк). Я предполагаю, что использование памяти не является проблемой (вероятно, нет, в зависимости от ожидаемого размера содержимого элементов управления и количества уровней отмены).

Таким образом, вы реализуете отмену / повтор, просто копируя соответствующее состояние элемента управления (в основном перемещаясь вверх и вниз по массиву) в буфере отмены обратно в элемент управления.

«Правильный» подход заключается в отслеживании фактических правок и будет значительно более сложным.

1 голос
/ 02 декабря 2009

1.) Вы должны прослушивать событие Event.CHANGE в TextField и создавать шаг истории при каждом запуске события. Шаг истории в вашем случае состоит из двух значений: старого и нового. Старый - это значение TextField до изменения, новый - это его значение после изменения.

2.) Ваша история - это последовательность действий, или вы можете использовать Шаблон памятного подарка . Я думаю, что действия намного проще в использовании. У действия истории есть два метода: undo () и redo (). Таким образом, в undo () вы должны сказать textField.text = oldContent, а в методе redo () вы скажете textField.text = newContent. Вашей истории также понадобится указатель на текущее действие.

3.) Чтобы было немного лучше. Вы не должны слушать только Event.CHANGE, а вместо этого прослушивать первый CHANGE, а затем следующий FOCUS_OUT для этого TextField. В этом случае шаг истории создается только после того, как я прекращаю редактировать TextField. Но это зависит от вашего TextField и от того, как вы хотите распространять шаги истории. Многострочное TextField не должно создавать шаг истории только для FOCUS_OUT:)

1 голос
/ 02 декабря 2009

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

Как вы думаете, ваши пользователи должны будут отменить несколько шагов? Если это так, то вы можете захотеть иметь историю (например, Paint .NET) и разрешить бесконечные отмены. В противном случае просто запомните последнее выполненное действие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...