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;
- 1. Sắp xếp danh sáchXem theo Tên sản phẩm bằng Bộ điều hợp tùy chỉnh?
- 2. MapView trong danh sáchXem mục
- 3. Danh sách sắp xếp Knockout.js
- 4. Danh sáchXem cuộn đến mục đã chọn
- 5. sắp xếp danh sách các số dấu phẩy động theo nhóm
- 6. Sắp xếp các nhóm khác nhau bằng cách sử dụng các thứ tự sắp xếp khác nhau trong solr
- 7. Cách sắp xếp/sắp xếp dữ liệu trong Riak?
- 8. Sắp xếp lại một danh sách lệnh
- 9. Cách sắp xếp danh sách các chuỗi?
- 10. Python cách sắp xếp danh sách này?
- 11. Danh sách sắp xếp <String[]>
- 12. Sắp xếp danh sách html với javascript
- 13. Python: sắp xếp danh sách phụ thuộc
- 14. Sắp xếp danh sách trong Prolog
- 15. Cách sắp xếp danh sách bằng số?
- 16. Sắp xếp danh sách theo giá trị
- 17. Sắp xếp danh sách mảng chuỗi [] mảng
- 18. Đặt hàng LINQ theo, nhóm và sắp xếp theo từng nhóm?
- 19. Đồng vị jQuery - sắp xếp dữ liệu theo "nhóm"
- 20. "Sắp xếp theo" kết quả của "nhóm theo" tính?
- 21. Pandas sắp xếp theo nhóm tổng hợp và cột
- 22. Sắp xếp theo giá trị lớn nhất trong nhóm
- 23. Danh sách sắp xếp dựa trên danh sách khác
- 24. Cách sắp xếp danh sách theo danh sách khác?
- 25. Sắp xếp một danh sách từ một danh sách ID
- 26. Hiệu quả nhận được các khoản được sắp xếp của một danh sách được sắp xếp
- 27. C# Cách sắp xếp danh sách được sắp xếp theo cột giá trị
- 28. Sắp xếp một danh sách chung bởi một thứ tự sắp xếp bên ngoài
- 29. Sắp xếp danh sách có giá trị rỗng
- 30. Sắp xếp một danh sách bằng Python sử dụng kết quả từ sắp xếp một danh sách
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 –