Ich habe einen Item Baum (Objekt Tree) mit Childs und Parent pro Objekt (Item).
Beispiel:
Code:
-[0]item1
-[1]subitem1
-[2]subsubitem1
-[3]subsubitem2
-[4]item2
-[5]subitem1
-[6]subitem2
-[7]item3
-[8]subitem1
Man stelle sich nun vor, dieser Tree wäre nun geschlossen. Also alle Elemente wären zugeklappt.
Beispiel:
Code:
+item1
+item2
+item3
Nun such ich mir einen Eintrag in der Liste raus z.b. den den ich als [3] markiert habe. Das müsste dann so aussehen:
Code:
-[0]item1
-[1]subitem1
-[2]subsubitem1
-[3]subsubitem2 <- DIESES IST MARKIERT.
+[4]item2
+[7]item3
0, 1, 2 und 3 sind aufgeklappt. 4 und 7 aber nicht, weil diese nicht auf dieser Ebene liegen.
Soweit die theory.
Hier meine Ausgangs Situation:
Ich habe eine Liste von allen Elementen hintereinander (Sortiert von Oben bis Unten) in einer Liste (1-Dimensionales array). Ich durchlaufe Element für Element mit einer for schleife.
Meine Ist-Situation:
Das aktuelle element in der Schleife soll ein weiteres 1-Dimensionales Array (Liste) generieren von allen Elementen die Sichtbar wären. Wie als würde man das Element anlicken während alle zugeklappt sind, und sich nur dann die Elemente aufklappen die auch wirklich davon betroffen wären.
Hätte da wer eine Idee ?
Danke, Final
Zuletzt geändert von Finalspace am Di Feb 02, 2010 17:21, insgesamt 2-mal geändert.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Angenommen, jede Treenode hat eine Eigenschaft Expanded sowie ein Array (oder eine ähnliche Listenstruktur) für alle Kindelemente, sieht der Algorithmus dafür so aus (Pseudocode):
Code:
FetchVisibleNodes(Node, TargetArray)
TargetArray.Append(Node) // Node an das Array anhängen
if Node.Expanded then
for each Child in Node.Children do
FetchVisibleNodes(Child, TargetArray)
Diese Funktion würdest du dann für jede Node der obersten Ebene einmal aufrufen, immer mit dem gleichen Array.
Wenn es dir jetzt auch noch darum geht, herauszufinden, welche Nodes expandiert sein müssen, damit das Element sichtbar ist, brauchst du einen zweiten Durchgang, der vor dem ersten stattfindet und jede Node muss auch noch ihren Parent kennen. Erstmal setzt du bei allen Nodes Expanded auf false, dann machst du wiefolgt weiter:
Code:
MakeNodeVisible(Node)
Node.Expanded = True;
if Node.Parent then // Wenn der Knoten noch einen Elternknoten hat
MakeNodeVisible(Node.Parent)
Wobei du diese Funktion mit der Node, die sichtbar sein soll, aufrufst [unter der Annahme, dass es kein Problem ist, wenn eine Node ohne Children den Expanded-Status bekommt, sonst wäre da noch eine Prüfung notwendig, bzw du rufst MakeNodeVisible für das Elternelement des Knotens auf, der sichtbar sein soll].
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 24 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.