Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualTreeView, einen Node nach Record-Feldinhalt suchen (https://www.delphipraxis.net/29446-virtualtreeview-einen-node-nach-record-feldinhalt-suchen.html)

Kostas 9. Sep 2004 10:24


VirtualTreeView, einen Node nach Record-Feldinhalt suchen
 
Hallo Zusammen,


ich habe einen TreeData Record mit folgender Struktur:

TTreeData = record
FCaption: String;
FBold: Boolean;
FFahrzeugID: integer;
FFarbe:Integer;
end;

Jedes Node hat die gleiche Struktur und die FFahrzeugID ist eindeutig.
Wie kann ich das Node mit einer bestimmten FFahrzeugID suchen um
in das Feld FFarbe den wert zu setzen?

Gruß Kostas

CenBells 9. Sep 2004 10:29

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche
 
hallo,

dafür machst du eine schleife.
Hat dein baum mehrere Ebenen, dann musst du den aufruf eventuell rekursiv machen.

Hier ein kleiner anfangshinweis
Delphi-Quellcode:
...
LNode := deintree.getfirst;
while assigneD(LNode) do begin
  // mach was mit den daten des baumes
  LNode := LNode.nextSibling;
end;
Gruß
Ken

Gruber_Hans_12345 9. Sep 2004 10:33

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche
 
brauchst nicht rekursiv machen !

wennst folgendermassen vorgehst :

Delphi-Quellcode:
LNode := deintree.getfirst;
while assigneD(LNode) do begin
  // mach was mit den daten des baumes
  // ... deiintree.GetNodeData(LNode);
  LNode := LNode.next;
end;
Gruss
Hans

Kostas 9. Sep 2004 10:50

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche
 
Danke für die schnelle Antwort.

Ich hätte erwartet das eine Methode gibt einen Node
zu finden anhand der Daten.
In meinem Fall ist es wirklich nicht schlimm weil ich nur
wenig Einträge im TreeView gibt. Aber was währe wenn ich
im TreeView mehrere Tausend Nodes währen!

Gruß Kostas

Gruber_Hans_12345 9. Sep 2004 10:54

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche
 
bei Bedarf kannst dir ja den Node in den Record dazuspeichern, dann brauchst gar nicht zu suchen !

Igotcha 9. Sep 2004 11:21

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche
 
Zitat:

Zitat von Kostas
Ich hätte erwartet das eine Methode gibt einen Node
zu finden anhand der Daten.

Ich habe dazu eine Funktion gefunden, die genau das Gewünschte vollzieht. Ich benutze diese in meinen Anwendungen, da ich recht viele Einträge in meinen VTVs habe.

Ich habe mir in meinen Knotendaten zu jedem Node den Parent vermerkt (der eine ID hat). Ich benutze die Funktion, um an den Root-Knoten später die Kinder ranzuhängen.

Mußt Du natürlich noch an Deine Bedürfnisse anpassen.

Delphi-Quellcode:
function TfrmMain.FindNodeByData(aTree: TBaseVirtualTree;
  aID: Integer): PVirtualNode;
var
   NodeData: pIstData;
begin
   Result := aTree.GetFirst;
   while Assigned(Result) do
   begin
     NodeData := pIstData(aTree.GetNodeData(Result));
     if (NodeData^.FGid = aID) AND ((NodeData^.FGTyp=0) OR (NodeData^.FGTyp=1)) Then
       Exit;
     Result := aTree.GetNext(Result);
   end;
end;
Aufgerufen wird das später dann bei mir so:

Delphi-Quellcode:
position:=atree.AddChild(FindNodebyData(atree, myData.FGid));
myPosData:=atree.GetNodeData(position);
usw.

CenBells 9. Sep 2004 12:29

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche
 
Zitat:

Ich hätte erwartet das eine Methode gibt einen Node
zu finden anhand der Daten.
Das geht nicht. Der Tree ist allgemein gehalten, schließlich ist es jedem selbst überlassen, was er im tree speichert. Daher kann man auch keine "generische" Funktion anbieten, die nach dem inhalt des baumes sucht. ;)

Zitat:

Zitat von Igotcha

Ich habe dazu eine Funktion gefunden, die genau das Gewünschte vollzieht. Ich benutze diese in meinen Anwendungen, da ich recht viele Einträge in meinen VTVs habe.

Ich habe mir in meinen Knotendaten zu jedem Node den Parent vermerkt (der eine ID hat). Ich benutze die Funktion, um an den Root-Knoten später die Kinder ranzuhängen.

Wo verwendest du denn den parent???
Also irgendwie sieht der code vom prinzip her genauso aus, wie der von mir. ;)


Gruß
Ken

Igotcha 9. Sep 2004 12:42

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche
 
Delphi-Quellcode:
 if (NodeData^.FGid = aID) AND ((NodeData^.FGTyp=0) OR (NodeData^.FGTyp=1)) Then
aID ist der übergebene Parameter und die ID des Parents.

Dazu muß ich evtl. noch folgendes sagen:

Ich lese aus der Datenbank alle Knoten auf einmal ein ein (Roots und Childs), also nicht erst Hauptknoten und dann evtl. auf Klick die entsprechenden Unterknoten. Wobei alle Knoten in der DB eine ID haben (wenn Unterknoten, dann steht ID des Parents drin, ansonsten "0". ID ist ein von mir vorgegebener Bezeichner -> Kostengruppennummer), ob sie Haupt-oder Unterknoten sind. Beim Select sortiere ich danach und vermeide so, dass evtl. Unterknoten angehängt werden sollen, zu denen es noch keinen Hauptknoten gibt.

Meine Aufbauroutine sieht dementsprechend so aus:

1. Hauptknoten? -> Hinzufügen
2. Unterknoten? -> Zu Hauptknoten mit entsprechender ID hinzufügen

Bei 2. benutze ich dann die o.g. Funktion, um im VTV den entsprechenden Haupt-Knoten zu finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 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