J'ai un composant de type TVirtualStringTree
. L'option toCheckSupport
est activée. Les options liées à la propagation des checkstates sont également activées, car la propagation est nécessaire. Je veux implémenter la vérification d'un noeud avec une confirmation ("Etes-vous sûr de vouloir vérifier ...?"). Malheureusement, si les options de propagation sont activées, les événements OnCheck
et OnChecking
sont déclenchés y compris pour les nœuds enfants. Par conséquent, placer le message dans les procédures événementielles le fait apparaître à plusieurs reprises. Avez-vous une idée de comment vérifier un nœud et ses nœuds enfants avec une seule confirmation?TVirtualStringTree. Comment vérifier un noeud et ses enfants avec une seule confirmation?
Je pense à la vérification manuelle, c'est-à-dire que l'utilisateur veut vérifier un nœud dans l'arbre (et donc tous les descendants du nœud) et ne doit être confirmé qu'une seule fois. La vérification avec confirmation est simple si l'utilisateur veut vérifier une feuille: il suffit de restaurer le noeud à l'état précédent.
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;
Je pensais à l'aide OnNodeClick
afin d'identifier le nœud exact qui est devenu contrôlé par l'utilisateur, et (comme dans ma demande les données importantes sont en feuilles) de se rappeler les états de contrôle précédent des feuilles afin pour les restaurer. Cela mènerait-il à une bonne solution?
L'arborescence inclut l'état 'tsCheckPropagation' lors de la propagation des états de vérification. Alors demandez simplement si cet état n'est pas inclus et demandez à l'utilisateur. Mais il y a un autre problème (plus important) et si vous affichez une boîte de dialogue de message à partir de l'événement 'OnChecking', vous casserez la détermination d'état de vérification. – Victoria
J'ai édité ma question (ajouté un exemple de solution pour les feuilles) –