AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Treeview frage

Ein Thema von Kellerassel · begonnen am 29. Jul 2010 · letzter Beitrag vom 29. Jul 2010
Antwort Antwort
Kellerassel

Registriert seit: 31. Aug 2003
Ort: NRW
24 Beiträge
 
Delphi 2010 Professional
 
#1

Treeview frage

  Alt 29. Jul 2010, 08:18
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
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
Auf jede komplizierte Frage gibt es eine kurze knappe Antwort, die falsch ist.

Geändert von mkinzler (29. Jul 2010 um 08:30 Uhr) Grund: Delphi-Tags eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Treeview frage

  Alt 29. Jul 2010, 08:39
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

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler

Geändert von xZise (29. Jul 2010 um 08:43 Uhr) Grund: Hmmm so jetzt mit vernünftigen Eingabefeld passt wieder alles!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.069 Beiträge
 
Delphi 12 Athens
 
#3

AW: Treeview frage

  Alt 29. Jul 2010, 08:44
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

(OK, rekursiv kann man es auch machen ... und hoffentlich hat der TE ein "neueres" Delphi, welches das For-In schon kennt)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (29. Jul 2010 um 08:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Treeview frage

  Alt 29. Jul 2010, 08:57
[...]och menno, immer diese codeverratenden Spielverderber [...] 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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Kellerassel

Registriert seit: 31. Aug 2003
Ort: NRW
24 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Treeview frage

  Alt 29. Jul 2010, 10:15
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?





ah käse die leerzeichen werden rausgelöscht nu stimmt die Baumstruktur nicht. Aber ich hoffe ihr versteht wie ich das meine
Auf jede komplizierte Frage gibt es eine kurze knappe Antwort, die falsch ist.
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#6

AW: Treeview frage

  Alt 29. Jul 2010, 11:06
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.
  Mit Zitat antworten Zitat
Kellerassel

Registriert seit: 31. Aug 2003
Ort: NRW
24 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Treeview frage

  Alt 29. Jul 2010, 11:21
wie geht das mit dem eigenen Index abspeichern?
Auf jede komplizierte Frage gibt es eine kurze knappe Antwort, die falsch ist.
  Mit Zitat antworten Zitat
Kellerassel

Registriert seit: 31. Aug 2003
Ort: NRW
24 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Treeview frage

  Alt 29. Jul 2010, 13:19
Ach du meine Güte

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

Das macht die ganze Sache ja um 100000 einfacher



Danke an alle die geantwortet haben
Auf jede komplizierte Frage gibt es eine kurze knappe Antwort, die falsch ist.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 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