Unlogisch - oder ?!?
-
Hallo,
ich bin's mal wieder - mit meinem TreeView!Ich habe in mein Prog. eine Bearbeiten>Rückgängig-Funktion eingebaut, die so funktioniert (funktioieren soll): Wird irgendeine Änderung am TreeView vorgenommen, wird die Funktion ChangeProperties aufgerufen, und zwar noch vor der Tatsächlichen Änderung. ChangeProperties speichert dann alle TreeNodes in eine ArrayList. Anschließend wird die gewünschte Änderung durchgeführt. Soll diese wieder rückgängig gemacht werden, wird der TreeView gelöscht (mit TreeView1->Nodes->Clear()) und dann aus der ArrayList der vorherige Zustand wiederhergestellt.
Das funktioniert aber nur wenn die Änderung einen Knoten der 1. Ebene betrifft!
Knoten (Z.B. Löschen & wiederherstellen möglich) | +-Unterpunkt (wiederherstellen unmöglich!)
-
void ChangeProperties(void) { ChildWindow * tempChildWindow = static_cast<ChildWindow *>(this->ActiveMdiChild); if (tempChildWindow->glArray) { tempChildWindow->glArray->Clear(); } for (int i = 0; i < tempChildWindow->treeView1->Nodes->get_Count(); i++) { tempChildWindow->glArray->Add(static_cast<Object *>(tempChildWindow->treeView1->Nodes->Item[i])); } }
-
Was willst du uns damit sagen?
-
Passt toll zu C# / .Net !!!!!
-
Shade Of Mine schrieb:
Was willst du uns damit sagen?
Nun, ich habe ein Problem mit dem Rückgängigmachen von Benutzereingaben. Und zwar funktioniert das Beschriebene nur, wenn sich die Änderung auf eine Wurzel bezieht (diese z.B. gelöscht wird).
Wenn ich nun einen Untergeordneten Knoten einfüge, müsste dieser nach Bearbeiten>Rückgängig wieder verschwinden, das ist jedoch nicht der Fall.
Könnte das vielleicht etwas mit der ArrayList zu tun haben? (Gehen vielleicht Informationen über untergeordnete Knoten verloren?)
fffffff schrieb:
Passt toll zu C# / .Net !!!!!
C# und .NET
Fragen zur neuen Sprache C#, zu den Funktionen und Abläufen, Anwendungen und Befehlen. Außerdem der Anlaufpunkt zu Fragen rund um die .net-Plattform. Fragen zu den IDEs gehören nicht hier rein (Bedienung/Installation/... von VC++.NET/2003 -> VC++ Forum).
-
Reiner MFC-Code - nix .net ! *blindeshuhn*
-
fffffff schrieb:
Reiner MFC-Code - nix .net ! *blindeshuhn*
Also wie MFC sieht es auch nicht aus.
Ist das Managed C++ @ NeuDabei?
-
Das ganze ist ne Windows-Froms-Anwendung. Und laut MSDN ist das Managed ... auch wenn das aus dem Quelltext nicht sofort ersichtlich ist.
Ich hatte schon in einem früheren Beitrag gefragt ob ich hier mit C++ richtig bin. Da hieß es Fragen zu .Net gehören hierhin, auch wenn die Sprache nicht c# sonder c++ ist.
Noch mal zu meinem TreeView: Ich möchte ja eigentlich nichts weiter, als zur Laufzeit, jeweils vor einer Benutzereingabe, eine Kopie der Nodes erstellen sodass, der Benutzer per Str-Z seine letzte Aktion rückgängig machen kann.
Dass zeigt die Funktion "ChangeProperties".Funktioniert alles top - solange nur die Wurzeln Betroffen sind. Geht es um untergeordnete Einträge, klappt es nicht mehr.
Hab alles ausprobiert was mir einfällt, aber es erscheint mir einfach nicht logisch! - hoffe jemand versteht mich ...
@Shade Of Mine: Sorry, hab mich zuerst nen bisschen ungenau ausgedrückt.
-
hi,
wenn ich das richtig sehen, dann speicherst du die Tree-Node-Zeiger in deinem array ab.
wenn du jetzt innerhalb des baumes irgendetwas veränderst, wirkt sich das auch auf die nodes innerhalb deines arrays aus, weil es ja genau die selben sind (eben nur ein zeiger auf die node, die verändert wird)
somit hat du quasi nie eine echte sicherheitskopie deines baums.grüsse
-
Ja, das klinkt plausibel!
Das würde auch erklären warum man nur das Hinzufügen/Entfernen rückgängig machen kann!
Bleibt mir nur noch die Frage, wie ich anstatt eines Pointers eine konkrete Variable bekomme, die wirklich eine Sicherungskopie enthält?
Ich weiß nicht wie das bei C# funktioniert, aber bei C++ werden, seit dem es das .net gibt, die ganzen Var. so deklariert:
ArrayList * glArray = new ArrayList();
D.h. ich bekomme sowieso immer nur einen Verweis auf die entsprechende Variable ...
-
NeuDabei schrieb:
D.h. ich bekomme sowieso immer nur einen Verweis auf die entsprechende Variable ...
Und ein
Foo* p=new Foo(7);
Foo* p1=new Foo(*p);geht nicht?
Dann nimm doch p.clone();
-
Super, danke!!
Mit der Funktion "Clone()" hat sofort alles funktioniert!!
hier noch mal die verbesserte Funktion ...
private: void ChangeProperties(void) { ChildWindow * tempChildWindow = static_cast<ChildWindow *>(this->ActiveMdiChild); this->mItemRueckgaengig->Enabled = true; if (tempChildWindow->glArray) { tempChildWindow->glArray->Clear(); } if (tempChildWindow->glNColl) { tempChildWindow->glNColl->Clear(); } for (int i = 0; i < tempChildWindow->treeView1->Nodes->get_Count(); i++) { tempChildWindow->glArray->Add(static_cast<Object *>(tempChildWindow->treeView1->Nodes->Item[i]->Clone())); // :bulb: } }