Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   VirtualStringTree Node anhand des Index ermitteln (https://www.delphipraxis.net/142119-virtualstringtree-node-anhand-des-index-ermitteln.html)

stho 22. Okt 2009 09:05


VirtualStringTree Node anhand des Index ermitteln
 
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? :gruebel:

sh17 22. Okt 2009 09:18

Re: VirtualStringTree Node anhand des Index ermitteln
 
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

stho 22. Okt 2009 09:22

Re: VirtualStringTree Node anhand des Index ermitteln
 
Vielen Dank für deine Antwort... ich hatte es befürchtet :x

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


Argh... nagut, muss ich mir wohl ne schleife basteln oder ne Funktion bauen.
Danke Trotzdem für die Hilfe :cheers:

sh17 22. Okt 2009 09:31

Re: VirtualStringTree Node anhand des Index ermitteln
 
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;

stho 22. Okt 2009 13:24

Re: VirtualStringTree Node anhand des Index ermitteln
 
okay..... :gruebel:


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??!!?? :?:

sh17 22. Okt 2009 13:48

Re: VirtualStringTree Node anhand des Index ermitteln
 
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?

himitsu 22. Okt 2009 13:52

Re: VirtualStringTree Node anhand des Index ermitteln
 
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

stho 22. Okt 2009 14:10

Re: VirtualStringTree Node anhand des Index ermitteln
 
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)

sh17 22. Okt 2009 14:19

Re: VirtualStringTree Node anhand des Index ermitteln
 
Na dann vergiss meinen Code ;-)

Hawkeye219 22. Okt 2009 15:12

Re: VirtualStringTree Node anhand des Index ermitteln
 
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


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