2017-09-24 40 views
0

我有一个TVirtualStringTree类型的组件。选项toCheckSupport已启用。与传播检查状态相关的选项也被启用,因为传播是必需的。我想用确认来实现检查节点(“你确定要检查...?”)。不幸的是,如果启用传播选项,则会触发包括子节点在内的事件OnCheckOnChecking。因此,将消息放入事件过程中会使其反复显示。你有任何想法如何用一次确认来检查一个节点及其子节点吗?TVirtualStringTree。如何使用单一确认检查节点及其子节点?

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

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,并(在我的应用程序的显著数据在叶子)关于记忆,以便在叶之前的检查状态恢复他们。它会导致一个很好的解决方案吗?

+0

树在传播检查状态时包含'tsCheckPropagation'状态。所以简单地问一下,如果这个状态不包含并提示用户。但是还有另一个(相当大的)问题,那就是如果你从'OnChecking'事件显示一个消息对话框,你就会打破检查状态的确定。 – Victoria

+0

我编辑了我的问题(为叶子添加了一个示例解决方案) –

回答

0

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

相关问题