如题,谢谢。

解决方案 »

  1.   

    最简单的就是直接在树展开事件里头调用双击事件就可以了,为防止双击里头代码被重复执行,可设置一些标记。
    如:procedure TFmXXX.tvTestCollapsed(Sender: TObject; Node: TTreeNode);
    begin
      tvTest.Tag := 1;                           //设置开关
      tvTestDblClick(sender);
      //tvTest.Perform(WM_LBUTTONDBLCLK,0,0);    //这种方式也可以模拟双击事件
      ShowMessage(' On Expanded ');
      tvTest.Tag := 1;                           //开关复位
    end;procedure TFmXXX.tvTestDblClick(Sender: TObject);
    begin
      if tvTest.Tag=1 then
      begin
        ShowMessage('on double click action called by expanded action');
        tvTest.Tag := 0;
      end
      else ShowMessage('normal treeview double click action');
    end;
      

  2.   

    我也是通过标记位,但是我用hittest来判断这样:procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean);
    var
     P: TPoint;
    begin
     P := TreeView1.ScreenToClient(Mouse.CursorPos);
     if (htOnLabel in FTreeView.GetHitTestInfoAt(P.X, P.Y)) and (not IsTreeViewManualExpanding) then
     begin
      // 如果展开时点在了标题上,说明时双击展开的,进行人工控制
      IsTreeViewManualExpanding := true;
      AllowExpansion := false;
     end;
    end;
     
    procedure TForm1.TreeView1DblClick(Sender: TObject);
    var
     P: TPoint;
     ANode : TTreeNode;
    begin
     P := TreeView1.ScreenToClient(Mouse.CursorPos);
     ANode := TreeView1.GetNodeAt(P.X, P.Y);
     if ANode <> nil then
     begin
      // ------------------------------
      // 这里写你要进行的节点操作
      // ------------------------------
      if IsTreeViewManualExpanding then
      begin
       // 手动展开节点
       ANode.Expand(false);
       IsTreeViewManualExpanding := false;
      end;
     end;
    end;