AGB  ·  Datenschutz  ·  Impressum  







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

Treeview mit daten füllen

Ein Thema von Real_Thunder · begonnen am 27. Dez 2007 · letzter Beitrag vom 16. Feb 2015
Antwort Antwort
Seite 1 von 2  1 2      
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#1

Treeview mit daten füllen

  Alt 27. Dez 2007, 13:23
Ich habe mich nun mal an ein TreeView gewagt...

irgendwie bekomme ich das ding nicht anständig mit daten gefüttert..

also den kram mit addchild etc geht..

problem ist das ich anhand ner db ne baumstrucktur haben will..

also die kernfrage ist, wie ich expliziert nen knoten ansprechen kann, indem ein neues child rein soll...
irgendwie knotennahme oder so geht nicht..
Also nehmen wir an
[0] = 1, [1] = 2, [2] = 3
[4] = 1.1 .....
[7] = 1.1.1 ...........

das ganze soll dann so aussehen;
Delphi-Quellcode:
1
|-1.1
| |-1.1.1
| |-1.1.2
| |-1-1-3
|-1.2
| |-1.2.1
| |-1.2.2
| |-1-2-3
|-1.3
| |-1.3.1
| |-1.3.2
| |-1-3-3
2
|-2.1 ........
und die baumtiefe soll auch dynamisch werden...
jenad eine idee wie es mit der normalen Treeview geht.. oder vielleicht jemand ein toturial zur hand ?

MfG Real Thunder
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Treeview mit daten füllen

  Alt 27. Dez 2007, 13:26
Schau Dich mal hier um, der Source ist ja dabei. Hope this helps.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Treeview mit daten füllen

  Alt 27. Dez 2007, 17:32
brauchst dazu nur 2 Spalten in der Datenbank (+Spalten für deine Daten)
Schlüssel und ParentSchlüssel

ParentSchlüssel = NULL wenn die Knoten sich auf der Root befinden.
Ansonsten der Schlüssel als welchen sich die Daten als Child einhängen sollen.

Das lesen von solchen Strukturen aus der Datenbank ist aber unperformat.
Wenn du dann mal viel Zeit hast, solltest du dir anschauen wie nested Sets funktionieren.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Treeview mit daten füllen

  Alt 27. Dez 2007, 17:56
Hallo Real_Thunder,

vor dem Problem stand ich vor ein paar Tagen auch,
ich habe es so gelöst (mit dem VirtualStringTree von Mike Lischke):

Delphi-Quellcode:
Type
  TBaseTreeObj = class
    Caption: String;
    ID: integer;
    ParentID: integer;
    OrderSeq: integer;
    Level: integer;
  end;

  PTreeData = ^TTreeData;
  TTreeData = record
    TreeObj: TBaseTreeObj;
  end;


[...]

function TVirtualStringTreeHandle.AddNodeByParentID(aParentID: integer; aTreeObj: TBaseTreeObj): PVirtualNode;

  function FindParentNode(ParentID: Integer): PVirtualNode;
  var
    NodeData: PTreeData;
  begin
    Result:= fVST.GetFirst;
    while Assigned(Result) do
    begin
      NodeData:= PTreeData(fVST.GetNodeData(Result));
      If NodeData^.TreeObj.ID = ParentID then
        exit;
      Result:= fVST.GetNext(Result);
    end;
  end;

var
  Data: PTreeData;
  LNode: PVirtualNode;
begin
  If not assigned(aTreeObj) then exit;

  If aParentID = 0 then
    result:= fVST.AddChild(nil) else
    result:= fVST.AddChild(FindParentNode(aParentID));

  fVST.ValidateNode(Result, False);
  Data:= fVST.GetNodeData(Result);
  { TreeObjekt-Pointer zuweisen }
  Data^.TreeObj:= aTreeObj;
end;


function TVirtualStringTreeHandle.BuildTreeFromDataSource(aQuery: TQuery): Boolean;
var
  BaseTreeObj: TBaseTreeObj;
  ParentID: integer;

begin
  fVST.BeginUpdate;
  fVST.Clear;
  try
    with aQuery do
    begin
      while not EOF do
      begin
        { Event abfeuern, um Daten zu holen und TreeObjekt zu erstellen }
        FillTreeObjWithTableData(aQuery, BaseTreeObj);
        // HIER KANNST DU STATT EINES EVENTS DIREKT DIE DATEN AUS
        // DEM AKTUELLEN DATENSATZ DEM KNOTEN ANHÄNGEN
        { Knoten hinzufügen, indem nach Elter-ID gesucht wir }
        AddNodeByParentID(BaseTreeObj.ParentID, BaseTreeObj);
        next;
      end;
    end;
  finally
    fVST.EndUpdate;
  end;
  aQuery.First;
  If fVST.GetFirst <> NIL then
  begin
    FocusedNode(fVST.GetFirst);
    fVST.Expanded[fVST.GetFirst]:= true;
  end;
end;
Erklärung:
Die Datenbank hat wie schon im Beitrag darüber erwähnt, u.a.
die Felder ID und ParentID. Jeder Eintrag weiß also, wem er
gehört.
Du sortierst zuvor die DB nach ID und übergibst die Query
der Funktion "BuildTreeFromDataSource".

Wenn du allerdings Drag & Drop planst, dann ist die Sortierung
nach ID nicht unbedingt mehr gültig; unter Umständen hättest du
dann zuerst den "ChildNode" vor dem "ParentNode".
Aus diesem Grund habe ich noch die Felder "Level" und "OrderSeq"
eingeführt und lasse die Tabelle nach diesen Feldern aufsteigend
sortieren. Nach jedem Drag & Drop müssen diese natürlich
aktualisiert werden.

Der Tree hat bei mir ein Objekt anstatt nur eines Records, damit
ich das Objekt später für andere Verwendung erweitern kann.
Du kannst es natürlich nur über ein Record lösen.

Edit: Du musst dem VirtualStringTree sagen, welche Größe du
an Daten im Knoten übergibst. Zudem gibt es eine fast unüber-
schaubare Anzahl an Einstellmöglichkeiten.
Zur Einführung fand ich dieses Tutorial ganz gut.

Gruß
Pfoto
Jürgen Höfs
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Treeview mit daten füllen

  Alt 28. Dez 2007, 10:56
Die von mir verlinkte Komponente basiert auch auf dem Virtual StringTree
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Treeview mit daten füllen

  Alt 28. Dez 2007, 18:30
Zitat von Pfoto:
Delphi-Quellcode:
Type
  TBaseTreeObj = class
    Caption: String;
    ID: integer;
    ParentID: integer;
    OrderSeq: integer;
    Level: integer;
  end;

  PTreeData = ^TTreeData;
  TTreeData = record
    TreeObj: TBaseTreeObj;
  end;
Schau dir mal das VST Video von Stammtisch #2 an.
Dem Record und den Zeiger kann man sich schenken.

http://www.delphipraxis.net/video#Stammtisch_2
http://www.delphipraxis.net/internal...=817799#817799
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Treeview mit daten füllen

  Alt 28. Dez 2007, 19:45
Danke für den Hinweis generic!

habe mir es gerade mal angeschaut und wieder was dazugelernt...

Gruß
Pfoto
Jürgen Höfs
  Mit Zitat antworten Zitat
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#8

Re: Treeview mit daten füllen

  Alt 28. Dez 2007, 22:25
So habe es nun mit der Standard Komponente und nem record gemacht und es läuft.

im record ist
id:integer;
name: string;
position: TTreeNode;
parent:integer;

und schon weiß jeder Baumzweig an welchem zweig er dran ist.
  Mit Zitat antworten Zitat
Nugi89

Registriert seit: 27. Jan 2015
21 Beiträge
 
#9

AW: Treeview mit daten füllen

  Alt 16. Feb 2015, 12:22
wie kann ich einer Node einen Dateipfad hinterlegen? steh zurzeit etwas aufm Schlauch
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Treeview mit daten füllen

  Alt 16. Feb 2015, 12:30
VST oder Standard-TreeView? Und soll der Pfad als Anzeige dienen oder als Wert hinterlegt werden?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:16 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