forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Undo & Redo (http://forum.boolean.name/showthread.php?t=17593)

Черный крыс 04.12.2012 04:41

Undo & Redo
 
Привет!

На днях появилась задача реализовать Undo<->Redo в своей программе. В голову приходит такая мысль : создать историю, которая будет хранить в себе список совершенных действий, и при Undo вызывать действия - антиподы.

Придется писать парсер всех возможных действий... что то это запарно слишком...

С такой задачей столкнулся впервые.

Может быть существуют менее трудозатратные методики? Если да то поделитесь пожалуйста знаниями =)

jimon 04.12.2012 04:57

Ответ: Undo & Redo
 
если данных совсем немного то можно при каждом действии сохранять всё состояние программы, если данных много то действия и антидействия довольно хороший подход

ABTOMAT 04.12.2012 05:01

Ответ: Undo & Redo
 
Цитата:

Сообщение от Diablo1909 (Сообщение 245712)
Привет!

На днях появилась задача реализовать Undo<->Redo в своей программе. В голову приходит такая мысль : создать историю, которая будет хранить в себе список совершенных действий, и при Undo вызывать действия - антиподы.

Придется писать парсер всех возможных действий... что то это запарно слишком...

С такой задачей столкнулся впервые.

Может быть существуют менее трудозатратные методики? Если да то поделитесь пожалуйста знаниями =)

А все ли действия будут обратимы?

Черный крыс 04.12.2012 16:34

Ответ: Undo & Redo
 
Программа - большая, поэтому сохранять стэйты проблематично.

Цитата:

А все ли действия будут обратимы?
Хотелось, бы... но хрен знает как оно получится на практике... программа - редактор игровых уровней ( анимация, физика и.т.д. )

Также появилась мысль - задействовать скриптовик Lua. После каждого действия генерить Undo и Redo строчки кода на языке Lua. И когда надо обратить\вернуть что-то - то скармливать нужные строки скриптовому движку. Наверно так и поступлю =)

Черный крыс 05.12.2012 00:16

Ответ: Undo & Redo
 
Каркас Undo\Redo для ваших программ. Может кому пригодится.

Код:

rem
        History module
end rem

Function CanUndo:Byte()
        Return Not undoList.IsEmpty()
End Function

Function Undo()
        If undoList.IsEmpty() Then Return
        Local h:THistory = THistory(undoList.RemoveLast())
        h.Undo()
        redoList.AddFirst(h)
End Function

Function CanRedo:Byte()
        Return Not redoList.IsEmpty()
End Function

Function Redo()
        If redoList.IsEmpty() Then Return
        Local h:THistory = THistory(redoList.RemoveFirst())
        h.Redo()
        undoList.AddLast(h)
End Function

Type THistory Abstract
        Method New()
                If Not redoList.IsEmpty()
                        redoList = New TList
                End If
                undoList.AddLast(Self)
                If undoList.Count() > MAX_HISTORY
                        undoList.RemoveFirst()
                End If
        End Method
       
        Method Undo() Abstract
        Method Redo() Abstract
End Type

Const MAX_HISTORY:Int = 100

Global undoList:TList = New TList
Global redoList:TList = New TList



Часовой пояс GMT +4, время: 16:02.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot