核心提示:进入正题,其实我并不是真的把双击事件提前了,而只是通过一个小技巧,让它“好像首先发生”而已。节点展开不外乎是两种方法,一种是点那个十字,一个是双击节点标题。因此,我们可以想办法通过人为控制,把展开的实...
进入正题,其实我并不是真的把双击事件提前了,而只是通过一个小技巧,让它“好像首先发生”而已。节点展开不外乎是两种方法,一种是点那个十字,一个是双击节点标题。因此,我们可以想办法通过人为控制,把展开的实际操作进行延迟。我们需要一个标记的属性:IsTreeViewManualExpanding来记录这个状态,请看以下代码:
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;