2017-09-24 2 views
0

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?

+0

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

+0

J'ai édité ma question (ajouté un exemple de solution pour les feuilles) –

Répondre

0

Utilisez l'événement OnMouseDown pour être informé d'un clic de souris. Si c'est TMouseButton.mbLeft, appelez GetHitTestInfoAt() et vérifiez si THitPositions.ctCheckBox est inclus dans THitInfo.HitPositions. Si tel est le cas, THitInfo.HitNode contient le noeud correspondant. Vous pouvez ensuite afficher la boîte de dialogue de confirmation et enregistrer le résultat dans une variable membre que vous pouvez utiliser dans l'événement OnChecking pour autoriser ou interdire la modification de l'état de vérification.