2013-02-23 33 views
5

Trong một ListView, các mục được nhóm theo nhóm "BGroup", "CGroup" và "DGroup" (Đây là các tiêu đề nhóm). Bây giờ, khi tôi thêm một Item mới vào ListView và gán một nhóm mới với tiêu đề "AGroup" vào Item này, nhóm "AGroup" luôn được chèn vào cuối nhóm; do đó, thứ tự nhóm mới là: BGroup, CGroup, DGroup, AGroup. Vậy làm thế nào tôi có thể nhận được các nhóm được sắp xếp theo đúng thứ tự bảng chữ cái? Thứ tự nên là: AGroup, BGroup, CGroup, DGroup.Sắp xếp danh sáchXem nhóm?

Trả lời

8

Bạn có thể sử dụng macro ListView_SortGroups cho ví dụ này. Macro này dự kiến ​​từ bạn để có hàm so sánh của riêng bạn, được xác định bởi nguyên mẫu hàm LVGroupCompare. Trong đoạn mã sau, các nhóm được sắp xếp theo thuộc tính Header bằng cách sử dụng hàm CompareText, nhưng giờ đây bạn đã xây dựng nên sự so sánh của riêng mình.

Quên ghi chú; bất cứ điều gì bạn chuyển đến tham số loại Pointer cuối cùng của macro ListView_SortGroups bạn sẽ nhận được trong hàm LVGroupCompare trong thông số pvData, do đó, đây sẽ là chức năng phân loại nhóm của một chế độ xem danh sách nhất định, cách tốt nhất là chuyển trực tiếp Groups bộ sưu tập chế độ xem danh sách đó để thao tác dễ dàng hơn.

Vì không có cách trực tiếp để tìm thấy một nhóm xem danh sách theo nhóm ID, tôi muốn sử dụng chức năng helper sau cho lớp 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; 

Sau đó, bạn có thể sử dụng phương pháp helper này trong LVGroupCompare gọi lại hàm theo cách này:

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

Cảm ơn bạn. Tuy nhiên, trình biên dịch hiển thị lỗi trong dòng 'ListView_SortGroups': ' E2009 Các loại không tương thích: 'Con trỏ phương thức và phương thức thông thường' Nhưng khi tôi thêm "@" trước "LVGroupCompare": '@ LVGroupCompare', trình biên dịch cho thấy lỗi trong cùng một dòng: 'E2036 Biến yêu cầu ' – user1580348

+0

Và bạn có' LVGroupCompare' được định nghĩa là thủ tục thông thường (như tôi có)? Nó không thể là một phương pháp và không nên lồng nhau. Tôi đã thử nghiệm này chỉ với Delphi 2009 (kể từ khi tôi không có Delphi XE2 bằng tay bây giờ), nơi trình biên dịch đã được hài lòng. – TLama

+1

không có vấn đề với xe2 –

Các vấn đề liên quan