Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Treeview mit daten füllen (https://www.delphipraxis.net/105682-treeview-mit-daten-fuellen.html)

Real_Thunder 27. Dez 2007 13:23


Treeview mit daten füllen
 
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

DeddyH 27. Dez 2007 13:26

Re: Treeview mit daten füllen
 
Schau Dich mal hier um, der Source ist ja dabei. Hope this helps.

generic 27. Dez 2007 17:32

Re: Treeview mit daten füllen
 
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.

Pfoto 27. Dez 2007 17:56

Re: Treeview mit daten füllen
 
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

DeddyH 28. Dez 2007 10:56

Re: Treeview mit daten füllen
 
Die von mir verlinkte Komponente basiert auch auf dem Virtual StringTree ;)

generic 28. Dez 2007 18:30

Re: Treeview mit daten füllen
 
Zitat:

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

Pfoto 28. Dez 2007 19:45

Re: Treeview mit daten füllen
 
Danke für den Hinweis generic!

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

Gruß
Pfoto

Real_Thunder 28. Dez 2007 22:25

Re: Treeview mit daten füllen
 
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.

Nugi89 16. Feb 2015 12:22

AW: Treeview mit daten füllen
 
wie kann ich einer Node einen Dateipfad hinterlegen? steh zurzeit etwas aufm Schlauch:cry:

DeddyH 16. Feb 2015 12:30

AW: Treeview mit daten füllen
 
VST oder Standard-TreeView? Und soll der Pfad als Anzeige dienen oder als Wert hinterlegt werden?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 Uhr.
Seite 1 von 2  1 2      

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