Finden und Anzeigen von TreeView.TreeNodes

Rund um die LCL und andere Komponenten
Antworten
pschoett
Beiträge: 36
Registriert: Sa 7. Feb 2015, 11:48

Finden und Anzeigen von TreeView.TreeNodes

Beitrag von pschoett »

Hallo allerseits,
wie es der Betreff schon sagt, habe ich Fragen zum Finden und Anzeigen von Inhalten von TreeNodes eines TreeViews.

Mit TreeNodes.AddChildObject kann ich erfolgreich ein TreeView erstellen, bei dem in der Baumstruktur jeder Knoten mit einem Text bezeichnet wird und zusätzlich mit einem Datenobjekt verknüpft wird. Im Beispiel hole ich mir Stücklisten aus einer Datenbank.

Code: Alles auswählen

type
  TTeile = Class(TObject)
    auftr_numm,
    posnummer,
    keyA: String;
  end;
 
var
  Stueckliste: TTeile;
 
[...]
  with Query1 do
  begin
    first;
    while not Eof do
      begin
        Stueckliste := TTeile.Create;
        Stueckliste.auftr_numm:=fieldbyname('auftr_numm').asstring;
        Stueckliste.posnummer:=fieldbyname('posnummer').asstring;
        Stueckliste.keyA:=fieldbyname('keyA').asstring;
        if TreeView2.Items.Count = 0 then
          TreeView2.Items.AddChildObject(nil, fieldbyname('keyA').asstring, Stueckliste)
        else
          TreeView2.Items.AddChildObject( TreeView2.Items.FindNodeWithText(fieldbyname('parentkey').asstring), 
                                            fieldbyname('keyA').asstring, Stueckliste);
        next;
      end;
  end;
Die verzeigerten Datenobjekte lassen sich auch erfolgreich anzeigen.

Code: Alles auswählen

procedure TForm1.TreeView2Change(Sender: TObject; Node: TTreeNode);
begin
  If Assigned(Node) then
    begin
      Edit3.Text:=TTeile(Node.Data).auftr_numm;
      Edit4.Text:=TTeile(Node.Data).posnummer;
      Edit5.Text:=TTeile(Node.Data).keyA;
    end;
end; 
In meinen Daten ist der Text für jeden Knoten eindeutig, so dass ich ihn auch problemlos mit TreeNodes.FindNodeWithText finden kann. Ich würde gerne alternativ die Funktion TreeNodes.FindNodeWithData nutzen, komme aber nicht zu einem Ergebnis.

Code: Alles auswählen

var
  Stueckliste2: TTeile;
begin
  Stueckliste2 := TTeile.Create;
  Stueckliste2.auftr_numm:='123456';
  Stueckliste2.posnummer:='001';
  Stueckliste2.keyA:='4711';
  TreeView2.Selected := TreeView2.Items.FindNodeWithData(Stueckliste2);  // <-- findet keinen Knoten
  // TreeView2.Select := TreeView2.Items.FindNodeWithText('4711'); // <-- findet den richtigen Konten
  TreeView2.SetFocus;
  --- 
Die Werte von Stueckliste2 sind eindeutig einem Knoten zuordnungsbar, werden aber so nicht gefunden. Nur die Variante FindNodeWithText funktionert.
Warum?

Gruß,
Peter

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Finden und Anzeigen von TreeView.TreeNodes

Beitrag von theo »

Afaics vergleicht das nur Pointer und keine Inhalte.

http://lazarus-ccr.sourceforge.net/docs ... hdata.html

pschoett
Beiträge: 36
Registriert: Sa 7. Feb 2015, 11:48

Re: Finden und Anzeigen von TreeView.TreeNodes

Beitrag von pschoett »

ja, du hast natürlich Recht.
In welcher Situation macht diese Funktion dann Sinn?

Antworten