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

问题描述 投票:0回答:1

我有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来识别用户检查的确切节点,并且(在我的应用程序中,重要数据在叶子中)关于记住叶子的先前检查状态以便恢复它们。它会导致一个很好的解决方案吗?

delphi confirmation virtualtreeview tvirtualstringtree
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.