Delphi-PRAXiS

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/)
-   -   Delphi Treeview bestimmten Node finden (https://www.delphipraxis.net/143926-treeview-bestimmten-node-finden.html)

R2009 26. Nov 2009 07:43


Treeview bestimmten Node finden
 
Hi DP'ler,
ich will aus einer Datenbank heraus einen Treeview füllen.
Funktioniert auch alles wunderbar, bis ich doppelte Einträge (oder doppelte Pfade) habe.
Ich habe eine Prozedur geschrieben mit der ich doppelte Einträge finden kann.
Mein Problem ist, dass wenn es den Eintrag schon gibt er auf den Node wechseln muss.
Ich hab mir die Finger wund gesucht aber nichts gefunden!

Delphi-Quellcode:
    test:=check_double_entry(TreeView1.items,s.Strings[n]);
    if test=false then j:=TreeView1.Items.AddChild(j,s.Strings[n])
       else .... hier müsste er auf den Node wechseln den es ja schon gibt
Grüsse
rainer

SirThornberry 26. Nov 2009 07:56

Re: Treeview bestimmten Node finden
 
willst du doppelte Einträge vermeiden oder nur finden? Wenn du sie vermeiden willst würde ich bereits bei der Datenbankabfrage dafür sorgen das keine Einträge zurück gegeben werden mit gleichem Pfad. Ansonsten heißt es Node für Node durchzugehen und zu schauen ob der Inhalt dem gesuchten entspricht.

R2009 26. Nov 2009 08:06

Re: Treeview bestimmten Node finden
 
Hi,

auf der Datenbankseite kann ich das nicht ändern.
Der komplette Pfad liegt als test1>test2>test3 usw in einem String vor.
Mein Problem besteht nur darin zu dem Knoten zu kommen der bereits vorhanden ist.


Delphi-Quellcode:
var s:tstringlist;j:TTreeNode;n:integer;test:boolean;
begin
  ADOQuery1.open;
  ADOQuery1.first;
  while not (ADOQuery1.eof) do
     begin
       s:=tstringlist.create;
       separate(s,ADOQuery1.FindField('Steuerfeld').asstring,'>'); //s enthält die Strings die in Steuerfeld, getrennt durch > abgelgt waren

       test:=IstDoppelt(TreeView1.items,s.Strings[0]);

       TreeView1.Items.BeginUpdate;
       if test=false then j:=TreeView1.Items.AddChild(nil,s.Strings[0])
       else hier ist mein Problem. Hier muss j dem Knoten zugewiesen werden der schon vorhanden ist.
       TreeView1.Items.EndUpdate;
       for N:=1 to s.Count-1 do
           Begin
             test:=IstDoppelt(TreeView1.items,s.Strings[n]);
             if test=false then j:=TreeView1.Items.AddChild(j,s.Strings[n])
             else hier ist mein Problem. Hier muss j dem Knoten zugewiesen werden der schon vorhanden ist.
           end;
       s.Clear;
       ADOQuery1.next;
     end;
  s.free;
Grüsse
rainer

Alaitoc 26. Nov 2009 08:37

Re: Treeview bestimmten Node finden
 
Wieso überprüfst du denn mit deiner Funktion ob der Knoten doppelt ist?

Lass dir doch lieber den Knoten zurückgeben und überprüfe dann ob der Knoten halt Assigned ist,
also so in etwa:

Delphi-Quellcode:

...

var s:tstringlist;j:TTreeNode;n:integer;
begin
  ADOQuery1.open;
  ADOQuery1.first;
  while not (ADOQuery1.eof) do
     begin
       s:=tstringlist.create;
       separate(s,ADOQuery1.FindField('Steuerfeld').asstring,'>');

       j:=SearchNodebyString(TreeView1.items,s.Strings[0]);

       TreeView1.Items.BeginUpdate;
       if not Assigned (j) then
       begin
         j:=TreeView1.Items.AddChild(nil,s.Strings[0])
       end
       else
       begin
         // Knoten schon vorhanden
       end;
       TreeView1.Items.EndUpdate;
       for N:=1 to s.Count-1 do
           Begin
              j:=SearchNodebyString(TreeView1.items,s.Strings[n]);
              if not Assigned (j) then
              begin
                j:=TreeView1.Items.AddChild(j,s.Strings[n])
              end
              else
              begin
                // Knoten schon vorhanden
              end;
           end;
       s.Clear;
       ADOQuery1.next;
     end;
  s.free;

...
Edith sagt:

Noch hier vll. als kleine Hilfe bzw Lösung http://delphi.about.com/od/vclusing/l/aa010703a.htm


MfG Alaitoc


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