AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Virtualstringtree suchen mit Child-Nodes

Ein Thema von HPB · begonnen am 11. Okt 2013 · letzter Beitrag vom 16. Mär 2016
Antwort Antwort
madas

Registriert seit: 9. Aug 2007
207 Beiträge
 
#1

AW: Virtualstringtree suchen mit Child-Nodes

  Alt 14. Mär 2016, 11:27
Keiner nee Idee...
Vielleicht hilft ja ein einfaches

Delphi-Quellcode:
Tree.Expanded[Node] := True;
Tree.Expanded[Node] := False;
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Virtualstringtree suchen mit Child-Nodes

  Alt 14. Mär 2016, 12:40
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.

Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Virtualstringtree suchen mit Child-Nodes

  Alt 14. Mär 2016, 19:04
Also ich benutze auch die Events OnInit() und OnInitChildren() und bei mir funktioniert das problemlos. Der einzige Unterschied ist, dass ich im OnInit() nicht die Property HasChildren[Node] benutze, sondern über den Var-Parameter 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.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Virtualstringtree suchen mit Child-Nodes

  Alt 14. Mär 2016, 21:32
Also bei mir klappt das auch mit dem

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
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Virtualstringtree suchen mit Child-Nodes

  Alt 15. Mär 2016, 20:00
Also wo auch immer das dran liegt. Ich bekomme es nicht in den Griff...

Noch jemand einen Vorschlag...
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Virtualstringtree suchen mit Child-Nodes

  Alt 15. Mär 2016, 22:23
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...

vst.DeleteChildren(Node) aus und füge erst dann die richtigen Nodes mit den Daten zu.
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
madas

Registriert seit: 9. Aug 2007
207 Beiträge
 
#7

AW: Virtualstringtree suchen mit Child-Nodes

  Alt 16. Mär 2016, 08:46

Delphi-Quellcode:
//EditChange Suche
procedure TfReportClient.edtSearchChange(Sender: TObject);
begin
  vstKunden.BeginUpdate;
  vstKunden.IterateSubtree(nil, SpeedSearch, Pointer(edtSearch.Text), [], true);
  vstKunden.EndUpdate;
end;
Vieleicht fällt ja irgendetwas auf...

Gruß Jens
Also bei uns sieht der OnChange event vom Edit so aus:

Delphi-Quellcode:
procedure TFormTest.EditFilterSearchChange(Sender: TObject);
begin
  if (not (tsIterating in vstFilter.TreeStates)) then
    vstFilter.IterateSubtree(Node, vstFilterSearchCallback, nil);
end;
Sprich ohne vstFilter.BeginUpdate und vstFilter.EndUpdate .

CallBack schaut dann so aus:

Delphi-Quellcode:
procedure TFormTest.vstFilterSearchCallback(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
var
  nodeData: TFilterCustomItem;
begin
  if (Assigned(Node)) then
  begin
    nodeData := TFilterCustomItem(Sender.GetNodeData(Node)^);
    Sender.IsVisible[Node] := True;
    if (nodeData is TFilterFieldValue) then
    begin
      Sender.IsVisible[Node] :=
        (EditFilterSearch.Text = EmptyStr) or
        (AnsiContainsText(StringReplace(nodeData.CellText, ' ', '', [rfReplaceAll]), StringReplace(EditFilterSearch.Text, ' ', '', [rfReplaceAll])));
      if (Assigned(Node.Parent)) then
      begin
        ...
        // Parent wird dann hier auf Grund der sichtbaren Anzahl an Childs auch ein- bzw. ausgeblendet
        // Und falls vorhanden Parent.Parent auch
        ...
      end;
    end;
  end;
end;
Grüße madas

Geändert von madas (16. Mär 2016 um 08:59 Uhr)
  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 08:54 Uhr.
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