我有一個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
,並(在我的應用程序的顯著數據在葉子)關於記憶,以便在葉之前的檢查狀態恢復他們。它會導致一個很好的解決方案嗎?
樹在傳播檢查狀態時包含'tsCheckPropagation'狀態。所以簡單地問一下,如果這個狀態不包含並提示用戶。但是還有另一個(相當大的)問題,那就是如果你從'OnChecking'事件顯示一個消息對話框,你就會打破檢查狀態的確定。 – Victoria
我編輯了我的問題(爲葉子添加了一個示例解決方案) –