Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Treeview frage (https://www.delphipraxis.net/153320-treeview-frage.html)

Kellerassel 29. Jul 2010 07:18


Treeview frage
 
Halli Hallo

ich komme nicht weiter vielleicht kann mir jemand helfen.

ich benutze aus der delphi easy Helper folgende funktion um den Pfad in einem Treeview Darzustellen



Delphi-Quellcode:
Function GetNodePath(ANode: TTreenode; ADelimiter: Char='\'): String;
Begin
Result := '';

while assigned(ANode) do
begin
 Result := ADelimiter + aNode.Text + Result;
 ANode := ANode.Parent;
end;

if Result <> '' then
 Delete(Result,1,1);
End;



Nun versuche ich eine Funktion zu schreiben die das umgekehrte macht.
Das heist ich über gebe einen String z.B (0/1/0) Also erster Hauptknoten; 2ter unterknoten;erster eintrag

und möchte den Absolutindex des nodes zurückbekommen.

Ich könnte das machen mit
Delphi-Quellcode:
showmessage(inttostr(treeview1.Items[0].Item[1].Item[0].Absolutindex));
das ich aber vorher nicht weiß wie viele ebenen ich übergebe muß das ganze ja dynamisch sein.


Ich steh auf'm Schlauch :?:


wäre sehr dankbar für hilfe

LG
:cheer:

xZise 29. Jul 2010 07:39

AW: Treeview frage
 
Erstmal brauchst du einen Delimiter, woran du den Text teilen kannst.

Wenn du weißt was du da einsetzt, kannst du dann durch den Text gehen, bis das aktuelle Zeichen ein Delimiter ist.

Das Wort was du dann gefunden hast, suchst du dann im aktuellen Node und wenn du das gefunden hast, dann suchst machst du das gleiche nochmal, nur eine Ebene tiefer.

Ungefähr so:
Delphi-Quellcode:
function getNodeToPath(ARoot : TTreeNode; APath : string; ADelimiter : Char) : TTreeNode;
begin
  Result := nil;
  TeilPfad := '';
  // Füge hier so viele Zeichen aus APath an, bis du zum Delimiter kommst

  for child in ARoot.children do
  begin
    if child.name = TeilPfad then
      Result := getNodeToPath(child, Copy(APfad, 1, Length(TeilPfad) + 1), ADelimiter);
  end;
end;
So ungefähr wäre das in Pseudodelphicode :D

MfG
Fabian

himitsu 29. Jul 2010 07:44

AW: Treeview frage
 
in diesem Fall zerlegst du natürlich erstmal den String

- entweder gleich alles über eine Explode-Funktion (in ein Array oder eine StringList)
- oder stück für stück (ersten Delemitter suchen, das Wort davor rauskopieren und dieses alles samt Delemitter aus dem String löschen ... man kann sich auch die Position merken und später nur ab dieser Stelle weitersuchen, statt zu löschen)

dann legst du dir den RootNode (oder einen anderen Ausgangsknoten) in eine Varibable (vom Typ TTreeNode)

1: (eine Schleife)

nun kannst kannst du in diesem Node nach einem Child-Node mit deinem gefundenen Namen/Text suchen

jetzt deinen gefundenen Node in deiner Varibale speichern
> wenn nichts gefunden wurde, dann hier abbrechen, da der Pfad nicht existiert)

und nun geht es bei 1: weiter, falls in dem String noch weitere Namen existieren
> wenn nichts mehr im String ist, dann hier ebenfalls abbrechen und der gesuchte Node steht nun in deiner Variable

[edit]
och menno, immer diese codeverratenden Spielverderber :lol:

(OK, rekursiv kann man es auch machen ... und hoffentlich hat der TE ein "neueres" Delphi, welches das For-In schon kennt)

xZise 29. Jul 2010 07:57

AW: Treeview frage
 
Zitat:

Zitat von himitsu (Beitrag 1038276)
[...]och menno, immer diese codeverratenden Spielverderber :lol: [...] und hoffentlich hat der TE ein "neueres" Delphi, welches das For-In schon kennt)

Wenn nicht dann muss er sich überlegen, was man da macht ;) Deshalb habe ich extra das for-in genutzt ;) Und übrigens müsste er auch klären, wie er zum "Teilpfad" kommt.

MfG
Fabian

PS: Eigentlich wollte ich das mehr pseudocodemäßig schreiben, aber nachdem das zuerst nicht ging (hatte mal den Fennec getestet) musste ich danach auch schiffen ;)
PPS: Ich bin ein Freund von Rekursion. Das ist hier ja so ähnlich, als würdest du wissen wollen, wie der Vater deiner Mutter deines Schwiegervaters des Vaters heißt ;) (sofern sie leben): Du könntest alles selber machen, oder dein Vater fragen der dann den Schwiegervater und so weiter fragt :)

Kellerassel 29. Jul 2010 09:15

AW: Treeview frage
 
Also das mit dem Delimiter is natürlich klar.

was nicht geht ist das suchen nach dem Text des Nodes.
Das Programm laüft später in verschiedenen Sprachen.
Deshalb kann ich nicht nach Text suchen.

Ich erklär mal kurz wieso ich das ganze brauche vielleicht gibt es ja eine viel elgantere Lösung


wenn mein baum so aussieht: (Das in Klammern ist der Absolut index)

+Parameter(0)
+Parameter 1 (1)
Wert A (2)
Wert B (3)
+Einstellungen(4)

habe ich das Problem wenn ich in Paramter hinter wert B noch Wert C schreibe, verschiebt sich mein Absolut Index 4 auf Absolut index 5.
Deshalb möchte ich die einzelnen Punkte nicht mit dem Absolut indes ansprechen, sondern mit eben so einer Struktur wie oben beschrieben (0/0/2).
Denn durch eine änderung in einem Knoten verändert sich die ansprech Syntax der anderen Knoten nicht.

gibt's dafür ne einfache Lösung?


:wink:


ah käse die leerzeichen werden rausgelöscht nu stimmt die Baumstruktur nicht. Aber ich hoffe ihr versteht wie ich das meine

ibp 29. Jul 2010 10:06

AW: Treeview frage
 
Zitat:

Zitat von Kellerassel (Beitrag 1038301)
gibt's dafür ne einfache Lösung?

..mit TreeNode.Item[idx] bekommst du den jeweiligen Kindknoten mit dem index der Ebene. Du musst also von deinem Rootknoten startend durch den Baum laufen....
Bsp:
(0/3/2)
Pseudocode...

TreeNode:=TreeView.TopItem; // knoten 0
TreeNode:=TreeNode.Item[3];
TreeNode:=TreeNode.Item[2];

Das funktioniert aber nur wenn deine Baumstruktur in keiner Ebene umsortiert wird!

Ansonsten würde ich einfach für jeden Knoten einen eigenen Index mit deinen Daten abspeichern.

Kellerassel 29. Jul 2010 10:21

AW: Treeview frage
 
wie geht das mit dem eigenen Index abspeichern?

Kellerassel 29. Jul 2010 12:19

AW: Treeview frage
 
Ach du meine Güte :wall:

Ich wußte nicht das es eine eindeutige id für jedes Node gibt.

Das macht die ganze Sache ja um 100000 einfacher :oops:



Danke an alle die geantwortet haben


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz