Undo Konzept
-
Hallo,
ich bin auf der Suche nach einem Undo-Konzept. Ich habe schon etwas gebastelt, und das klappt bisher soweit ganz gut, jedoch habe ich ein Problem mit dem zu großen Overhead. Bisher speichere ich einzelne Int-Werte in einem struct ab und speichere dort noch ein Flag.
Mein struct besteht schon aus 3 verschiedenen Datentypen: Einem Pointer, einem Int-Wert und einem Int-Flag.
Das ist mir ein bisschen zuviel Overhead, oder ist das in Ordnung? Wie läuft das denn bei einem Texteditor? Bei einigen wird der Verlauf ja tatsächlich zeichenweise 'gespeichert'.
Bye, donnerCobra
-
Speichere die Daten in einer LIFO-Struktur (Stack).
-
In Qt gibt es ein Undo/Redo-Framework
Kannst dich da ja mal inspirieren lassen:
http://qt.nokia.com/doc/4.6/qundo.html
Die Examples dazu nicht verpassen
-
Ich weiss jetzt nicht, wie das gängige Texteditoren machen, aber grundsätzlich brauchst du ja ein Objekt mit abhängig vielen Daten für jede Aktion, du machen kannst. Nützlich ist da das Command Pattern.
Unser Prof hat da eine Stunde drüber was erzählt:
http://se.inf.ethz.ch/teaching/2009-H/eprog-0001/slides/18_undo.pdfWenn du willst kannst du ja die ganze Vorlesung hören: (lecture 12.2)
http://se.ethz.ch/teaching/2009-H/eprog-0001/english_index.html#lectureslides
-
Danke für eure Hilfe!!
Auf das Command Pattern bin ich bisher auch gestoßen und fand ich bisher auch super. Nur hier bin ich mir halt nicht sicher ob der Overhead klein genug ist.
Wenn ich in einem Texteditor über einer Stunde rumtippe protokolliert er auch restlos alles.
Aber ich werde mir das Pattern nochmal antun, eventuell habe ich ja was übersehen.
Bye, donnerCobra
-
Naja. Also vor allem bei Text würde ich nach einem Weilchen probieren die einzelnen Tastendrücke zusammen zu fassen und das ganze strings speichern, respektive dann auch rückgängig machen zu lassen. (Wenn ich mich nicht täusche habe ich das verhalten auch schon gesehen). Obwohl ich mir vorstellen kann, dass man Text recht einfach Undoen kann. Solange nur getippt wird kannst du anstatt da den üblichen Overhead mit Speichern welcher Buchstabe das war usw. einfach auslassen und das letzte Zeichen löschen.
Und die restlichen Aktionen, die so in einem Editor passieren denke ich sind nicht so hochfrquent, wie das tippen. Das sollte denke ich schon recht viel bringen.
-
Solange nur getippt wird kannst du anstatt da den üblichen Overhead mit Speichern welcher Buchstabe das war usw. einfach auslassen und das letzte Zeichen löschen.
Grandios! Auf die Idee bin ich gar nicht gekommen. Danke!
-
DonnerCobra schrieb:
Solange nur getippt wird kannst du anstatt da den üblichen Overhead mit Speichern welcher Buchstabe das war usw. einfach auslassen und das letzte Zeichen löschen.
Grandios! Auf die Idee bin ich gar nicht gekommen. Danke!
Manchmal liegt die Lösung so nahe.

-
Solange nur getippt wird kannst du anstatt da den üblichen Overhead mit Speichern welcher Buchstabe das war usw. einfach auslassen und das letzte Zeichen löschen.
So wird aber kein Redo nach dem Undo möglich sein. Das gehört ja eigentlich auch zu einer vollständigen Undo-Lösung meiner Meinung nach.
-
musicman schrieb:
Solange nur getippt wird kannst du anstatt da den üblichen Overhead mit Speichern welcher Buchstabe das war usw. einfach auslassen und das letzte Zeichen löschen.
So wird aber kein Redo nach dem Undo möglich sein. Das gehört ja eigentlich auch zu einer vollständigen Undo-Lösung meiner Meinung nach.
Ja, aber da nimmt man dann einfach das löschen als Aktion und speichert diese Daten. Das sollte nicht all zu viel Overhead geben, da man meist nicht so viel löscht und wenn doch, dann ganze Absätze o.ä und da vermindert sich der Overhead dann wieder auf einen string zu speichern.