|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Sergey Voloshchuk 2:5020/400 16 May 2003 14:33:26 To : Danila Willsky Subject : Re: Undo --------------------------------------------------------------------------------
> Интересно, а как обычно реализовывают поддержку функций Undo/Redo в
> программах? Что-то вроде массива с именами и значениями измененных элементов?
>
Я у себя сделал базовый класс CUndoItem в котором есть чисто виртуальная функция
virtual CUndoItem* Undo(CMyCoolData& md) = 0;
Потом наследуешь от него множество конкретных классов, каждый из которых
отвечает за конкретную операцию редактирования и содержит данные, необходимые
для отмены этой операции.
Перед выполнением каждой операции редактирования создается соответствующий
объект производный от CUndoItem и добавляется в список (list). Обработка кнопки
Undo сводится к извлечению последнего объекта из этого списка и вызове его
функции Undo. В нее передается ссылка на твои данные CMyCoolData&, а как
выполнить отмену каждый объект знает сам.
Кроме того, поскольку класс знает как выполняется отмена, он может создать
другой объект CUndoItem который содержит данные, отменяющие эту отмену, и
возвращает этот объект в функцию обработки кнопки Undo. Она добавляет его в
другой список, который используется обработчиком кнопки Redo. Этот обработчик
работает абсолютно симметрично: вызывают функцию Undo для объекта "своего"
списка и добавляют возвращенное значение в "анти"-список.
Остается добавить, что при добавлении объектов в список Undo при редактировании
(не из обработчика Redo) необходимо очищать список Redo.
--- ifmail v.2.15dev5
* Origin: RTComm.RU (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/879300bec695.html, оценка из 5, голосов 10
|