2013-02-23 2 views
5

ListView에서 항목은 그룹 "BGroup", "CGroup"및 "DGroup"(그룹 머리글)로 그룹화됩니다. 이제 ListView에 새 Item을 추가하고 "AGroup"헤더가있는 새 그룹을이 Item에 할당하면 그룹 "AGroup"이 항상 그룹의 끝에 삽입됩니다. 새로운 그룹 주문은 BGroup, CGroup, DGroup, AGroup입니다. 그렇다면 어떻게 그룹을 올바른 알파벳순으로 정렬 할 수 있습니까? 순서는 다음과 같아야합니다 : AGroup, BGroup, CGroup, DGroup.ListView 그룹 정렬?

답변

8

예를 들어 ListView_SortGroups 매크로를 사용할 수 있습니다. 이 매크로는 LVGroupCompare 함수 프로토 타입으로 정의 된 자체 비교 함수를 가질 것으로 기대합니다. 다음 코드에서 그룹은 Header 속성에 따라 CompareText 함수를 사용하여 정렬되지만 이제는 자신 만의 비교를 구성 할 차례입니다.

잊어 버린; 어떤 pvData 매개 변수의 LVGroupCompare 함수에서받을 ListView_SortGroups 매크로의 마지막 Pointer 유형 매개 변수에 전달하면 특정 목록보기의 그룹 정렬 기능이 될 것이므로 직접 전달하는 것이 가장 좋습니다 Groups 쉽게 조작 할 수있는 목록보기 모음. 그룹 ID로 목록보기 그룹을 찾을 수있는 직접적인 방법이 없기 때문에

, 나는 TListGroups 클래스의 다음 도우미 함수를 사용하십시오 :

type 
    TListGroups = class(ComCtrls.TListGroups) 
    public 
    function FindItemByGroupID(GroupID: Integer): TListGroup; 
    end; 

implementation 

function TListGroups.FindItemByGroupID(GroupID: Integer): TListGroup; 
var 
    I: Integer; 
begin 
    for I := 0 to Count - 1 do 
    begin 
    Result := Items[I]; 
    if Result.GroupID = GroupID then 
     Exit; 
    end; 
    Result := nil; 
end; 

그런 다음 당신은 LVGroupCompare이 도우미 방법을 사용할 수 있습니다 함수 콜백은 다음과 같습니다.

function LVGroupCompare(Group1_ID, Group2_ID: Integer; 
    pvData: Pointer): Integer; stdcall; 
var 
    Item1: TListGroup; 
    Item2: TListGroup; 
    Groups: TListGroups; 
begin 
    Result := 0; 
    Groups := TListGroups(pvData); 
    Item1 := Groups.FindItemByGroupID(Group1_ID); 
    Item2 := Groups.FindItemByGroupID(Group2_ID); 
    if Assigned(Item1) and Assigned(Item2) then 
    Result := CompareText(Item1.Header, Item2.Header); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Item: TListItem; 
    Group: TListGroup; 
begin 
    Group := ListView1.Groups.Add; 
    Group.Header := 'AGroup'; 

    Item := ListView1.Items.Add; 
    Item.Caption := 'Item X'; 
    Item.GroupID := Group.ID; 

    ListView_SortGroups(ListView1.Handle, LVGroupCompare, ListView1.Groups); 
end; 
+0

감사합니다. 'E2009 호환되지 않는 유형 : 그러나, 컴파일러는'ListView_SortGroups' 라인에 오류 표시 '일반 절차 및 방법 pointer' 그러나 나는 "는 LVGroupCompare"전에 "@"를 추가 할 때'LVGroupCompare' @의 컴파일러는 같은 줄에 오류를 보여줍니다 : 'E2036 변수가 필요합니다 .' – user1580348

+0

그리고'LVGroupCompare'는 정규 절차로 정의되어 있습니까? 메서드가 될 수 없으며 중첩 되어서도 안됩니다. 필자는 컴파일러가 만족 스러웠던 델파이 2009 (지금 당장 델파이 XE2를 가지고 있지 않으므로)를 테스트했습니다. – TLama

+1

xe2에 문제가 없습니다 –