Delphi-PRAXiS
Seite 2 von 3     12 3      

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/)
-   -   Virtualstringtree suchen mit Child-Nodes (https://www.delphipraxis.net/177035-virtualstringtree-suchen-mit-child-nodes.html)

Jens Hartmann 13. Mär 2016 14:36

AW: Virtualstringtree suchen mit Child-Nodes
 
Hallo Haentschman,

danke erstmal für Deine antwort. Grundlegend könnte ich das so aufbauen. Aber trotzdem stelle ich mir die Frage, warum das so ist. Im OnInit des VST sagen ich den Nodes doch, das Sie Childs haben.

Delphi-Quellcode:
procedure TfReportClient.vstKundenInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin
  case vstKunden.GetNodeLevel(Node) of
    1:
     begin
       vstKunden.HasChildren[Node] := True;
     end;
    2:
     begin
       vstKunden.HasChildren[Node] := True;
     end;
    3:
     begin
       vstKunden.HasChildren[Node] := True;
     end;
  end;
end;
Nach dem Programmstart, ist das auch so im VST ersichtlich. Nur wenn ich suche, wird das "+"+ zum öffnen der Childs nicht mehr angezeigt. Doppelklick öffnet aber das Child.

jaenicke 13. Mär 2016 17:10

AW: Virtualstringtree suchen mit Child-Nodes
 
Das habe ich nie benutzt. Ich habe einfach immer ChildCount auf 1 gesetzt. Damit hatte ich dieses Problem bisher nicht.

Jens Hartmann 14. Mär 2016 05:32

AW: Virtualstringtree suchen mit Child-Nodes
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:

Zitat von jaenicke
Das habe ich nie benutzt. Ich habe einfach immer ChildCount auf 1 gesetzt. Damit hatte ich dieses Problem bisher nicht.

Aber das ergibt jetzt meiner Meinung nach keinen Sinn. Der ChildCount ist bei mir unterschiedlich. Außerdem sind die Nodes ja vorhanden. Es fehlt ja nur das + zum öffnen. Mit einem Doppelklick, öffnet sich ja dann das Node. Siehe hierzu die Bilder im Anhang...

Gruß Jens

jaenicke 14. Mär 2016 06:11

AW: Virtualstringtree suchen mit Child-Nodes
 
Ja, das ist mir schon klar. Ich habe aber nicht HasChildren gesetzt, sondern immer ChildCount auf 1. Wenn dann ausgeklappt wurde, habe ich den echten Wert für ChildCount gesetzt usw.
Das mag nicht die schönste Lösung sein, aber HasChildren hatte ich nicht gefunden und es funktioniert problemlos.

madas 14. Mär 2016 11:27

AW: Virtualstringtree suchen mit Child-Nodes
 
Zitat:

Zitat von Jens Hartmann (Beitrag 1332764)
Keiner nee Idee...

Vielleicht hilft ja ein einfaches

Delphi-Quellcode:
Tree.Expanded[Node] := True;
Tree.Expanded[Node] := False;

Jens Hartmann 14. Mär 2016 12:40

AW: Virtualstringtree suchen mit Child-Nodes
 
Zitat:

Zitat von madas
Vielleicht hilft ja ein einfaches

Das kann ich gerne ausprobieren, aber wäre doch auch irgendwie nicht die richige Lösung.

Beim suchen, prüfen ich ja immer nur im "NodeLevel 1". Daher blende ich ja "NodeLevel 2 und 3" niemals aus. Ich verstehe daher nicht, warum nach dem erstellen die "+" zeichen sichbar sind und nach dem Suchen nicht mehr. Das OnInit wird doch auch nur beim Initialieren der Nodes ausgeführt und hat daher beim suche keine relevance.

:gruebel::gruebel::gruebel:

Aviator 14. Mär 2016 19:04

AW: Virtualstringtree suchen mit Child-Nodes
 
Also ich benutze auch die Events
Delphi-Quellcode:
OnInit()
und
Delphi-Quellcode:
OnInitChildren()
und bei mir funktioniert das problemlos. Der einzige Unterschied ist, dass ich im
Delphi-Quellcode:
OnInit()
nicht die Property
Delphi-Quellcode:
HasChildren[Node]
benutze, sondern über den Var-Parameter
Delphi-Quellcode:
InitialStates
den initialen Status der Node zurückgebe. Hab mich zwar schnell mit dem Texteditor durch das Event geklickt und keine großen Auffälligkeiten gefunden was dort anders gemacht wird, aber vielleicht hilft es ja. Bei mir funktioniert es jedenfalls problemlos. Und ich benutzte einige tausende Nodes als ChildNodes die erst initialisiert werden wenn ich sie wirklich brauche.

Jens Hartmann 14. Mär 2016 21:32

AW: Virtualstringtree suchen mit Child-Nodes
 
Also bei mir klappt das auch mit dem

Delphi-Quellcode:
InitialStates := InitialStates + [ivsHasChildren];
Hier mal ein Teil des Codes...

Delphi-Quellcode:
//InitNode
procedure TfReportClient.vstKundenInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  NodeLevel : Integer;
begin
 NodeLevel := vstKunden.GetNodeLevel(Node);
 case NodeLevel of
   1: InitialStates := InitialStates + [ivsHasChildren];
   2: InitialStates := InitialStates + [ivsHasChildren];
   3: InitialStates := InitialStates + [ivsHasChildren];
 end;
end;

//EditChange Suche
procedure TfReportClient.edtSearchChange(Sender: TObject);
begin
  vstKunden.BeginUpdate;
  vstKunden.IterateSubtree(nil, SpeedSearch, Pointer(edtSearch.Text), [], true);
  vstKunden.EndUpdate;
end;

//Methode SpeedSearch
procedure TfReportClient.SpeedSearch(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
var
  Kunden_Daten : PCustomersData;
  NodeLevel, i : integer;
  ws: string;
begin
  try
    NodeLevel := vstKunden.GetNodeLevel(Node);
    if NodeLevel = 1 then
      begin
        ws := string(Data);
        //Diverse Suchoptionen
        //...
        //...
        //...
        { Sucht im Kundennamen von Anfang des Strings }
        vstKunden.IsVisible[Node] :=
          (ws = '') or (pos(AnsiUpperCase(ws),
          AnsiUpperCase(TOCustomers(Kunden_Daten.FCustomer_Object).Kunden_Kundenname)) = 1);
      end
  except
    //Fehlerbehandlung
  end;
end;
Vieleicht fehlt ja irgendetwas auf...

Gruß Jens

Jens Hartmann 15. Mär 2016 20:00

AW: Virtualstringtree suchen mit Child-Nodes
 
Also wo auch immer das dran liegt. Ich bekomme es nicht in den Griff...

Noch jemand einen Vorschlag...

Jens Hartmann 15. Mär 2016 22:23

AW: Virtualstringtree suchen mit Child-Nodes
 
So, ich habe das ganze jetzt gelöst. Allerdings wirklich nur auf die Art und Weise, dass ich den Nodes jeweils ein Child zugefügt habe. Beim initialsieren (Expanding) des Nodes, führe ich erste ein...

Delphi-Quellcode:
vst.DeleteChildren(Node)
aus und füge erst dann die richtigen Nodes mit den Daten zu.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz