AGB  ·  Datenschutz  ·  Impressum  







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

TreeView bestücken

Ein Thema von d.adams · begonnen am 2. Apr 2023 · letzter Beitrag vom 7. Apr 2023
Antwort Antwort
d.adams

Registriert seit: 2. Apr 2023
22 Beiträge
 
#1

TreeView bestücken

  Alt 2. Apr 2023, 16:27
Hallo,

ich muss die Struktur eines TreeView exportieren und an anderer Stelle wieder einlesen. Woran an der Struktur kann ich erkennen was ein aufklappbarer Knoten ist (Level = 0 ?) und welche Unteritems daran hängen?

Zudem die Reihenfolder der Konten und die der dazugehörigen Sub_items?

Gruß
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TreeView bestücken

  Alt 2. Apr 2023, 18:04
Level ist natürlich die Ebene des jeweiligen Items.
0 ganz oben, 1 die ersten UnterItems, 2 die UnterUnterItems usw.

Items, sowie auch SubItems, liegen jeweils im Item.

Zusammenklappen heißt Collapse und Aufklappen Expand.




Delphi-Quellcode:
  TreeView1.Items.Count
  TreeView1.Items[i] // TreeView1.Items.Item[i]

  TreeView1.Items[i].Collapse;
  TreeView1.Items[i].Expand;
  TreeView1.Items[i].Expanded // was es ist

  TreeView1.Items[i].Count
  TreeView1.Items[i][j] // TreeView1.Items.Item[i].Item[j]
  TreeView1.Items[i][j].Expanded

  TreeView1.Items[i][j].Count
  TreeView1.Items[i][j][k] // TreeView1.Items.Item[i].Item[j].Item[k]
  TreeView1.Items[i][j][k].Expanded
  ...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TreeView bestücken

  Alt 3. Apr 2023, 11:56
Hi d.adams

Ein Ausschnitt aus der Prozedur AddNewNode, die dem Treeview einen Ordner- oder Dateiknoten hinzufügt:

Delphi-Quellcode:
begin
  Node := TVFilesExplorer.Items.AddChild(ParentNode, aCaption);
Das fügt einem bekannten Knoten () einen neuen hinzu.
Delphi-Quellcode:
  if aIsdirectory then
  begin
    Node.ImageIndex := 1;
    Node.SelectedIndex := 1;
Die Abfrage auf IsDirectory wurde so von mir hinzugefügt. Das Original von DeddyH prüfte hier auf Node.hasChildren - Dateien haben keine Children (untergeordnete Dateien).

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TreeView bestücken

  Alt 3. Apr 2023, 13:38
Die Abfrage auf IsDirectory wurde so von mir hinzugefügt. Das Original von DeddyH prüfte hier auf Node.hasChildren - Dateien haben keine Children (untergeordnete Dateien).
Leere Verzeichnisse aber auch.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.928 Beiträge
 
Delphi 12 Athens
 
#5

AW: TreeView bestücken

  Alt 4. Apr 2023, 13:42
Wichtig ist das du bei größeren TTreeNodes niemals über "Items[i]" iterierst! sonder immer mit GetFirstSibling, GetNexSibling und GetFirstChild im DFS stil den baum durchläufst!
Auch wiederholtes abfragen von "AbsoluteIndex" sollte man in großen Bäumen nicht durchführen, wenn es nicht sien muss, denn das führt auch zu einem ewigen durch den Baum hangeln....wenn der Baum sehr groß ist.
Am besten man schreibst sich einen Iterator für den Baum um Suchen oder Massenhafte Änderungen oder Kopien von oder an Baumknoten durchzuführen.

Ich hatte mal einen TTreeView immer wieder in einen Cache kopiert, über Items[i].... und daraus wieder hergestellt...Daraus gelernt.. auch "Assign" iteriert einfach über die Items[i]
und dann dauert es ewig bis 2500 Nodes kopiert wurden, weil die getItem metode hinter Items[i] immer von neuem wieder anfängt das I-te Item abzuzählen...
Intern werden dann 3126250 Knoten abgelaufen um 2500 Knoten zu iterieren....
Also Kein Assign, kein AbsoluteIndex, Kein Items.count und kein Items[i] benutzen.
Einen DFS-Iterator benutzen!
Oder einfach nur kleine Bäume verwenden...

Sowas in der art
Delphi-Quellcode:
type
TTreeNodeWorkFunction = reference to Function(aTreeNode:TTreeNode): TTreeNode;
Function ForEachItem(Nodes:TTreenodes; aWorkFunction:TTreeNodeWorkFunction; const LevelMaxFilter:Integer = -1 ):TTreenode;
var currentNode, nextNode:TTreeNode;
Begin
  Function ForThisNode(aNode:TTreenode; aWorkFunction:TTreeNodeWorkFunction; const LevelMaxFilter:Integer = -1):TTreeNode;
  var currentNode, nextNode:TTreeNode;
  Begin
    Result := nil;
    if (LevelMaxFilter = -1) or (Anode.Level < LevelMaxFilter ) then
    Begin
      currentNode := aNode.getFirstChild;
      While assigned(CurrentNode) Do
      Begin
        nextNode := currentNode.getNextSibling;//NextNode Ermitteln für den fall das CurrentNode gelöscht wird
        result := ForThisNode(currentNode,aWorkFunction,LevelMaxFilter);
        if assigned(Result) then
          nextNode := nil; // Bei Suche direkt abbrechen
        CurrentNode := NextNode;//Navigation zum Sibling
      End;
    end;
    if not assigned(Result) then
      Result := aWorkFunction(aNode);
  End;
Begin
  Result := nil;
  currentNode := Nodes.GetFirstNode;
  While assigned(currentNode) do // für alle wurzeln....
  Begin
    nextNode := currentNode.getNextSibling;//NextNode Ermitteln für den fall das CurrentNode gelöscht wird
    Result := ForThisNode(currentNode,aWorkFunction,LevelMaxFilter);
    if assigned(Result) then
      nextNode := nil; // Bei Suche direkt abbrechen
    CurrentNode := NextNode;//Navigation zum Sibling
  End;
end;
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 4. Apr 2023 um 14:07 Uhr)
  Mit Zitat antworten Zitat
d.adams

Registriert seit: 2. Apr 2023
22 Beiträge
 
#6

AW: TreeView bestücken

  Alt 7. Apr 2023, 12:35
Danke für die Hinweise, ich sehe mal wie weit ich damit komme

gruß
Heiko
  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 03:35 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