2017-09-24 9 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 인 경우 으로 전화하고 THitPositions.ctCheckBoxTHitInfo.HitPositions에 포함되어 있는지 확인하십시오. 그렇다면 THitInfo.HitNode에 해당 노드가 있습니다. 그런 다음 확인 대화 상자를 표시하고 OnChecking 이벤트에서 검사 상태의 변경을 허용 또는 금지 할 수있는 멤버 변수에 결과를 저장할 수 있습니다.