Änderungen in einem Dokument detektieren (z. B. für Nachfrage zum Speichern)

LukeS

Erfahrenes Mitglied
Hallo zusammen

Unterdessen habe ich schon ein paar Progrämmchen geschrieben und bin bei einigen immer wieder auf das selbe Problem gestossen.

Ich möchte den Beützer fragen, ob er ein Dokument, dass er schliesst, speichern möchte.
Natürlich soll die Frage nur erscheinen, wenn es Änderungen am Dokument gegeben hat.

Wie geht Ihr vor, um Änderungen am Dokument zu erkennen?

Ich habe da zwei verschiedene Ideen:

1.) Bei jeder Operation am Dokument wird eine Variable (bool) so gesetzt, dass sie eine Änderung am anzeigt.


2.) vom Dokument wird beim Öffnen eine Kopie im Speicher abgelegt. Beim Schliessen des aktuellen Dokuments wird mit der ursprünglichen Version verglichen.

Natürlich haben beide Vorschläge Vor- und Nachteile. Bei 1. muss man daran denken, dass man in jeder Funktion die das Dokument ändert, die Variable, die Änderungen anzeigt, setzt. Bei der 2. Variante braucht man mehr Speicher. Ausserdem muss man beim Speichern des Dokuments die Version im Speicher anpassen.

Wie macht ihr das? Habt ihr noch alternative Ideen? Gibts da irgendwelche verbreiteten Design Patterns?

Asserdem interessiert es mich, wie verschiedene Frameworks/Bibliotheken dieses Problem Angehen. Besonders C# mit Widows Forms und C++ mit Qt.

danke für eure Hilfe!

Gruss LukeS
 

sheel

I love Asm
Ich bin für Variante 1.

Für den Programmierer ist 2. eventuell einfacher, da er nicht immer auf die bool aufpassen muss, aber es geht ja um die Anwender.

Und soo eine Herausforderung ist es ja nun auch wieder nicht, konsequent durch das ganze Programm bools zu setzen :)

Variante 2 ist sowieso grauenhaft.
Memory mal 2, Performance beim Schließen...ohne Worte.

Wenn man partout kein bool willst, könnte man ja was mit einer Checksumme drehen...da bräuchte man wenigstens nicht alles zweimal.
Beim Speichern Checksumme mit in die Datei schreiben, beim Öffnen in einer Variable behalten und beim Schließen vom Dokument im Speicher neu berechnen und mit der Alten Vergleichen.

Gruß
 
Zuletzt bearbeitet:

Shakie

Erfahrenes Mitglied
Wenn man Undo- und Redo-Funktionalität einbaut, dann ist Variante 1 auch nicht so einfach zu implementieren. Denn wenn der Anwender so lange "Undo" drückt, bis alles in dem Zustand ist der zuletzt gespeichert wurde, dann sollte erkannt werden, dass das Dokument derzeit unverändert ist. Ich tendiere aber auch eher zu Variante 1.
 
Wenn man Undo- und Redo-Funktionalität einbaut, dann ist Variante 1 auch nicht so einfach zu implementieren. Denn wenn der Anwender so lange "Undo" drückt, bis alles in dem Zustand ist der zuletzt gespeichert wurde, dann sollte erkannt werden, dass das Dokument derzeit unverändert ist.
Ich sehe da ehrlich gesagt kein Problem. Man muss lediglich den „Verändert“-Zustand mit im Undo-/Redo-Stack speichern (bzw. die Veränderung des Zustandes, je nach Implementierung).

In jedem Fall ist Variante 1 unbedingt vorzuziehen.

Grüße,
Matthias
 

LukeS

Erfahrenes Mitglied
Danke für eure Antworten.

Habe bisher auch immer 1. verwendet. War mir jedoch nicht sicher wie der state of the art so allgemein ist.
Das mit der Checksumme ist auch eine gute Idee.

Vielen dnk nochmal!
Gruss LukeS
 

Twinsetter

Erfahrenes Mitglied
Hallo zusammen!

Ich würde beim Einlesen der Daten eine Checksumme berechnen und diese in einer Variablen speichern.
Jetzt gibt es 2 Möglichkeiten weiter zu verfahren.
1. Die berechnete Checksumme wird jetzt einer weiteren Variable zugewiesen. Bei jeder Änderung der Daten wird die Checksumme neu berechnet und dieser zweiten Variablen zugewiesen. Beim Beenden braucht man beide Variable nur zu vergleichen - sind sie gleich muß nicht gespeichert werden im anderen Falle ja.
2. Die Checksumme wird nur beim Beenden neu berechnet und mit der Anfangschecksumme verglichen. In Abhängigkeit vom Ergebnis wird dann entsprechend vorgegangen.

Ich denke mal beide Varianten haben Vor und Nachteile - man muß es einfach probieren. Man sollte auch noch daran denken falls der User zwischendurch speichert muß man auch die Variablen entsprechend anpassen. Speichern der Daten entspricht in dieser Hinsicht dem Öffnen des Dokumentes.

Ich habs bei meinem Programm aber auch bisher über boolsche Variablen gelöst, da es für meine Belange die einfachste Variante ist.

Schwieriger wird es wenn man zuläßt, daß mehrere Dokumente gleichzeitig geöffnet sein können und auch bearbeitet werden können. Da man dann mit SIcherheit mit einem entsprechend angepassten Datenobjekt arbeitet, würde ich jedes Datenobjekt um zwei Variable ergänzen, die die Checksummen aufnehmen und wahrscheinlich nach Methode 2 (Checksumme bei jeder Änderung aktualisieren) arbeiten . Beim Beenden muß man jetzt nur noch durch alle Datenobjekte itterieren und die Checksummen vergleichen.
 

RudolfG

Erfahrenes Mitglied
1. ... Bei jeder Änderung der Daten wird die Checksumme neu berechnet und dieser zweiten Variablen zugewiesen.

Hast du schon mal daran gedacht, dass die Berechnung der Checksumme auch etwas Zeit kostet? Wenn ich mit zehn-Fingern tippe, wird das Programm nicht nachkommen nach jeder Änderung (also jedem Tastendruck) diese neu zu berechnen. Habe es mit MD5 und SHA-1 mal ausprobiert bei mind. 250 Anschläge in der Minute kommt, das Programm nicht mehr mit!

2. Die Checksumme wird nur beim Beenden neu berechnet und mit der Anfangschecksumme verglichen. In Abhängigkeit vom Ergebnis wird dann entsprechend vorgegangen.

Das ist jedenfalls die klügere Alternative, die ich auch auf in diesem Fall vorziehen würde (ich hätte es auch über eine Bool-Variable gemacht, keine Berechnung nötig!). Hier wird die Berechnung nur einmal gemacht und das reicht völlig aus.


Ich denke mal beide Varianten haben Vor und Nachteile - man muß es einfach probieren.

Den wirklichen Vorteil von Variante 1 kann ich nicht sehen!

Gruß
RudolfG