2013-05-15 2 views
4

저는 일주일 동안 Delphi XE4를 사용해 왔으며 방금 새로운 TListGroups 기능을 발견했습니다. TlistItemGroupID을 쉽게 바꾸고 이동할 수 있습니다. 이제 TListItem이 그룹을 떠나 자마자 또는 TlistItem 그룹에 들어가 자마자 전화하는 절차를 갖고 싶습니다. 나는 이런 식으로 뭔가를 찾고 있어요 :Delphi XE4는 TListGroups 간의 항목 전환을 감지합니다.

procedure TForm1.ListView1On(Before/After)ListGroupEnter(Sender: TObject; Item: TListItem); 
begin 
// Do some stuff here like... 
// AllowedToDraw := TRUE/FALSE 
// I/O Code... 
// etc... 
end; 

procedure TForm1.ListView1On(Before/After)ListGroupLeave(Sender: TObject; Item: TListItem); 
begin 
// Do some stuff here like... 
// This might be replaceable with OnDeletion... 
// I/O Code... 
end; 

여기서 가장 큰 문제는 당신이 GroupID 속성을 설정하면 다양한 그룹 사이의 스위치를 감지하는 것입니다. GroupID 속성을 변경하거나 설정하면 즉시 스위치를 감지 할 수 있습니까?

+1

그것은'TListItem.SetGroupID' 세터을 차단해야합니다. 자신의 도우미 기능을 개선하고 거기에서 항목에 대한 'GroupID'를 설정하십시오. – TLama

+0

그룹 스위치를 어떻게 다루는 지 정확히 알지 못합니다. 항목을 완전히 삭제 한 다음 다른 그룹에 다시 추가합니까? –

+1

'GroupID' 설정 기는 ['LVITEM']의'iGroupId' 멤버를 설정합니다 (http://msdn.microsoft.com/en-us/library/windows/desktop/bb774760(v=vs.85). aspx) 구조체를 나타냅니다. 나머지는 시스템에 있습니다. – TLama

답변

4

TListItem.GroupID 속성 설정 기는 TListView's HWND에 LVM_SETITEM 메시지를 보냅니다. 당신은 TListView를 서브 클래스 화해, 예를 들면 TListView 과정이, 전에 메시지를 가로 챌 수 있습니다

const 
    APPWM_LISTVIEW_CHECKGROUP = WM_APP + 100; 

var 
    PrevLVWndProc: TWndMethod = nil; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    PrevLVWndProc := ListView1.WindowProc; 
    ListView1.WindowProc := LVWndProc; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    ListView1.WindowProc := PrevLVWndProc; 
end; 

procedure TForm1.LVWndProc(var Message: TMessage); 
var 
    LVItem: PLVItem; 
    ListItem: TListItem; 
begin 
    case Message.Msg of 
    LVM_SETITEM: 
    begin 
     LVItem := PLVItem(Message.LParam); 
     if (LVItem^.mask and LVIF_GROUPID) <> 0 then 
     begin 
     ListItem := ListView1.Items[LVItem.iItem]; 

     if ListItem.GroupID <> LVItem.iGroupID then 
     begin 
      if ListItem.GroupID >= 0 then 
      ListView1GroupLeave(ListView1, ListItem); 

      PrevLVWndProc(Message); 

      // this gives the TListItem time to actually update itself 
      PostMessage(ListView1.Handle, APPWM_LISTVIEW_CHECKGROUP, 0, LVItem.iItem); 

      Exit; 
     end; 
     end; 
    end; 
    APPWM_LISTVIEW_CHECKGROUP: 
    begin 
     ListItem := ListView1.Items[Message.LParam]; 
     if ListItem.GroupID >= 0 then 
     ListView1GroupEnter(ListView1, ListItem); 
     Exit; 
    end; 
    end; 

    PrevLVWndProc(Message); 
end; 

procedure TForm1.ListView1GroupLeave(Sender: TObject; Item: TListItem); 
begin 
    // Item is about to leave from its current GroupID ... 
end; 

procedure TForm1.ListView1GroupEnter(Sender: TObject; Item: TListItem); 
begin 
    // Item has entered into its current GroupID ... 
end;  
+0

작품. 고맙습니다. 미래의 엠바 카데로 제품에 이것을 추가 할 필요가 있습니다. –