Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   VST - Knoten überspringen (https://www.delphipraxis.net/170650-vst-knoten-ueberspringen.html)

fanavity 27. Sep 2012 10:48

VST - Knoten überspringen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe ein Problem mit einem Virtual String Tree. Dazu habe ich ein Bild gezeichnet.

Ich möchte nun folgendes szenario abbilden. Wenn ein Knoten unter dem Root ein Flag hat, möchte ich all seine Kinder nicht mehr durchlaufen. Den rest aber schon. Ich stehe gerade auf dem Schlauch und weiß nicht so recht wie ich an die Sache rangehen soll.

Die Kinder haben keine flags und sollen auch keine bekommen. Die Kinder könnten allerdings noch weitere Ebenen haben, welche ich auch ignorieren will. Sobald einer der der oberen Knoten geflagt ist, will ich alles daran hängende überspringen.

Gibt es da eine einfache möglichkeit das umzusetzen?

himitsu 27. Sep 2012 11:03

AW: VST - Knoten überspringen
 
Gibt es nicht sowas wie Folgendes?
- node.nextSibling (in den nächsten Knoten gleicher Ebene, aka Childs überspriongen)
- node.firstChild (in die Childs rein, natürlich nur, wenn's Welche gibt)
- node.next (in den nächsten Knoten rein)

Nja, nun mußt du dir nur noch raussuchen, was du als nächstes haben willst.

Wenn node.level <> 1. Ebene oder wenn Flag nicht gesetzt, dann immer node.next, ansonsten (wenn node.level = 1. Ebene und Flag gesetzt)
node.nextSibling und wenn das NIL ist, dann node.lastChild.next, aber wenn node.lastChild = nil, dann node.next :stupid:

fanavity 27. Sep 2012 11:33

AW: VST - Knoten überspringen
 
Danke :)

Es hat endlich geklappt.. Falls es jemanden interessiert, ich habe es folgendermaßen gemacht:

Delphi-Quellcode:
procedure Form1.Test();
var
  n   : PVirtualNode;
  Data : PNodeData;
begin
  try
    vst.BeginUpdate;
    n := vst.GetFirst;
    vst.FullExpand(n);
    while n <> nil do begin
      Data := vst.GetNodeData(n);
      if not Data^.flag then begin
        //tu etwas
        n := vst.GetNext(n);
      end else begin
        n := vst.GetNextSibling(n);
      end;
    end;
  finally
    vst.FullCollapse(vst.getFirst);
    vst.EndUpdate;
  end;
end;
Gibt es auch eine möglichkeit den baum zu durchlaufen ohne alles aufzuklappen :)?

nuclearping 27. Sep 2012 11:44

AW: VST - Knoten überspringen
 
Zitat:

Zitat von fanavity (Beitrag 1184671)
Gibt es auch eine möglichkeit den baum zu durchlaufen ohne alles aufzuklappen :)?

Wäre mir neu, dass du den Baum aufklappen musst, um ihn durchlaufen zu können?

fanavity 27. Sep 2012 11:46

AW: VST - Knoten überspringen
 
wenn er zugeklappt ist, hört er nach root auf..

nuclearping 27. Sep 2012 11:49

AW: VST - Knoten überspringen
 
Hä? :stupid: Wie baust du denn den Baum auf? Normal ist es dem VST völlig wurscht, ob er aufgeklappt ist, oder nicht, da er die ganze Struktur intern handelt.

Edit

Grad mal 'n Testprojekt gemacht. Geht. Irgendwas musst du falsch machen. :mrgreen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VirtualTrees;

type
  TForm1 = class(TForm)
    VirtualStringTree1: TVirtualStringTree;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i, a, b: Integer;
  Node, ParentNode: PVirtualNode;
begin
  Randomize;

  // Zufällige Baumstruktur erstellen
  ParentNode := nil;
  for i := 0 to 99 do
    begin
      Node := VirtualStringTree1.AddChild(ParentNode);
      if (i + 1) mod (Random(2) + 1) = 0 then
        begin
          ParentNode := Node;
        end
      else
        ParentNode := nil;
    end;
  a := VirtualStringTree1.TotalCount;

  // Baumstruktur durchlaufen
  b := 0;
  Node := VirtualStringTree1.GetFirst;
  while Assigned(Node) do
    begin
      Inc(b);
      Node := VirtualStringTree1.GetNext(Node);
    end;

  ShowMessage(IntToStr(a) + ' <> ' + IntToStr(b));
end;

end.
Nochmal Edit

Eigentlich hätte er nur einen Grund, nach dem Root aufzuhören, wenn er GetNextSibling auf ihn anwendet.

fanavity 27. Sep 2012 11:59

AW: VST - Knoten überspringen
 
Bei mir wird auch erst das "+" angezeigt wenn ich doppelt drauf klicke.. daher habe ich immer ein expand gemacht.. ister aber ziemlich nervig.. da man sich entweder den status der nodes merken muss oder der baum ist nach jeder aktion ein/ausgeklappt.. habe den quellcode des erstellens gerade nicht parat..

EDIT:

ich arbeite mit getNext

Und wie gesagt, zeigt er mir auch nur den oberen Punkt an. Das Plus erscheint erst mit klick auf den RootPunkt.. Dann sind alle sofort sichtbar. Ein onclick ereignis gibt es nicht!

nuclearping 27. Sep 2012 12:10

AW: VST - Knoten überspringen
 
Was für eine Delphi-Version? Und was für eine Version vom VST? Vielleicht noch eine alte mit 'nem Bug? Wäre auch interessant zu sehen, wie du den Baum aufbaust.

fanavity 27. Sep 2012 12:14

AW: VST - Knoten überspringen
 
delphi 5 mit entsprechender version vom vst..

Ein bug ist es nicht. Da es in anderen Projekten klappt. Ich mache scheinbar irgendetwas falsch. Leider finde ich den fehler aber nicht, wie gesagt den quellcode des erstellen habe ich gerade nicht parat.

EDIT:

bin gerade echt am verzweifeln und suche mir nen wolf.. wenn jemand eine idee hat immer her damit :)

nuclearping 27. Sep 2012 12:45

AW: VST - Knoten überspringen
 
Poste doch mal den Code vom Erstellen des Baums, sobald du kannst.


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