最简单的就是直接在树展开事件里头调用双击事件就可以了,为防止双击里头代码被重复执行,可设置一些标记。 如: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;
我也是通过标记位,但是我用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;
如: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;
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;