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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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来识别用户检查的确切节点,并且(在我的应用程序中,重要数据在叶子中)关于记住叶子的先前检查状态以便恢复它们。它会导致一个很好的解决方案吗?

答案

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

以上是关于TVirtualStringTree。如何通过一次确认检查节点及其子节点?的主要内容,如果未能解决你的问题,请参考以下文章

TVirtualStringTree - 如何在单击所选行的任何区域时启用拖动?

如何在TVirtualStringTree中自动调整跨越列的大小?

VirtualTreeView - 同一节点中不同颜色的文本

Swift,如何通过按下按钮一次又一次地播放声音

如何通过 PhpMyAdmin 一次导入多个数据库?

如何一次通过名称属性为多个元素设置值(ExtJs 4)