2014-11-13 8 views
1

TTreeViewItem의 확장/축소 사용자 작업에 대해 대응해야합니다. 하지만 Firemonkey의 TTreeView/TTreeViewItem에 이러한 이벤트가 누락 된 것 같습니다. . 또한 비공개이며 virutal하지 TTreeViewItem 가능한 모든 방법들은 그래서에 후크 수 I는 MokeyStyler's blog에 기재된 용액을했지만, 적어도 델파이 XE7에 이상한 부작용 가지고Firemonkey의 TTreeViewItem에 대한 OnExpand/OnCollapse 이벤트 구현

  • 이벤트는 두 화재 타임스;
  • TreeViewItem2 (예제 이름)를 확장하면 TreeViewItem1에 대한 이벤트가 발생합니다.

델파이 XE7

어떤 제안을 사용하고 있습니다? :)

+0

"OnChangeExpanded가 할당되지 않은 TTreeViewItem 항목의 이벤트가 발생합니다."라는 두 번째 요지를 이해할 수 없습니다. OnChangeExpanded *는 * 발생하는 이벤트이므로 할당되지 않은 경우 어떻게 시작됩니까? –

+0

@MikeSutton TreeViewItem2를 확장하면 TreeViewItem1에 할당 된 이벤트가 실행되는 것을 의미합니다. 나는 그 총알을 다듬을거야. –

+0

그 경우에는 스타일링 시스템에서 이상한 소리가납니다 (혼란스러워지는 스타일 캐싱 문제가있을 수 있음). 나는 이것에 돌아올 것이나 며칠이 걸릴지 모른다. –

답변

2

XE6 이상에서 SetIsExpanded 메서드가 있다는 사실을 놓쳤습니다. 이것이 가상입니다. 그래서 내 솔루션은 다소 간단하다 :

TTreeViewItem = class(FMX.TreeView.TTreeViewItem) 
    private 
    FOnChangeExpanded, 
    FOnChangeCollapsed: TNotifyEvent; 
    protected 
    procedure SetIsExpanded(const Value: Boolean); override; 
    published 
    property OnChangeExpanded: TNotifyEvent read FOnChangeExpanded write FOnChangeExpanded; 
    property OnChangeCollapsed: TNotifyEvent read FOnChangeCollapsed write FOnChangeCollapsed; 
end; 

... 

procedure TTreeViewItem.SetIsExpanded(const Value: Boolean); 
var 
    LWasExpanded: boolean; 
begin 
    LWasExpanded := IsExpanded; 
    inherited; 
    if (IsExpanded) AND (LWasExpanded = false) then 
    if Assigned(OnChangeExpanded) then 
     OnChangeExpanded(Self) 
    else 
    else 
    if Assigned(OnChangeCollapsed) then 
     OnChangeCollapsed(Self); 
end; 

이다 즉 그것은

I posted a QC for enhancement을 :) 나는이 기본 기능의 부족이라고 생각하기 때문이다.