PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Undo- und Redofunktion



Gartenzwerg
25-02-2004, 19:00
hi,
ich habe mittels Qt und der Klasse QTable eine Tabelle erstellt. Nun möchte ich, dass man gewisse Änderung rückgängig und wiederholen kann. Ich habe im Moment nur keine Idee, wie ich an die Sache heran gehen könnte.
Angenommen ich würde immer nur die Zelle speichern, die verändert wurde und deren neuen Inhalt, ergibt sich recht schnell das Problem, was geschehen soll, wenn mehrere Zellen gelöscht oder hinzugefügt werden? Ich könnte natürlich auch immer die ganze Tabelle für jeden Bearbeitungsschritt im Speicher halten, aber nach einiger Arbeitszeit mit dem Programm wäre der dann wohl voll. Wie könnte ich also eine Undo- und Redofunktion realisieren?

Tschau Gartenzwerg

SumpfMonsterJun
25-02-2004, 20:56
Hier hilft das Befehlsmuster weiter.

Wenn Du es nich nicht hast, folgendes Buch kaufen, Du wirst damit soviel lernen wie im ganzen Programmiererleben vorher nicht:

http://www.amazon.de/exec/obidos/ASIN/3827318629/qid=1077742491/sr=2-1/ref=sr_aps_prod_1_1/302-9548351-2552805

Gruss, SMJ

Gartenzwerg
26-02-2004, 06:25
hi,
danke für den Tipp, aber kann mir nicht irgendjemand eine Art Lösungsvorschlag oder online-Literatur dazu geben o.ä.?

Tschau Gartenzwerg

SumpfMonsterJun
26-02-2004, 11:49
Hi,

die zugrundeliegende Idee ist, schon die auszuführende Aktion zu abstrahieren:

class Befehl
{
virtual FuehreAus() = 0;
virtual MacheRückgängig() = 0;
}

class AendereZelle : public Befehl
{

virtual FuehreAus()
{
Frage GUI, welche Zelle angeklickt ist (kann evtl. über einen Slot im Befehl implementiert sein)
Sichere den Zustand der Zelle
setze neuen Zelleninhalt
}

virtual MacheRückgängig()
{
Hole den Zustand der Zelle und setze ihn
}

private:
Zustand der Zelle (Wert, Zeile, Spalte);

}

Dann mußt Du eine Liste von Befehlsobjekten anlegen:

List< Befehl *> Befehlsliste;

Jedesmal, wenn Du eine Änderung ausführst, kopierst Du das Befehlsobjekt und hängst
es an die Liste an.

NeuerBefehl = Kopie von Befehl in der GUI-Klasse
Befehlsliste.HängeAn( NeuerBefehl )

Um nun Undo zu machen traversierst Du die Liste:

Befehl = Befehlsliste.GibAktuellesElement()
Befehl.MacheRückgängig()
Befehlsliste.GeheZuVorherigemElement()

für Redo traversierst Du die Liste vorwärst:

Befehl = Befehlsliste.GibNächstesElement()
Befehl.FühreAus()

Durch die Abstraktion von Befehl kannst Du auch beliebige andere Befehle hinzufügen außer Änderung, ein Befehl zur Auswahl, zum Drucken etc.

Makrorekorder werden oft wie oben beschrieben implementiert.

Gruss, SMJ

Gartenzwerg
03-03-2004, 13:56
hi,
danke, dein Lösungsvorschlag funktioniert wie gewünscht.

Tschau Gartenzwerg