2017-09-24 83 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事件中使用該成員變量來允許或禁止更改檢查狀態。

相關問題