私はタイプTVirtualStringTree
のコンポーネントを持っています。オプションtoCheckSupport
が有効になっています。伝播が必要なため、チェックステートの伝播に関連するオプションも有効です。私は確認のノードをチェックして実装したい( "あなたは確かにチェックしますか?")。残念ながら、伝播のオプションが有効になっている場合は、子ノードを含むOnCheck
とOnChecking
イベントがトリガーされます。したがって、メッセージをイベントプロシージャに配置すると、繰り返し表示されます。一度の確認でノードとその子ノードをチェックする方法はありますか?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
を使用して考えた、と(私のアプリケーションのように重要なデータが葉である)ために、葉の前のチェック状態を思い出しについてそれらを復元する。良い解決策につながるでしょうか?
ツリーは、チェック状態を伝播するときに 'tsCheckPropagation'状態を含みます。したがって、その状態が含まれていないかどうかを尋ねて、ユーザーにプロンプトを出します。しかし、別の(かなり大きい)問題があります。それは、 'OnChecking'イベントからメッセージダイアログを表示すると、状態チェックのチェックを破ります。 – Victoria
私の質問を編集しました(葉のサンプルソリューションを追加しました) –