如何在TVirtualStringTree节点hover/选中时显示删除图标并处理点击事件?
TVirtualStringTree 实现Hover/选中节点显示删除图标及点击处理
一、显示删除图标:GetImageIndex是可行方案
用GetImageIndex事件完全可以实现需求,搭配鼠标事件跟踪hover节点即可,具体步骤如下:
- 先准备好包含“删除”图标的
TImageList,记录该图标的索引(比如命名为DeleteIconIdx)。 - 定义类级变量
FHoverNode: PVirtualNode,用于追踪当前鼠标hover的节点。 - 处理
OnMouseMove事件:procedure TForm1.VSTMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var HitNode: PVirtualNode; begin HitNode := VST.GetNodeAt(X, Y); if HitNode <> FHoverNode then begin // 刷新之前的hover节点,清除旧图标 if Assigned(FHoverNode) then VST.InvalidateNode(FHoverNode); FHoverNode := HitNode; // 刷新新的hover节点,显示图标 if Assigned(FHoverNode) then VST.InvalidateNode(FHoverNode); end; end; - 处理
OnMouseLeave事件,避免鼠标离开后图标残留:procedure TForm1.VSTMouseLeave(Sender: TObject); begin if Assigned(FHoverNode) then begin VST.InvalidateNode(FHoverNode); FHoverNode := nil; end; end; - 在
GetImageIndex事件中判断显示逻辑:procedure TForm1.VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); begin // 默认显示原有图标(比如文件/文件夹图标,假设原索引为DefaultIconIdx) ImageIndex := DefaultIconIdx; // 判断节点是否被选中,或处于hover状态 if (Sender.IsSelected(Node)) or (Node = FHoverNode) then ImageIndex := DeleteIconIdx; // 替换为删除图标 end;
二、删除图标的点击事件处理
要准确捕获删除图标的点击,需结合鼠标事件和命中测试:
- 处理
OnMouseDown事件:procedure TForm1.VSTMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var HitInfo: THitInfo; TargetNode: PVirtualNode; begin VST.GetHitTestInfoAt(X, Y, True, HitInfo); TargetNode := HitInfo.HitNode; // 判断是否点击在图标区域,且当前节点符合显示删除图标的条件 if Assigned(TargetNode) and (HitInfo.HitPosition = hpOnIcon) and ((VST.IsSelected(TargetNode)) or (TargetNode = FHoverNode)) then begin // 执行删除逻辑,可先弹出确认框 if MessageDlg('确定要删除该节点吗?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then VST.DeleteNode(TargetNode); end; end; - 补充:如果需要严格区分“点击默认图标”和“点击删除图标”的行为,可以在判断条件中额外校验当前节点的ImageIndex是否为
DeleteIconIdx,确保只有点击删除图标时才触发删除操作。
内容的提问来源于stack exchange,提问作者Mattia72
相关产品推荐
相关产品推荐

