Реализация технологии Undo/Redo в приложениях

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Vanovich
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 25.05.2007 (Пт) 18:08
Откуда: Красноярск

Реализация технологии Undo/Redo в приложениях

Сообщение Vanovich » 25.05.2007 (Пт) 18:15

А задумывался ли кто-нибудь, как это устроено в образцовых (по крайней мере, позиционирующих себя таковыми) приложениях, типа MS Word, Excel да и самой Visual Studio 2005 в конце концов?

А ведь технология-то весьма полезная! Как она организована? Кто знает? Какие предположения, или быть может, однозначный рецепт есть? Как это сделать используя .NET технологию?
Спасибо за информацию.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 25.05.2007 (Пт) 18:44

Есть задержка, если юзер достаточно долго ничего не писал, то его действия сохраняются. От сохраненного документа получается несколько точек между которыми записаны действия пользователя. Считай с самого начала документа пишем макрос, разбивая его на части по времени. Когда надо откатить - восстанавливаем до нужного. Если "макросов" слишком много переносим статичную копию документа по времени вперед.

Ну или как вариант то же самое, но сохраняем во времени каждое состояние полностью. Фотошоп подозреваю делает именно так (не для всего документа конечно). Может и остальные тоже.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.05.2007 (Пт) 19:32

Задержка точно не при чём. Если я за пять секунд сделаю тыщу разных действий, то они и в историю запишутся как тыща разных действий.

Один из методов реализации: очередь из объектов, реализующих интерфейс (Накатить, Откатить). Компактно, и не требует снятия полных копий с документа.
Изображение

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 25.05.2007 (Пт) 19:43

tyomitch
Задержка нужна преимущественно чтобы реализовать ввод текста. Если ты за пол секунды введешь два абзаца, то логичнее писать их в очередь как два абзаца, а не как кучу букв по одной. Собсно для этого и только. Согласен остальные действия действительно берутся "по одному"

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.05.2007 (Пт) 19:59

Если я введу два абзаца с интервалом в минуту между нажатиями клавиш, они всё равно лягут в историю одним действием. (Хочешь -- проверь.) Имеет значение только то, что между нажатиями не было других действий.

Возможность реализовать откат есть у любого действия: в худшем случае оно может внутри себя сохранить копию исходного документа. Гораздо чаще этого не потребуется.
Изображение


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 57

    TopList