[TTreeView] Schriftfarbe des geklickten Items ändern!
-
Thorben schrieb:
<Edit: Zitate bitte auf das Notwendigste beschränken. Danke!>
ICh würde es folgendermassen machen (am einfachsten):
- eine for-Schleife: gehe alle Knoten durch (Eigenschaft Count)
- vergleiche den Text des aktuellen Knoten mit dem eingegebenen Text (Eigenschaft Text)
- Wenn identisch, dann markiere den aktuellen Knoten (Eigenschaft Selected)
- Suche abbrechen.Grüße
-
Das wäre nur dann sinnvoll, wenn der gesuchte Node auch tatsächlich selektiert werden soll. Für die Entscheidung über das Einfärben reicht allein die T...-Property des Nodes im OnCustomDraw (mit C...... lag ich dicht daneben ;)).
-
Jansen schrieb:
Das wäre nur dann sinnvoll, wenn der gesuchte Node auch tatsächlich selektiert werden soll.
ICh hatte dabei an "regedit" gedacht.
Jansen schrieb:
(mit C...... lag ich dicht daneben ;)).
Sogar ein Mod kann mal daneben legen -> beruhigend!

-
Hallo!
Also, das Einfärben soll immer dann geschehen, wenn sich meine EditBox ändert, gut, kann man ja durch OnChange machen. Wie xxs sagte, suche ich dann den Knoten ( über eine rekursive Funktion, da meine TreeView beliebig viele Childs haben kann und diese wiederrum beliebig viele Childs, usw) und gebe ihn zurück, oder mit Selected. Und dann? Müsste doch dann TreeView1CustomDrawItem aufrufen und den Node übergeben, als Sender würde ich NULL eingeben, richtig? Und dann cdsSelected, da ja nur der jeweilige Knoten farbig markiert werden soll.
Sehe ich das richtig?
T.
-
Thorben schrieb:
Müsste doch dann TreeView1CustomDrawItem aufrufen und den Node übergeben, als Sender würde ich NULL eingeben, richtig?
Nein. TreeView1CustomDrawItem mußt Du nicht aufrufen. Sie wird automatisch ausgeführt.
Hast Du versucht, die o.g. Tips bzw. Schritte "in Code umzuwandeln"?
Grüße
-
A1 A11 A111 A2 A3 A31 A311 A32Usw. Wenn jetzt in "Edit1-> Text = A11" steht, soll dieser Knoten farbig gekennzeichnet werden!
Geht, das Abfragen nach den einzelnen Knoten nicht einfacher als durch die Rekursion?
-
Wenn deine Suchfunktion den Knoten selektiert dann kannst du xxs' ursprünglichen Code quasi 1:1 übernehmen, mehr ist dann nicht zu tun.
PS. Nein, das Suchen musst du schon selbst erledigen.
-
Thorben schrieb:
Geht, das Abfragen nach den einzelnen Knoten nicht einfacher als durch die Rekursion?
Ja.
Wie Jansen schon sagte, Du brauchst in diesem Fall nur den obigen Code folgendermassen zu ändern:
Nimm fürif(State.Contains(cdsSelected))einfach
if(Node->Text == Edit1->Text)Und das war es auch schon.
Grüße
-
Also vielen Dank erst mal!
Ich habe jetzt mal einfach probiert, habe meine Funktion beschrieben und getestet, hat leider noch nicht funktiioniert, aber dazu habe ich auch noch gar keine Frage, habe es jetzt so getestet wie xxs sagt. Jetzt bringt mein Compiler aber den folgenden fehler:
E2316 '_fastcall TForm1::TreeView1CustomDrawItem(TCustomTreeView *,TTreeNode *,TCustomDrawState,bool &)' ist kein Element von 'TForm1'
Muss ich hierfür noch eine Extra Bibliothek einbinden, oder warum erkennt er das nicht?

Fragen über Fragen, tut mir Leid, aber ich will ja Lernen!!!!
-
Zum Suchen ist OnCustomDraw ungeeignet, da es nur für die Items aufgerufen wird, die sichtbar sind. Wie gesagt, du kommst um eine eigene Routine nicht herum.
Zur Fehlermeldung: ich vermute, du hast die OnCustomDraw-Funktion manuell in die CPP kopiert, anstatt sie vom BCB automatisch erstellen zu lassen, deshalb fehlt die zugehörige Deklaration im Header. Oder du hast an dem vom BCB automatisch erzeugten Code herumgepfuscht (;)), in der cpp oder in der h oder in beiden.
-
Okay, so weit, so gut, du hast recht, habe ich dummerweise rauskopiert....

Und in Tree->... muss ich dann den jeweiligen gefunden Knoten übergeben? Oder woher weiss er sonst, welcher Node gemeint ist?
-
Wenn du den Knoten gefunden hast selektiere ihn mittels TTreeView::Selected, den Rest macht dann xxs' ursprünglicher Code ganz automatisch.
-
Jansen schrieb:
Zum Suchen ist OnCustomDraw ungeeignet, da es nur für die Items aufgerufen wird, die sichtbar sind. Wie gesagt, du kommst um eine eigene Routine nicht herum.
Und weil das Suchen eigentlich ein anderes Thema ist, habe ich mir erlaubt, einen neuen Thread zu eröffnen.
Grüße
-
Klappt jetzt alles wunderbar!
Wieviel Aufwand ist es jetzt wohl noch, wenn ich will, dass man die Items im TreeView nicht mehr per Mausklick anwählen kann???
Dachte da spontan, an OnClick, bzw OnDblClick und dort dann irgendwie reinschreibt, dass wenn was angeklickt wird, es zurück auf das vorherige soll!
Bin ich da auf dem richtigen Weg?
T.