Speichern, Laden, Rückgängig, Wiederherstellen



  • Hallo zusammen,

    für ein Projekt möchte ich die Funtkionen Speichern, Laden, Rückgängig und Wiederherstellen implementieren.
    Das Projekt besteht aus mehreren Formularen, StringGrids, ComboBoxes, CheckBoxes ... das Übliche halt.

    Sobald das OnChange-Event einer Komponente aufgerufen wird, sollen die Daten zwischengespeichert und für die Funktionen Rückgängig und Wiederherstellen zur Verfügung stehen.
    Außerdem sollen die Daten bei dem Aufruf von Save für die Methode SaveToFile als (xml-) Datei gespeichert werden.

    Nach Möglichkeit möchte ich eine relativ allgemeine Lösung schreiben die ohne großen Aufwand für weitere Projekte genutzt werden kann.
    Für Ratschläge zur generellen Vorgehensweise oder gute Tutorials diesbezüglich wäre ich sehr dankbar. Alles hilft!

    Vielen Dank!

    - Kann ich z. B. automatisch alle TEdits auslesen?
    - Sollte ich eine Klasse mit vectoren mit den Datentypen string, bool, float entsprechend erstellen oder gleich mit new Kopien der Komponenten erzeugen?
    - Gibt es dafür vielleicht sogar eine fertige Komponente? Das sind doch eigentlich grundsätzliche Funktionen fast jeder Anwendung!



  • Holgi schrieb:

    ...
    - Kann ich z. B. automatisch alle TEdits auslesen?
    ....

    Du kannst in einer Schleife über die Components- Eigenschaft in der Form alle TEdits ermitteln und dann deren Inhalt auslesen.



  • Du solltest aber nur die Inhalte speichern und wiederherstellen, nicht die ganzen Controls! Erstelle dir eine Datenklasse, welche du dann für Undo/Redo benutzen kannst.

    Als Komponente habe ich mal für dich gesucht... und gefunden: High-Logic's TUndoAndRedo v1.2.1.



  • Grundsätzlich sieht die Methode jetzt so aus:

    int STEP=-1; // Zähler global in Klasse
    vector< vector<AnsiString> > Edit2D; // Größe wird vorher ermittelt
    
    void UndoRedo::SaveState(TForm* Form){
    	STEP++; 
    	for(int i=0; i<Edit2D.size(); i++){
    		Edit2D[i].resize(STEP+1);
    	}
    	size_t n=0;
    	for(int i=0; i<Form->ComponentCount; i++){
    		if(Form->Components[i]->ClassNameIs("TEdit")){ 
    			Edit2D[n][STEP]=(dynamic_cast<TEdit*>(Form->Components[i])->Text);
    			++n;
    		}
    	}
    }
    

    Danke!


Anmelden zum Antworten