tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
478
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    LukeS LukeS ist offline Mitglied Gold
    Registriert seit
    Apr 2004
    Beiträge
    128
    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
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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ß
    Geändert von sheel (14.12.10 um 01:14 Uhr) Grund: Tippfehler
     

  3. #3
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    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.
     
    hihi = -h²

  4. #4
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.802
    Blog-Einträge
    5
    Zitat Zitat von Shakie Beitrag anzeigen
    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
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  5. #5
    LukeS LukeS ist offline Mitglied Gold
    Registriert seit
    Apr 2004
    Beiträge
    128
    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
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Man kann das Command Design Pattern (http://en.wikipedia.org/wiki/Command_pattern) dafür verwenden.

    Falls du Undo/Redo Funktionen hast, dann brauchst du natürlich keine boolsche Variable, dann mußt du nur schauen ob der Undo-Puffer leer ist.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.802
    Blog-Einträge
    5
    Zitat Zitat von deepthroat Beitrag anzeigen
    Falls du Undo/Redo Funktionen hast, dann brauchst du natürlich keine boolsche Variable, dann mußt du nur schauen ob der Undo-Puffer leer ist.
    Vorausgesetzt der Undo-Puffer ist nicht größenbeschränkt, was in manchen Fällen aber nicht praktikabel ist.

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Matthias Reitinger Beitrag anzeigen
    Vorausgesetzt der Undo-Puffer ist nicht größenbeschränkt, was in manchen Fällen aber nicht praktikabel ist.
    Hatte ich nicht erwähnt, dass mein Undo-Puffer auf einem unendlichen Band gespeichert ist...?!

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Twinsetter Twinsetter ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    95
    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.
     

  10. #10
    Avatar von RudolfG
    RudolfG RudolfG ist offline Mitglied Brokat
    Registriert seit
    Jul 2006
    Ort
    Gummersbach (NRW)
    Beiträge
    337
    Zitat Zitat von Twinsetter Beitrag anzeigen
    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!

    Zitat Zitat von Twinsetter Beitrag anzeigen
    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.


    Zitat Zitat von Twinsetter Beitrag anzeigen
    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
     
    Technologien
    (Gute) Grundkenntnisse: HTML, CSS
    Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 21.08.08, 16:10
  2. Wysiwyg Änderungen speichern
    Von tommycush im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 26.01.07, 00:55
  3. Photo Impact 8 - Änderungen nach speichern
    Von jensjensen1977 im Forum Sonstige Grafik-Programme
    Antworten: 0
    Letzter Beitrag: 30.04.05, 20:05
  4. Änderungen in Tabelle - Speichern
    Von shok im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 16.06.04, 11:36
  5. Antworten: 1
    Letzter Beitrag: 09.01.04, 10:02