只有在单击树视图节点时执行事件

9

我(花费更多时间)试图在单击树视图项时执行操作,请参见:

procedure TForm1.TreeView1Click(Sender: TObject);
begin

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

end;

这段代码在用户点击树形视图的第1个索引时显示一条消息。问题是:如果用户选择了索引1,则消息将被显示,但是此后,如果用户点击列表视图的空白区域,消息仍然会执行,因为该项仍然处于选定状态。我该如何只让事件在用户点击相应的项目时才运行?

3个回答

9

不要使用 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
此外,还需要考虑键盘。有些人只使用键盘,而不使用鼠标。 - Andreas Rejbrand
@AndreasRejbrand,我想使用事件“TTreeView.OnChange”。但是当我点击或按键时,它并没有触发。你有任何想法吗,为什么它不会触发事件? - Ugur
有没有什么解决方案,如果有人想使用TreeView的OnClick事件处理程序而不是OnChange? - john_who_is_doe
@tdiop:请阅读我的回答的第一句话,它回答了您评论中的问题。如果您想处理 TreeView 上的任何单击事件,请使用 OnClick。如果您想处理单个节点上的点击事件(而不是在没有节点的区域上),请使用 OnChange。这在我的回答中已经非常清楚地解释了。 - Ken White
1
OnChange事件只触发一次,但如果我想处理连续点击同一项怎么办? - Anton Duzenko
显示剩余5条评论

4
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
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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接