4

toTeamAware가 활성화되면 VirtualTrees.pas 버전 5.0.0의 체크 박스 처리가 깨졌습니다. csUncheckedNormal 인 노드는 checked + hot으로 그려집니다.TVirtualStringTree에서 테마 체크 상자가 잘못 그려졌습니다.

DrawElement를 사용하여 체크되지 않은 테마 체크 박스를 올바르게 그리려면 Details 레코드는 Element = teButton, Part = 3 및 State = 5 여야합니다. 그러나 VirtualTrees.pas는 노드가 csUncheckedNormal로 설정됩니다.

VirtualTrees에서 간접 지정과 여분의 상수가 선언 된 것으로 보입니다. 따라서이 문제를 해결하는 가장 좋은 방법은 확실하지 않습니다. 아이디어가 환영 ...

(화면에 TVirtualStringTree를 가져오고 일부 데이터로 채워지는 최소한의 코드조차도 여기에 게시하는 데 약간 시간이 걸립니다.) 기본 사항 외에, 이것을 재현하려면 TreeOptions에서 toCheckSupport를 활성화해야합니다. .MiscOptions를 설정하고 InitNode 콜백에서 Node.CheckType : = ctTriStateCheckBox를 설정하십시오.)

+0

나는 지금 다음을했다. VirtualStringTree v.5.0.0을 폼에 저장하고, toCheckSupport를 MiscOptions에 포함하고, toThemeAware를 PaintOptions에 유지하고, 특정 이벤트 핸들러에 다음 코드 행을 추가합니다. VirtualStringTree1.AddChild (nil) .CheckType : = ctTriStateCheckBox; Windows 7의 Delphi 2009에서 응용 프로그램을 실행하고 확인란을 자세히 살펴보십시오. 그들은 뜨거운 상태가 아니 었습니다. 그래서이 글을 쓰려면 여기로 돌아가서 VCL 스타일을 사용하도록 설정했는지 (코드를 살펴보기 전에) 물어 보시고 ENTER 키를 누르십시오 :-) – TLama

+0

예, 죄송합니다. 스타일이 활성화 된 앱에 있습니다. , 델파이 XE2. –

+0

@TLama : 올바르게 그림을 보는 경우, 코드의 몇 가지 부분에서 볼 수있는 것에 정말로 관심이 있습니다. TBaseVirtualTree.PaintCheckImage의 ImageInfo.Index 값입니다. 나는 2 번째 케이스에 부딪치게되는 9 개를 가지므로 State : = 9-8입니다. 이것은 틀 렸습니다. 그 Index of 9는 TBaseVirtualTree.GetCheckImage와 const의 ckCheckUncheckedNormal (VirtualTrees.pas의 122 행에있는 9의 const 임)에서옵니다. * 무언가 * 당신이 정확하게 그 페인트를 보았다면 다른 것이어야합니다. 감사! –

답변

6

사실, VirtualTreeView는 델파이 XE2로 이식 할 때 VCL 스타일로 계산되지 않으므로 문제를 해결할 수 있습니다. 그리기 전에 요소 세부 정보를 가져와야합니다. 그렇지 않으면 VirtualTreeView 페인트 확인란의 상태를 시뮬레이션하는 것과 같은 효과가 나타납니다. 다른 순서와 아티팩트를 주목하십시오. 내가 아는

enter image description here

아주 이상한,하지만 난이 일어나고있는 이유를 대답 할 수없는 : 그것은 한 번 사용할 VCL 스타일과 같은 코드의 결과입니다, 두 번째는 사용 가능. TThemeServices.GetElementDetails으로 전화하거나 선택적으로 상태 색인을 계산하여 요소 렌더링이 제대로 작동하도록해야한다고 말할 수 있습니다. 다음 픽스를 사용하려고 시도 할 수 있습니다.

procedure TBaseVirtualTree.PaintCheckImage(Canvas: TCanvas; 
    const ImageInfo: TVTImageInfo; Selected: Boolean); 
var 
    // add a new variable for calculating TThemedButton state from the input 
    // ImageInfo.Index; I hope ImageInfo.Index has the proper state order 
    State: Integer; 
begin 
... 
    case Index of 
    0..8: // radio buttons 
    begin 
     // get the low index of the first radio button state and increment it by 
     // the ImageInfo.Index and get details of the button element 
     State := Ord(TThemedButton(tbRadioButtonUncheckedNormal)) + Index - 1; 
     Details := StyleServices.GetElementDetails(TThemedButton(State)); 
    end; 
    9..20: // check boxes 
    begin 
     // get the low index of the first check box state and increment it by 
     // the ImageInfo.Index and get details of the button element 
     State := Ord(TThemedButton(tbCheckBoxUncheckedNormal)) + Index - 9; 
     Details := StyleServices.GetElementDetails(TThemedButton(State)); 
    end; 
    21..24: // buttons 
    begin 
     // get the low index of the first push button state and increment it by 
     // the ImageInfo.Index and get details of the button element 
     State := Ord(TThemedButton(tbPushButtonNormal)) + Index - 21; 
     Details := StyleServices.GetElementDetails(TThemedButton(State)); 
    end; 
    else 
    Details.Part := 0; 
    Details.State := 0; 
    end; 
... 
end; 

모든 검사 유형에 대해이 테스트를 거쳤습니다.

+0

예, 실제로 문제가 해결됩니다. Treeview 제작자가 취할 동일한 접근 방법이라면 궁금합니다.특히, 나는 그것이 무엇인지 모르겠지만 GetCheckImage()에서 전체 CheckStateToCheckImage 배열에 대한 이유가 있어야한다고 생각할 것이다. 그리고 그것은 나에게 이미 존재하는 것의 위에 추가 된 다른 수준의 const로 보인다. consts. 어쨌든, 이것은 효과가있다, 고마워! –