von _TREEITEM auf TreeView casten ?
-
hi,
wollte mal wissen ob es möglich ist anhand einer _TREEITEM-Id herauszubekommen zu welcher TreeView sie gehört.
void start() { TTreeView *Tree = TreeView1; _TREEITEM *iID = Tree->Selected->ItemId; if(iID) { MeineFunktion(iID); } } void MeineFunktion(_TREEITEM *iID) { //hier hätte ich gerne gewusst wie die TreeView heisst TTreeView *Tree; Tree = dynamic_cast<TTreeView*>(????????????????); }
-
Keine Ahnung ob es mit _TREEITEM-Id geht, aber wenn man bei der VCL bleibt dann gehts auf jedenfall.
TreeView1->Selected
gibt das ausgewählten TTreeNode* zurück
TTreeNode->Owner ist vom Typ TTreeNodes*
und deren TTreeNodes->Owner ist das TTreeView*void start() { MeineFunktion(TreeView1->Selected); } void MeineFunktion (TTreeNode *Node) { if (Node) { TTreeNodes *Nodes = dynamic_cast<TTreeNodes*>(Node->Owner); if (Nodes) { TTreeView *Tree = dynamic_cast<TTreeView*>(Nodes->Owner); if (Tree) { //Na da isser der TTreeView } } } }
-
hi,
danke für deine mühe kann ich gut gebrauchen das Beispiel.
So nochmal zum _TREEITEM, habe das aus folgenden Hintergrund hier reingestellt, in der Borlad Hilfe steht:
Die Eigenschaft ItemID enthält ein Handle, durch das jeder Knoten eines Baumdiagramms eindeutig angegeben wird.
und jetzt das entscheidende:
Soll extern (d.h. von außerhalb des Baumdiagramms) auf die Knoten eines Baumdiagramms zugegriffen werden, so wird dazu die Eigenschaft ItemID verwendet.
Ich frage mich also wie das gemeint ist und wie ich extern auf den Knoten zugreifen kann ?
mfg
-
Gegenfrage:
Wiso willst du über den Umweg ItemID (WinAPI) auf das TTreeNode* zugreifen wenn es doch mit der VCL schneller geht?
-
Eine kurze Suche nach ItemId in ComCtrls.pas hätte dich hierauf gestoßen:
http://docwiki.embarcadero.com/Libraries/XE2/de/Vcl.ComCtrls.TTreeNodes.GetNode
-
Trotz alledem gelingt es mir nicht anhand dieser ItemId irgendwas damit anzufangen. Es muss scheinbar die dazugehörige TreeView bekannt sein.
TTreeNode *aNode = TreeView1->Items->GetNode(Kotze);
soweit war ich schon am 12.07.2012 - 20:15:28.
-
Wenn du schon am 12.07.2012 - 20:15:28 soweit warst dann hast du glaub ich noch den den Sinn und Zweck meines Posts vom 12 Jul 2012 23:29 begriffen.
-
Uwe000000000 schrieb:
Trotz alledem gelingt es mir nicht anhand dieser ItemId irgendwas damit anzufangen. Es muss scheinbar die dazugehörige TreeView bekannt sein.
Ah - da hab ich nicht genau genug gelesen, entschuldige.
Was du probieren könntest, wäre, alle Forms zu enumerieren (Screen::Forms oder so), auf diesen wiederum alle Controls durchzugehen und für diejenigen, die von TTreeView ableiten, GetNode() mit deinem Handle aufrufen. Aber wenn GetNode() so implementiert ist, wie ich es mir vorstelle - so, daß es einfach Werte aus der Struktur zurückgibt, auf die dein HTREEITEM zeigt, ohne groß zu überprüfen, ob das Node überhaupt zum TreeView gehört -, dann bringt das nicht viel. Der einzige saubere Weg, das zu tun, was du tun möchtest, wäre also, alle Nodes aller TreeViews zu enumerieren und die HTREEITEMs zu vergleichen.
Eventuell kannst du den Vorgang beschleunigen, indem du von deinem HTREEITEM erst auf den Root-Node navigierst (die Frage ist, wie) und dann mit dem Root-Node aller TreeViews vergleichst. Aber darf ich fragen, wo du das HTREEITEM überhaupt herbekommst, wenn du das TreeView dazu nicht weißt?
-
Ich kann Eure ganzen Fragen nicht beantworten es würde auch nix bringen. Ich komme zu dem Entschluß das ItemID ein völlig unbrauchbares etwas ist.
-
Uwe000000000 schrieb:
Ich komme zu dem Entschluß das ItemID ein völlig unbrauchbares etwas ist.
Ähm, nein - es ist außerordentlich sinnvoll, weil es einen Zeiger auf die Daten darstellt, die den Tree-Node repräsentieren. Nur scheint es darin keinen Verweis auf das zugrundeliegende Treeview selbst zu geben, so daß es für dein spezielles Problem offenbar nicht die richtige Information bereithält. Mir fällt auch nach längerem Überlegen kein sinnvolles Szenario ein, wo man das brauchen könnte, also sehe ich nicht, wie das die Datenstruktur völlig unbrauchbar machen kann.
Aber wenn du nicht sagen kannst, was du machen willst, kann man dir auch nicht helfen. Viel Erfolg noch.