AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi VirtualTreeView, einen Node nach Record-Feldinhalt suchen
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualTreeView, einen Node nach Record-Feldinhalt suchen

Ein Thema von Kostas · begonnen am 9. Sep 2004 · letzter Beitrag vom 9. Sep 2004
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

VirtualTreeView, einen Node nach Record-Feldinhalt suchen

  Alt 9. Sep 2004, 11:24
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
  Mit Zitat antworten Zitat
Benutzerbild von CenBells
CenBells

Registriert seit: 30. Mär 2003
Ort: Kiel urspr. Lübeck
176 Beiträge
 
Delphi 7 Professional
 
#2

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche

  Alt 9. Sep 2004, 11:29
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
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#3

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche

  Alt 9. Sep 2004, 11:33
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
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche

  Alt 9. Sep 2004, 11:50
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
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#5

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche

  Alt 9. Sep 2004, 11:54
bei Bedarf kannst dir ja den Node in den Record dazuspeichern, dann brauchst gar nicht zu suchen !
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#6

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche

  Alt 9. Sep 2004, 12:21
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.
  Mit Zitat antworten Zitat
Benutzerbild von CenBells
CenBells

Registriert seit: 30. Mär 2003
Ort: Kiel urspr. Lübeck
176 Beiträge
 
Delphi 7 Professional
 
#7

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche

  Alt 9. Sep 2004, 13:29
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 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
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#8

Re: VirtualTreeView, einen Node nach Record-Feldinhalt suche

  Alt 9. Sep 2004, 13:42
 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.
  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 21:45 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