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 Nodes mit Daten (TTreeNodeEx) durchsuchen (https://www.delphipraxis.net/178128-nodes-mit-daten-ttreenodeex-durchsuchen.html)

Opa Knack 19. Dez 2013 01:09

Nodes mit Daten (TTreeNodeEx) durchsuchen
 
Hallo,

ich habe ein Treeview, dessen Nodes ich mit Daten versehen habe (allgemein meist als TTreeNodeEx bezeichnet).

Nun stehe ich vor dem Problem, dass ich nach eben diesen Daten suchen möchte. Klar wäre es ganz einfach mit

Delphi-Quellcode:
for i := 0 to treeview.Items.Count-1 do
   if((treeview.Items[i]) as TTreeNodeEx.Eintrag1 = Auswahlkriterium) then {mach irgendwas}
umzusetzen, jedoch kann "Eintrag1" (was natürlich nur ein Platzhalter ist, im Code werde ich dann schon ein wenig spezifischer) variieren, so dass das Kriterium auch in Eintrag2, Eintrag3, ... gesucht werden könnte.

Je nach Gegebenheit möchte ich der Funktion also übergeben, in welchem Datenbereich (ist das eigentlich einer, oder ist das eine Subklasse?) sie nach was suchen soll (also z. B. "Suche xy in Eintrag1" oder "Suche xy in Eintrag2").

Die einfachste Lösung wäre natürlich, dafür eine Weiche zu schreiben und die obige Suche einfach x-mal für die verschiedenen Bereiche einzubinden. Das wäre aber ziemlich unelegant und sicherlich unnötig.

Meine Frage ist nun: Wie kann ich diese Bereiche direkt ansprechen (also nach dem Motto "Node.(Bereich)")?

Vielen Dank und gute Nacht
Opa

Furtbichler 19. Dez 2013 06:39

AW: Nodes mit Daten (TTreeNodeEx) durchsuchen
 
Das geht entweder mit RTTI-Informationen. Aber eine Klasse, die es erlaubt, in ihren Daten zu suchen, sollte eine solche Methode bereitstellen. Wie das intern gelöst ist, ist dann ja zweitrangig. So wäre das imho am einfachsten umzusetzen.

Reflection geht natürlich auch (ach, in Delphi heißt das ja irgendwie RTTI o.ä.)

Delphi-Quellcode:
Procedure TMyTreeData.Search (aText : String; aNode : TNodeType) : Boolean;
Begin
  case aNode of
    Eintrag1 : result := Eintrag1=aText;
    Eintrag2 : result := Eintrag2=aText;
    ...
  end
end;

sx2008 19. Dez 2013 08:24

AW: Nodes mit Daten (TTreeNodeEx) durchsuchen
 
spendiere deiner Klasse TTreeNodeEx doch eine Methode SearchAll():
Delphi-Quellcode:
function TTreeNodeEx.SearchAll(const s:string):Boolean;
begin
  Result := (Eintrag1=s) or (Eintrag2=s) or (IntToStr(Eintrag3)=s);
end;


for i := 0 to treeview.Items.Count-1 do
   if ((treeview.Items[i]) as TTreeNodeEx).SearchAll(Auswahlkriterium) then {mach irgendwas}
Falls du mehrere Klassen von TTreeNodeEx abgeleitet hast machst du die Suchfunktion eben virtuell.

Opa Knack 20. Dez 2013 00:28

AW: Nodes mit Daten (TTreeNodeEx) durchsuchen
 
Super, ich danke euch.


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