Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Откат (undo)  (Прочитано 14110 раз)
0 Пользователей и 9 Гостей смотрят эту тему.
Alex White
Участник

ua
Offline Offline
Пол: Мужской

« : 29-10-2003 15:04 » 

В проге необходимо сделать откат. Кто это уже писал, помогите плз теоретически (а лучше докой или сорцом).

mailto:alex_white@bk.ru
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 29-10-2003 15:48 » 

Доки не будет - весь откат делается ручками...

Алгоритм прост...
Ты делаешь запоминание последних действий, скажем ведшь кольцевой буфер, на 100 картинок в графическом редакторе...
Запоминаешь параметры изменения картинки произведенные пользователем.
При выборе undo выбирешь обратное записанным параметрам действие.
В списке меняешь текущий указатель в списке действий на один шаг назад и т.д.

При это остается возможность для redo и все как у белых людей.

Реакцию на Alt+backspace для undo закрепляешь в акселераторах аппликации.

Да - наверняка при работе с связкой Документ+Вид (Doc+View) связывая структуру объекта документ с синхронизацией есть встроенный для undo но я его не знаю - не использовал никогда...
Даже если его нет, то можно делать список структур, который ты можешь держать.

Если ты обратишь внимание для работы с документом Word обязательно создает temp file для работы с ним, куда скидывает и сам файл и всю служебную инфу - тебе undo информацию никто не мешает дерджать там же - если тебе надо....


Еще добавлю,что меня счас сильно видимо поправят - для стандартных объектов СОМ тоже наверняка есть свои простые механизмы...
Опять таки я их тоже не знаю - никогда с документами не работал.
Записан

А птичку нашу прошу не обижать!!!
NetRaider
Гость
« Ответ #2 : 30-10-2003 00:25 » 

Цитата

В проге необходимо сделать откат. Кто это уже писал, помогите плз теоретически (а лучше докой или сорцом).


Читай "Паттерны проектирования" GoF
Записан
Alex White
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #3 : 06-11-2003 10:30 » new

Гром, именно таким образом я и собирался поступить, только совершенное действие хотел хранить в объекте, который, в свою очередь, хранится в стеке(или списке, неважно). Вот только у меня такой вопрос. Пишу на VC++6, Doc+View. Есть ли там какой-нить встроенный объект для запоминания последнего действия? Насколько мне известно, в Делфе такая штука есть. Не хотелось бы изобретать велосипед.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 06-11-2003 10:33 » 

В данном случае всё зависит от редактора, который используется для редактирования данных, а не от типа проекта. Например CEdit может такое делать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Alex White
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 06-11-2003 10:42 » 

Ну, у меня как раз свой редактор... Чтож, придется самому. 8)
Спасибо всем, кто принял участие. Ну а я приступаю...
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #6 : 06-11-2003 13:21 » 

Alex White, сообщай о протекающей работе - интерсно всегда как, кто реализует...
Записан

А птичку нашу прошу не обижать!!!
Alex White
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #7 : 06-11-2003 13:38 » 

Для начала у меня будет 1 объект, который будет уметь делать 1 undo + 1 redo. В проге юзер может сделать ну примерно 30 разных (качественно) действий.
Я описал enum {action1 ... actionN}, и метод SaveAction(action, params[что собственно сохранить]).
Значить, уже написал интерфейс класса, научил откатывать одно действие, разумеется самое простое. Улыбаюсь  в общем, процесс пошел.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #8 : 06-11-2003 13:41 » 

Ого - шустро...
Записан

А птичку нашу прошу не обижать!!!
Alex White
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #9 : 10-11-2003 15:49 » 

Промежуточные итоги.
Все действия, связанные с редактированием, уже умеем. Вот только не ясно, как поступать в случае, если юзер захочет (а он захочет :? ) удалить один из объектов, которые собственно редактируются. Ведь для редактирования параметров объектов в метод SaveAction() передается указатель на редактируемый объект. Что делать ?
Записан
Serega
Гость
« Ответ #10 : 10-11-2003 17:01 » 

Используй указатели с подсчетом ссылок
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 11-11-2003 08:48 » 

Попробуй запомнить указатель удаляемого объекта (это просто 32-битное число). При откате тебе надо создать объект, а потом пробежать список откатов и опросить их на предмет наличия запомненного указателя, если таковой имеется, то присваеваешь ему новый указатель, типа:

Action n-1: SaveAction(pObject->ChangeColor())
Action n   : SaveAction(delete pObject) pRememberObject = pObject
...
Undo   n :   RestoreAction(pNewObject = new MyObject() )
for each Action - if(pNewObject==pRememberObject) pRememberObject = pNewObject;

Undo n-1 : Restore(pRememberObject)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines