Frage zur TTreeView Auswahl
-
Hallo allerseits!
Ich verwende in meinem Projekt einen TTreeView bei dem ich, wenn ich mit der rechten Maustaste darauf klicke, ein Popupmenü anzeige. Mein Problem, mit dem ich mich zur Zeit rumschlage, ist, dass ich trotz TTreeView->RightklickSelect = true bei einem Rechtsklick auf ein Item immer das zuletzt mit dem Rahmen focusierte Item bekomme, und nicht das aktuell farblich markierte. Wie überzeuge ich den TTreeView trotzdem davon?
F98
-
Ich kann Dein Problem leider nicht nachvollziehen.
Hab' einfach auf einem Form ein TreeView gelegt, ein PopUpMenu dazu:
void __fastcall TForm1::PopupMenu1Popup(TObject *Sender) { TTreeNode* tnTest = TreeView1->Selected; Test1->Caption = "Test " + tnTest->Text; }Liefert immer die ausgewählten Text, auch bei einem Rechtsklick.
Vielleicht kannst Du Deinen Code mal posten.
Grüße
-
So wild ist mein Code auch nicht:
void __fastcall TfrmMain::tvProcessViewClick(TObject *Sender) { TTreeNode *SelNode = tvProcessView->Selected; if (SelNode) { switch (SelNode->Level) { case 0 : { ... break; } case 1 : { ... break; } default : {} } } }"SelNode" zeigt dann immer auf das Item mit dem Auswahlrechteck, nicht auf das, welches ich mit Rechtsklick selektiert habe.
Bsp:
1. Auf ein bel. Element linksklicken (Auswahlrechteck [Focus] und Selektionsbalken sind jetzt auf dem Element
2. auf ein anderes bel. Element rechtsklicken (nur der Selektionsbalken ist jetzt auf dem Element, der Focus noch aus dem Links geklickten)
-
Hab' gerade mal in der Hilfe nachgeschaut:
Durch RightClickSelect können mit Hilfe der Eigenschaft Selected die Knoten ermittelt werden, auf die der Benutzer mit der rechten Maustaste geklickt hat. Wenn RightClickSelect den Wert true hat, enthält Selected den zuletzt mit der linken oder rechten Maustaste angeklickten Knoten. Hat RightClickSelect den Wert false, enthält Selected den zuletzt mit der linken Maustaste angeklickten Knoten.
RightClickSelect wirkt sich nur auf den Wert der Eigenschaft Selected, nicht auf das Markieren von Knoten im Baumdiagramm aus
Somit zeigt Dein TreeView exakt das in der Hilfe beschriebene Verhalten.
So auf die Schnelle (im Ereignis MouseUp):
void __fastcall TForm1::TreeView1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (Button == mbRight) { TTreeNode *SelNode = TreeView1->Selected; TreeView1->Select(SelNode, Shift); } }Grüße
-
OnClick wird bei einem Rechtsklick gar nicht ausgelöst, deshalb war der Ansatz von vornherein zum Scheitern verurteilt.

-
Jansen schrieb:
OnClick wird bei einem Rechtsklick gar nicht ausgelöst, deshalb war der Ansatz von vornherein zum Scheitern verurteilt.

Das ist korrekt, aber es wird auch nicht die entsprechende Node in der Oberfläche des TreeView ausgewählt. Es wird nur die Eigenschaft Selected gesetzt. Um die Änderung in Selected auf die Oberfläche des TreeViews abzubilden, ist mein (primitiver) Lösungsansatz durchaus geeignet.
Wenn er statt OnClick OnMouseUp und OnMouseDown verwendet, sollte er zurechtkommen.Grüße
-
Joe_M. schrieb:
Das ist korrekt, aber [...]
Mein Hinweis bezog sich in keiner Weise auf deinen Beitrag.
-
@Jansen: Versteh' nicht was Du mir sagen willst... Falls Du Dein Posting von mir in Frage gestellt siehst, möchte ich mich entschuldigen, das lag nicht in meiner Absicht.
Eigentlich wollte ich nur meiner Verwunderung Ausdruck verleihen, dass es zwar die Eigenschaft RightClickSelect gibt, mir aber kein sinnvoller Einsatzbereich einfällt, wenn die Darstellung des TreeViews davon unberührt bleibt und nur intern eine Eigenschaft geändert wird...
Grüße
-
Ok. Ich muss also alles was in OnClick steht in OnMouseDown/Up ausführen. Ich mach mich mal ran ...
