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
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;
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
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
không có vấn đề với xe2 –