
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.60] |
![]() |
|
Сообщ.
#1
,
|
|
|
Как осуществить отмену действий в текстовом редакторе?
Есть предположение, что нужно реализовать буфер, сохраняющий последовательность действий и возвращающий при необходимости тип действия на n-ом шаге и состояние редактора. В перспективе будет что-то вроде стека, отображающего последовательность действий. При переходе от одной позиции стека - к другой будет происходить переход к указанной точке в буфере и производиться последовательность действий расположенных между этими точками. По-моему как-то мутарно. Как обычно такие вещи реализуются? Кто имеет опыт, поделитесь пожалуйста. |
Сообщ.
#2
,
|
|
|
Я бы предложил не использовать стековый подход. Сдаётся мне, это очень долго будет прокручивать всю историю с конца до начала.
Я бы тебе предложил простой List<Action>, с действиями которые сериализуются, что то типа этого: ![]() ![]() [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; } Что, бы не прокручивать изменения целиком, сделай опорные состояния, которые запомнят текущие данные редактор, такие как текст, положение курсора, выделенный текст. |
Сообщ.
#3
,
|
|
|
beetlewar, советую почитать - юолее чем исчерпывающее руководство + примеры.
http://www.rsdn.ru/article/dotnet/backforward.xml |
Сообщ.
#4
,
|
|
|
TerraGhost, одного списка явно недостаточно, поскольку нужно делать функциональность для 2 действий: Undo и Redo, по-этому нежны стеки, и кроме того не один а два.
В первый стек(Undo) вписуються последовательность действий. Во второй стек(Redo) вписуються из первого данные для которых была выполнена отмена(Undo). И наооборот при операции Redo данные передаються из стека Redo в стек Undo. При действиях пользователя (кроме команд Undo) стек Redo стираеться. Я себе представляю именно такой механизм. Думаю стоит объединить мое описание и паттерн Command |
Сообщ.
#5
,
|
|
|
ArrayList-а за глаза хватит. Одного причем
|
![]() |
Сообщ.
#6
,
|
|
Обычно Undo/Redo операции реализуются применением шаблона проектирования Kоманда (Command pattern).
|
Сообщ.
#7
,
|
|
|
Цитата ArrayList-а за глаза хватит. Одного причем Как же ты собираешся "помнить" отмененные действия, чтобы им можно было сделать потом Redo Цитата Обычно Undo/Redo операции реализуются применением шаблона проектирования Kоманда (Command pattern). И я про это ![]() |
Сообщ.
#8
,
|
|
|
Путем хранения в одном аррейлисте объектов с ссылками друг на друга...
Хотя можно даже еще проще - составить класс, объект которого может ссылаться на несколько других таких же объектов и строить из них дерево изменений. Ненужное удалять целыми ветками, между действиями бегать по ссылкам |
Сообщ.
#9
,
|
|
|
ArrayList?
![]() |
Сообщ.
#10
,
|
|
|
Спасибо за советы
|
Сообщ.
#11
,
|
|
|
Цитата Miha_Dnepr @ ArrayList? ![]() Чтобы писать меньше было =)))) Шутка. Просто привык я к нему =) |
Сообщ.
#12
,
|
|
|
Цитата Чтобы писать меньше было Вот как раз не верно. В ArrayList нету строгой типизации, соответственно приходиться часто писать дополнительный код для контроля типов. Кроме того ArrayList значительно уступает в производительности списку List<T> из-за упаковки и приведения типов. По-этому настоятельно рекомендую использовать List<T> вместо ArrayList'а |
Сообщ.
#13
,
|
|
|
А вот и попробую! =)
|