На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Реализация отмены действия , WindowsForms
    Как осуществить отмену действий в текстовом редакторе?
    Есть предположение, что нужно реализовать буфер, сохраняющий последовательность действий и возвращающий при необходимости тип действия на n-ом шаге и состояние редактора. В перспективе будет что-то вроде стека, отображающего последовательность действий. При переходе от одной позиции стека - к другой будет происходить переход к указанной точке в буфере и производиться последовательность действий расположенных между этими точками. По-моему как-то мутарно.
    Как обычно такие вещи реализуются? Кто имеет опыт, поделитесь пожалуйста.
      Я бы предложил не использовать стековый подход. Сдаётся мне, это очень долго будет прокручивать всю историю с конца до начала.


      Я бы тебе предложил простой List<Action>, с действиями которые сериализуются, что то типа этого:

      ExpandedWrap disabled
            [Serializable]
            public abstract class Action
            {
                
            }
         
            [Serializable]
            public class CursorMovedLeft : Action
            {
                public readonly int CurrentPosition;
                public readonly int Offset;
            }
         
            [Serializable]
            public class SelectedTextChanged : Action
            {
                public readonly int StartPosition;
                public readonly int Length;
            }


      Что, бы не прокручивать изменения целиком, сделай опорные состояния, которые запомнят текущие данные редактор, такие как текст, положение курсора, выделенный текст.
        beetlewar, советую почитать - юолее чем исчерпывающее руководство + примеры.
        http://www.rsdn.ru/article/dotnet/backforward.xml
          TerraGhost, одного списка явно недостаточно, поскольку нужно делать функциональность для 2 действий: Undo и Redo, по-этому нежны стеки, и кроме того не один а два.

          В первый стек(Undo) вписуються последовательность действий. Во второй стек(Redo) вписуються из первого данные для которых была выполнена отмена(Undo). И наооборот при операции Redo данные передаються из стека Redo в стек Undo. При действиях пользователя (кроме команд Undo) стек Redo стираеться.
          Я себе представляю именно такой механизм.

          Думаю стоит объединить мое описание и паттерн Command
            ArrayList-а за глаза хватит. Одного причем
              Обычно Undo/Redo операции реализуются применением шаблона проектирования Kоманда (Command pattern).
                Цитата
                ArrayList-а за глаза хватит. Одного причем

                Как же ты собираешся "помнить" отмененные действия, чтобы им можно было сделать потом Redo

                Цитата
                Обычно Undo/Redo операции реализуются применением шаблона проектирования Kоманда (Command pattern).

                И я про это :yes:
                  Путем хранения в одном аррейлисте объектов с ссылками друг на друга...

                  Хотя можно даже еще проще - составить класс, объект которого может ссылаться на несколько других таких же объектов и строить из них дерево изменений. Ненужное удалять целыми ветками, между действиями бегать по ссылкам
                    ArrayList? :) а зачем тогда List<T> придумали?
                      Спасибо за советы
                        Цитата Miha_Dnepr @
                        ArrayList? :) а зачем тогда List<T> придумали?

                        Чтобы писать меньше было =)))) Шутка. Просто привык я к нему =)
                          Цитата
                          Чтобы писать меньше было

                          Вот как раз не верно. В ArrayList нету строгой типизации, соответственно приходиться часто писать дополнительный код для контроля типов. Кроме того ArrayList значительно уступает в производительности списку List<T> из-за упаковки и приведения типов.

                          По-этому настоятельно рекомендую использовать List<T> вместо ArrayList'а
                            А вот и попробую! =)
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0642 ]   [ 16 queries used ]   [ Generated: 21.10.25, 12:28 GMT ]