TVirtualStringTree。如何通过一次确认检查节点及其子节点?

时间:2017-09-24 15:03:29

标签: delphi confirmation virtualtreeview tvirtualstringtree

我有TVirtualStringTree类型的组件。选项toCheckSupport已启用。还启用了与检查状态传播相关的选项,因为需要传播。我想实现检查一个带有确认的节点(“你确定要检查......?”)。遗憾的是,如果启用了传播选项,则会触发事件OnCheckOnChecking,包括子节点。因此,将消息放入事件过程会使其重复显示。您是否知道如何通过一次确认来检查节点及其子节点?

我想到了手动检查,即用户想要检查树中的节点(以及因此所有节点的后代)并且仅被要求​​确认一次。如果用户想要检查叶子,则检查确认很简单:将节点恢复到先前状态就足够了。

procedure TMyForm.VSTChecked(Sender: TBaseVirtualTree; Node: PVirtualNode);
begin
  if Node.CheckState = csCheckedNormal then
  begin
    if not VST.HasChildren[Node] then
    begin
      if MessageDlg('Are you sure you want to check?', mtConfirmation,
        mbYesNo, 0) <> mrYes then
      begin
        Node.CheckState := csUncheckedNormal;
        PropagateCheckState(VST, Node); // From Node's parent to the root 
      end;
    end;
  end;
end;

我考虑使用OnNodeClick来识别用户检查的确切节点,并且(在我的应用程序中,重要数据在叶子中)关于按顺序记住叶子的先前检查状态恢复他们。它会导致一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

使用OnMouseDown事件获得有关鼠标单击的通知。如果它TMouseButton.mbLeft致电GetHitTestInfoAt()并检查THitPositions.ctCheckBox中是否包含THitInfo.HitPositions。如果是,THitInfo.HitNode包含相应的节点。然后,您可以显示确认对话框并将结果保存在成员变量中,您可以在OnChecking事件中使用该变量来允许或禁止更改检查状态。