TVirtualStringTree。如何使用单一确认检查节点及其子节点?
问题描述:
我有一个TVirtualStringTree
类型的组件。选项toCheckSupport
已启用。与传播检查状态相关的选项也被启用,因为传播是必需的。我想用确认来实现检查节点(“你确定要检查...?”)。不幸的是,如果启用传播选项,则会触发包括子节点在内的事件OnCheck
和OnChecking
。因此,将消息放入事件过程中会使其反复显示。你有任何想法如何用一次确认来检查一个节点及其子节点吗?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
,并(在我的应用程序的显著数据在叶子)关于记忆,以便在叶之前的检查状态恢复他们。它会导致一个很好的解决方案吗?
答
使用OnMouseDown
事件获取有关鼠标单击的通知。如果它是TMouseButton.mbLeft
请致电GetHitTestInfoAt()
并检查THitPositions.ctCheckBox
是否包含在THitInfo.HitPositions
中。如果是这样,THitInfo.HitNode
包含相应的节点。然后,您可以显示确认对话框并将结果保存在成员变量中,您可以在OnChecking事件中使用该成员变量来允许或禁止更改检查状态。
树在传播检查状态时包含'tsCheckPropagation'状态。所以简单地问一下,如果这个状态不包含并提示用户。但是还有另一个(相当大的)问题,那就是如果你从'OnChecking'事件显示一个消息对话框,你就会打破检查状态的确定。 – Victoria
我编辑了我的问题(为叶子添加了一个示例解决方案) –