2013-05-25 63 views
5

我,(更多的时间),试图执行行动时,我点击进入一个TreeView的项目看:执行事件仅在点击一个TreeView节点

procedure TForm1.TreeView1Click(Sender: TObject); 
begin 

    if treeview1.Selected.AbsoluteIndex=1 then 
    begin 
    showmessage('selecionado'); 
    end; 

end; 

此代码显示一条消息,如果用户点击进入树视图的索引1,问题是以下内容:如果用户选择的索引1,将所示的消息,但是在这之后,用户点击进入仍然执行所述消息列表视图的空白区域,因为该项目仍处于选中状态。只有当用户点击相应的项目时,我如何才能使事件运行?

回答

7

不要使用OnClick,只要单击了TTreeView(不仅在单击节点时)就会发生这种情况。相反,使用TTreeView.OnChange事件,通过你的节点:

procedure TForm3.TreeView1Change(Sender: TObject; Node: TTreeNode); 
begin 
    if Assigned(Node) then 
    if Node.AbsoluteIndex = 1 then 
     ShowMessage('selecionado'); 
end; 
+7

此外,人们必须考虑键盘的。有些人只使用键盘,没有鼠标。 –

+0

@AndreasRejbrand,我想使用事件“TTreeView.OnChange”。但它不会通过点击或按键来触发。你有什么想法,为什么它不会触发事件? – Ugur

+0

有人希望使用treeview的OnClick事件处理程序而不是OnChange的任何解决方案? – grinner

0
procedure TForm1.TreeView1Click(Sender: TObject); 
begin 
    if Assigned(TreeView1.Selected) then 
    begin 
     if SameText(TreeView1.Selected.Text, 'show form1') then 
      ShowMessage('selecionado') 
     else 
      if SameText(TreeView1.Selected.Text, 'show form2') then 
       ShowMessage('s22'); 
    end 
end; 
1
procedure TfClerks.tvHqClick(Sender: TObject); 
var 
    Node: TTreeNode; 
begin 
    with tvHq.ScreenToClient(Mouse.CursorPos) do 
    Node := tvHq.GetNodeAt(X, Y); 
    if Node = nil then 
    Exit; 
    // do something 
end; 
+0

这是完美的答案。谢谢.. –