AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein VirtualStringTree Node anhand des Index ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualStringTree Node anhand des Index ermitteln

Ein Thema von stho · begonnen am 22. Okt 2009 · letzter Beitrag vom 4. Jul 2013
Antwort Antwort
Seite 1 von 2  1 2      
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#1

VirtualStringTree Node anhand des Index ermitteln

  Alt 22. Okt 2009, 09:05
Es gibt die Möglichkeit über VST.AbsoluteIndex(NODE) Den Index eines Nodes herraus zu bekommen.

Nun möchte ich aber den Node anhand des Index (also umgekehrt) ermitteln...

ich suche schon seit einiger zeit den VST nach einer passenden Funktion durch...
Gibt es solch eine Funktion überhaupt?
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.594 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: VirtualStringTree Node anhand des Index ermitteln

  Alt 22. Okt 2009, 09:18
nein - gibt es nicht.

du kannst in einer While-Schleife nur mit Node.NextSibling und Node.PrevSibling solange in dem Level durchgehen, bis Node.Index Deinem Index entspricht.

ggf. sind noch optimierungen möglich, z.b. vom selectierten vor oder zurück starten. Im schlechtesten Fall musst du das ganze Nodelevel durchsuchen
Sven Harazim
--
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#3

Re: VirtualStringTree Node anhand des Index ermitteln

  Alt 22. Okt 2009, 09:22
Vielen Dank für deine Antwort... ich hatte es befürchtet

So eine Komponente... Die hat fast alles! Doch so ne Kleinigkeit hat sie nicht


Argh... nagut, muss ich mir wohl ne schleife basteln oder ne Funktion bauen.
Danke Trotzdem für die Hilfe
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.594 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: VirtualStringTree Node anhand des Index ermitteln

  Alt 22. Okt 2009, 09:31
die schleife ist kein problem und auch bei vielen Nodes sehr schnell:

hier mal ein beispiel:

Delphi-Quellcode:
const
  VST_MOVEDOWN = -5;
  VST_MOVEUP = -6;

class procedure TVirtualTreeviewHelper.SelectNode(_Vst: TBaseVirtualTree;
  _StartNode: PVirtualNode; _IndexToSelect: Integer;_Center : Boolean = true);
begin
  _Vst.ClearSelection;

  if _StartNode = nil then
    _StartNode := _Vst.RootNode.FirstChild;

  if _StartNode = nil then
    exit;

  case _IndexToSelect of
    VST_MOVEDOWN : _IndexToSelect := _StartNode.Index+1;
    VST_MOVEUP : _IndexToSelect := _StartNode.Index-1;
    -1 : exit;
  end;

  while _StartNode <> nil do
  begin
    if Integer(_StartNode.Index) = _IndexToSelect then
    begin
      _Vst.Selected[_StartNode] := true;
      _Vst.FocusedNode := _StartNode;
      _Vst.FocusedColumn := 0;
      _Vst.ScrollIntoView(_StartNode,_Center);
      break;
    end;
    if Integer(_StartNode.Index) < _IndexToSelect then
      _StartNode := _StartNode.NextSibling
    else
      _StartNode := _StartNode.PrevSibling;
  end;
end;
Sven Harazim
--
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#5

Re: VirtualStringTree Node anhand des Index ermitteln

  Alt 22. Okt 2009, 13:24
okay.....


also ich habe das anderst gelöst... kürzer zumindest...
hmmmmmmmmmmmmm

Delphi-Quellcode:
Function TMainForm.GetNodeByIndex(iIndex : Integer) : PVirtualNode;
var
  Node : PVirtualNode;
begin
  //Nehme den ersten Node
  node := VST.GetFirst(True);

  //Und Überprüfe bis der Übergebene index (ParentID) mit dem Node-Index übereinstimmt
  while vst.AbsoluteIndex(node) <> iIndex do
  begin
    node := Vst.GetNext(Node, True);
  end;

  //Der zurückgegebene Node ist also der gesuchte Parent
  result := Node;
end;

oder mache ich irgend welche gravierenden Fehler??!!??
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.594 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: VirtualStringTree Node anhand des Index ermitteln

  Alt 22. Okt 2009, 13:48
Arbeitest Du dich durch eine Baumstruktur oder durch eine Liste von Nodes?

was gibt denn vst.AbsoluteIndex(node) zurück, wenn du z.b. den 5. Kindknoten des 2 Knotens prüfst?

getnext gibt den nächsten knoten im Baum, also auch eine ebene drunter, wenn da einer ist.

Ich schätze mal du möchtest dex x. Knoten in einer ebene haben, oder?
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: VirtualStringTree Node anhand des Index ermitteln

  Alt 22. Okt 2009, 13:52
nee, ist schon OK so ... wollte auch grad sowas vorschlagen

es läßt sich nur noch etwas kürzen
Delphi-Quellcode:
Function TMainForm.GetNodeByIndex(iIndex : Integer) : PVirtualNode;
begin
  Result := VST.GetFirst(True);
  while Assigned(Result) and (vst.AbsoluteIndex(Result) <> iIndex) do
    Result := Vst.GetNext(Result, True);
end;
in Delphi kann man auch direkt das Result nutzen ... nicht so wie in C, wo da auch gleich die Funkction verlassen wird.


Ansonten könnte man das Ganze noch etwas optimieren ... falls es dir nicht schnell genug ist.

Delphi-Quellcode:
Function TMainForm.GetNodeByIndex(iIndex : Integer) : PVirtualNode;
begin
  Result := VST.GetFirst(True);
  while Assigned(Result) and (iIndex <> 0) do
  begin
    Result := Vst.GetNext(Result, True);
    Dec(iIndex);
  end;
end;
oder man schaut im beim nächsten Sibling nach, was der für einen absoluten Index hat und überspringt mit .NextSibling einfach die SubNodes des aktuellen Nodes, da dort auf keinen Fall das gesuchte drinnen ist.


[edit]
es gibt doch ein Problem ... wenn der Index nicht vorkommt, dann geht deine Schleife über den letzen Node hinaus ... das Selbe, wenn garkein Node vorhanden war.


[add]
@sh17: wenn man mit GetPrev nach oben geht, dann gibt Absolute Index sozusagen die Anzahl der Knoten über dir an,
also den absoluten Index zum RootNode
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#8

Re: VirtualStringTree Node anhand des Index ermitteln

  Alt 22. Okt 2009, 14:10
Ich möchte alle Nodes durchlaufen ^^

Denn ich speichere einen Baum (verzweigt) in einer DB mit verschiedenen Informationen:

- Name (Inhalt der angezeigt wird)
- Eigene ID (Position im Baum, unabhängig von der Ebene)
- Parent ID (Position an dem der Node dran hängt)

Und dann will ich den Baum wieder ausgeben lassen ^^
Sortiert nach "Eigene ID"...
Und der Node muss ja immer irgendwo angehängt werden. Also wird ihm die Parent-ID übergeben an die er sich hängen soll.

Genau für sowas brauch ich das ^^
(hoffe ich habe mich nicht ZU schlimm ausgedrückt)
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.594 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: VirtualStringTree Node anhand des Index ermitteln

  Alt 22. Okt 2009, 14:19
Na dann vergiss meinen Code
Sven Harazim
--
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#10

Re: VirtualStringTree Node anhand des Index ermitteln

  Alt 22. Okt 2009, 15:12
Hallo,

hier ist mein Versuch:

Delphi-Quellcode:
function GetAbsoluteNode (aTree: TBaseVirtualTree; aIndex: Cardinal): PVirtualNode;
begin
  Result := aTree.GetFirst;
  while (Assigned(Result) and (aIndex > 0)) do
    if (aIndex >= Result.TotalCount) then
      begin
        Dec (aIndex, Result.TotalCount);
        Result := aTree.GetNextSibling(Result);
      end
    else
      begin
        Dec (aIndex);
        Result := aTree.GetFirstChild(Result);
      end;
end;
Gruß Hawkeye
  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:17 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