Delphi TreeView的Fire OnChange和OnClick事件,但不能同时发生

Delphi TreeView的Fire OnChange和OnClick事件,但不能同时发生,delphi,delphi-xe6,Delphi,Delphi Xe6,我在Delphi中使用一个TreeView,通过它的OnChange事件将所选项目添加到组合框中 但最大的问题是,当您单击树视图中的选定项时,OnChange事件不起作用。它仅在我单击未选中的项目时起作用 为了解决这个问题,我还使用OnClick事件。但问题是,这两个事件都是针对未选中的项目触发的: procedure Test; begin ShowMessage('submit'); end; procedure TForm1.TreeView1Click(Sender: TObjec

我在Delphi中使用一个TreeView,通过它的OnChange事件将所选项目添加到组合框中

但最大的问题是,当您单击树视图中的选定项时,OnChange事件不起作用。它仅在我单击未选中的项目时起作用

为了解决这个问题,我还使用OnClick事件。但问题是,这两个事件都是针对未选中的项目触发的:

procedure Test;
begin
  ShowMessage('submit');
end;

procedure TForm1.TreeView1Click(Sender: TObject);
begin
  Test;
end;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  Test;
end;
它运行ShowMessage两次。如何检查是否存在以前的事件,或者事件当前是否正在运行

类似于jQuery:

$ ("#foo") .bind ("Change click", function () {
   $ (This) .toggleClass ("entered");
});

也许这是一个太明显的解决办法,但你有没有试着。。。是否仅使用OnClick事件

但要回答您的问题,如何防止第二个事件发生:

典型的解决方案是将先前选择的索引存储在变量中,并检查该变量:

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  Test;
end;

procedure TForm1.TreeView1Click(Sender: TObject);
begin
  if TreeView1.Selected.Index = FPrevTreeViewIndex then
    Test;
  FPrevTreeViewIndex := TreeView1.Selected.Index;
end;

请发布实际执行您描述的方式的代码。的确,测试调用了两次,但自从您添加了ShowMessage“submit”之后就不再调用了,因为它退出了TreeView散焦。