Pregunta

Quiero poner en práctica la opción de deshacer y rehacer (como vemos en MS Word, etc.). ¿Me puede sugerir una estructura de datos para ello, y cómo puedo ponerlo en práctica.?

¿Fue útil?

Solución

No es una estructura de datos, sino un patrón de diseño. Usted está buscando el patrón Comando .

La norma es mantener los objetos de comando en una pila para apoyar deshacer multinivel. Con el fin de apoyar a rehacer, una segunda pila mantiene todos los comandos que hemos deshecho. Así que cuando usted hace estallar la pila de deshacer para deshacer un comando, se presiona el mismo comando que le vino a la pila rehacer. Usted hace lo mismo a la inversa cuando rehacer un comando. Usted hace estallar la pila rehacer y distribuir el comando aparecido de nuevo en la pila de deshacer.

Otros consejos

En realidad, el patrón estándar para esta funcionalidad (banda de los cuatro, incluso) es Memento .

Asimismo, si bien la mayoría de los programas utilizan deshacer / rehacer las pilas, los aficionados de algunos editores de texto prefieren deshacer / rehacer árboles para que no pierdan toda su historia si se deshacen algunos comandos, pruebe una uno nuevo, y cambian de opinión.

Objetivo-C cacao tiene un anwser bien documentado llamado NSUndoManager .

Puede utilizar Patrón de comandos para achive deshacer / rehacer

Compruebe estas muestras:

http://www.codeproject.com/csharp/undoredobuffer.asp

http://www.dofactory.com/Patterns/PatternCommand.aspx

Este es un caso clásico de patrón Comando. A continuación se presenta un ejemplo de implementación de la función de deshacer en Python:

from os import rename
class RenameFileCommand(object):
    def __init__(self, src_file, target_file):
        self.src_file=src_file
        self.target_file=target_file


    def execute(self):
        rename(self.src_file, self.target_file)

    def undo(self):
        rename(self.target_file,self.src_file)



class History(object):
    def __init__(self):
        self.commands=list()
    def execute(self, command):
        command.execute()
        self.commands.append(command)

    def undo(self):
        self.commands.pop().undo()


if __name__=='__main__':
    hist=History()
    hist.execute(RenameFileCommand( 'test1.txt', 'tmp.txt', ))
    hist.undo()
    hist.execute(RenameFileCommand( 'tmp2.txt', 'test2.txt',))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top