Werte rückgängig machen



  • Ich habe einen Button "Eingabe rückgängig machen", weiss aber nicht, wie ich das ganze schreiben soll. Ursprünglich war der Button gedacht, alle Eingaben zu löschen, was aber nicht sehr sinnvoll ist, da ja nur die falsche Eingabe rückgängig gemacht werden soll.

    Was ist ein Undo/Redo Schalter und wo kann ich eventuell darüber nachlesen?

    Danke

    Franz


  • Mod

    Es geht hier nicht darum wie ein Schalter funktioniert sonder um eine Methode, wie Deine Daten verwaltet werden.

    Packe Deine Daten in eine eigene Klasse.
    Führe Methoden ein Wie Buchung und Storno.
    Dann kannst Du einfach eine Liste mitführen was gebucht wurde, und kannst einfach schrittweise die Operation über die Funktion Storno auch wieder rückgängig machen.



  • Und wie muss ich das machen? Ein neues Formular oder eine Exeltabelle anlegen?
    In dem Programm habe ich bereits eine eigene Klasse angelegt, in der die ganzen Variablen abgelegt sind. Kann ich diese verwenden oder muss ich eine neue Klasse anlegen?

    Grüsse

    Franz



  • Das Tankstellending hättest du dir vielleicht lieber als Projekt bauen lassen sollen 😕

    Never ending story 😃



  • Ideologisch motiviertes Bastelwerk, halbherzig zusammengeschustert durch weltfremde Langzeitstudenten mit Taxischein, hat keinerlei Chance, will man sich tagtäglich aufs Neue den Herausforderungen der Globalisierung erfolgreich stellen.



  • Euere unqualifizierten Äusserungen hättet ihr euch sparen können! Nicht jeder kann so ein Genie wie ihr sein.

    ... und ich habe gedacht, in diesem Forum wären nur engagierte Mitglieder!



  • Franz Hembera schrieb:

    ... und ich habe gedacht, in diesem Forum wären nur engagierte Mitglieder!

    Dir wurden bereits die passenden Antworten gegeben:

    Du musst dir die Einzelschritte merken (in einer oder zwei Listen, unten mehr dazu). Dazu müssen deine "Einzelschritte" aber in irgendeiner sinnvollen Weise gekapselt werden.

    Entweder füllst du die Buchungen in einer Liste und bei jeder Aktion berechnest du neu (empfehle ich nicht), bei Redu kopierst du den letzten Eintrag, bei Undo entfernst du den letzten eintrag.

    Oder (imho besser, da generischer einsetzbar - falls nicht nur Buchungen mit Redu/Undo behandelt werden sollen) du suchst mal nach dem Begriff "Funktoren". Jede deine Aktionen wird in 2 Funktoren gekapselt - Einen Funktor der die Aktion durchführt und einen für das Rückgängigmachen. Dann füllst du zwei Listen, in die eine tust du die Funktoren die diese Aktionen durchführt (und rufst die einmalig aus), in die andere der Funktor mit der Rückgängigmachen-Funktionalität. Für den weiteren Ablauf (Redu/Undo) lass ich dich mal selbst grübeln.

    cu André



  • @ asc

    Danke für Dein Posting. Wird wohl noch eine ganze Weile dauern, bis ich's kapiert habe. In meinem Alter tut man sich halt mit dem Lernen nicht mehr so leicht. Bin aber froh, von Euch Unterstützung zu bekommen!

    Nochmals danke und Grüsse

    Franz



  • Franz Hembera schrieb:

    Danke für Dein Posting. Wird wohl noch eine ganze Weile dauern, bis ich's kapiert habe. In meinem Alter tut man sich halt mit dem Lernen nicht mehr so leicht.

    Ich präsentiere dir mal ansatzweise eine Möglichkeit (Mit zwei Listen, über eine abstrakte Basisklasse):

    // Irgendeine Klasse die den aktuellen Stand verwaltet
    class Kassenbuch {
      // ...
    };
    
    class IAktion {
      public:
        virtual void Start() = 0;
        virtual ~IAktion() {};
    };
    
    class BuchungsAktion : public IAktion {
      private:
        Kassenbuch* kassenbuch;
        double buchungsBetrag;
    
      public:
        BuchungsAktion(
          Kassenbuch* kassenbuch,
          double buchungsBetrag)
        : kassenbuch(kassenbuch),
          buchungsBetrag(buchungsBetrag)
        {
        }
    
        virtual void Start()
        {
          // Buchung durchführen...
        }
    };
    
    class SkontoAktion : public IAktion {
      private:
        Kassenbuch* kassenbuch;
        double buchungsBetrag;
    
      public:
        BuchungsAktion(
          Kassenbuch* kassenbuch,
          double buchungsBetrag)
        : kassenbuch(kassenbuch),
          buchungsBetrag(buchungsBetrag)
        {
        }
    
        virtual void Start()
        {
          // Skonto durchführen...
        }
    };
    

    Dies sollte dir schon einmal einen Anfang ermöglichen (In beiden Listen Arbeitest du über die Basisklasse IAktion)...

    In den abgeleiteten Objekten musst du dir soviele Informationen merken, das damit die Aktion ausführbar ist. Wenn du nun eine Buchung durchführst, legst du auf die eine Liste die "Buchungsaktion" ab (und führst diese einmal über Start aus, du willst ja Buchen), in die andere Liste legst du das passende Gegenstück ab (die SkontoAktion).

    Bei einem Redu musst du in beiden Listen jeweils das Letzte Objekt kopieren, und das Objekt aus der, ich sage mal "Positivliste" einmalig ausführen (Start()). Bei Redu führst du das letzte Objekt aus der Reduliste aus, und entfernst aus beiden Listen anschließend das letzte Objekt.

    cu André
    P.S: Das hat aber nichts mit MFC zu tun, sondern ist eine allgemeine C++ Problematik.



  • @ asc

    Danke für Dein Beispiel. Werde mich mal auf meine Hammelbeine machen und versuchen, dieses in meiner Anwendung umzusetzen.

    Habe trotzdem moch eine Frage:

    In meinem Programm gibt es die virtuellen Funktionen "GetEntry(), InsertEntry() und ClearEntry()". Kann ich diese dazu benutzen?

    Danke und Grüsse

    Franz



  • Franz Hembera schrieb:

    Habe trotzdem moch eine Frage:

    In meinem Programm gibt es die virtuellen Funktionen "GetEntry(), InsertEntry() und ClearEntry()". Kann ich diese dazu benutzen?

    Das Problem ist, das du eine Historie erzeugen musst (Daher die Listen) und das du dir in jedem Element die Aktion merken musst die auszuführen ist. Was du dann konkret in diesen Redo/Undo-Objekten (Sprich: was für eine Implementierung in der Start-Methode in meinen Beispiel steht) aufrufst liegt an dir, die Schnittstelle muss aber so definiert sein, das du diese über ein Basisobjekt aufrufen kannst. Vorteil daran ist aber, das du wirklich beliebige Aktionen für Redo/Undo definieren kannst (Jeweils eigene Ableitung der Basisklasse).

    cu André



  • Tut mir leid, aber ich kann damit nichts anfangen. Soweit sind meine Kenntnisse noch nicht gediehen.
    Vielleicht kann man mir das noch etwas verständlicher machen?

    Danke und Grüsse

    Franz


Anmelden zum Antworten