2017-09-24 12 views
0

私はタイプTVirtualStringTreeのコンポーネントを持っています。オプションtoCheckSupportが有効になっています。伝播が必要なため、チェックステートの伝播に関連するオプションも有効です。私は確認のノードをチェックして実装したい( "あなたは確かにチェックしますか?")。残念ながら、伝播のオプションが有効になっている場合は、子ノードを含むOnCheckOnCheckingイベントがトリガーされます。したがって、メッセージをイベントプロシージャに配置すると、繰り返し表示されます。一度の確認でノードとその子ノードをチェックする方法はありますか?TVirtualStringTree。 1つの確認でノードとその子をチェックする方法

私はマニュアルチェックを考えています。すなわち、ユーザーはツリー内のノード(したがってすべてのノードの子孫)をチェックしたいと思って、一度だけ確認を求められます。ユーザーがリーフをチェックしたい場合、確認を伴うチェックは簡単です。ノードを以前の状態に戻すだけで十分です。

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の場合はとなり、THitPositions.ctCheckBoxTHitInfo.HitPositionsに含まれているかどうかを確認してください。その場合、THitInfo.HitNodeに対応するノードが含まれています。次に、確認ダイアログを表示し、その結果をOnCheckingイベントで使用してチェック状態の変更を許可または禁止するメンバー変数に結果を保存することができます。

関連する問題