undo realisieren
-
mich würd ja mal stark interessieren, wie man eine art "undo" realisiert!!
ich wäre dankbar für jede anregung!
-
ich lege immer einen verlauf der befehle an. also ein array das speichert welche programmbefehle mit welchen optionen aufgerufen wurden (als string).
bei jeder befehlsausführung erweitere ich das array. und beim rückgängig machen führe ich dann jeweils das gegenteil von dem obersten befehl aus und lösche den obersten eintrag.
-
klevere idee, probier ich direkt mal aus.
danke!!!!für die idee
-
Also ich habe eine Basisklasse Command und leite mir bestimmte Kommandos davon ab (InsertCommand, DeleteCommand, MoveCommand, VarChangeCommand<typename T> etc.). Die Kommandos haben alle die Methoden Exec und Undo die jeweils virtuell sind. Nun habe ich noch eine Klasse UndoManager in der ich bei einer Aktion eine Command auf den Undo-Stapel (ich verwende dafür eine deque) lege und bei einem Undo diesen auf den Redo-Stapel verschiebe. Wenn nun etwas auf Redo-Stapel liegt und ich eine Aktion ausführe wird dieser geleert. Ich kann auch eine Kapazität angeben wenn ich will und sorge aufgrund der Eigenschaften der deque dafür, dass nur eine bestimmte Anzahl Kommandos auf dem Stapel liegt. Ich finde diese Methode besser als die von EnERgYzEr beschriebene...
-
warum verwendest du denn einen deque und kein stack?

-
http://www.kasparsoft.de/UndoRedo/download.htm
hilfsklassen
-
Original erstellt von <Newbie>:
warum verwendest du denn einen deque und kein stack?
Ich verwende Heap. Die Pointer darauf befinden sich in einer deque. Hat den Vorteil: Ist dynamisch und kann am Anfang und am Ende pop und push machen... Wie willst du das mit Stack realisieren du Schlaumeier? Ständig Commands rumkopieren? Is'n bisschen langsam, oder? Globale Variablen? Is'n bisschen scheiße, oder? Auf dem Heap liegt alles irgendwo und ich kann mit Pointern arbeiten. Man muss die Klasse nur richtig implementieren, damit man keine Memory-Leaks verursacht
.
-
@MaSTaH
Wie willst du das mit Stack realisieren du Schlaumeier? Ständig Commands rumkopieren? Is'n bisschen langsam, oder?
So abwegig ist die Idee nicht, wenn man nur Text- oder Zeichenfunktionen rückgängig machen will. Das soll ja entgegengesetzt dem geschehen, wie man es vorher ausgeführt hat.
-
Meine private Klasse ist aber universell einsetzbar. Für einzelne Zeichenoperationen kann man sicher ein einfacheres Undo/Redo realisieren. Meine Klasse kam in der Hauptsache bei einem grafischen Layout-Editor zum Einsatz. Wenn man ein Edit/RichEdit etc. benutzt hat man doch eh schon Undo und Redo (naja, das beim Edit ist scheiße)...
-
Gibt es auch eine strukturierte Lösung? Weil mit dem Array ist das ja so ohne weiteres nicht möglich in z.B. einem RichEdit, wenn man über mehrere Zeilen etwas löscht oder editiert.
hat jemand ne Ahnung wie man sowas programmiert? Oder eine Lösugn parat?

gruss,
~code_pilot