Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создать TListView, который автоматически пересортирует при щелчке на заголовке колонки

Delphi , Синтаксис , Сортировка

Создать TListView, который автоматически пересортирует при щелчке на заголовке колонки

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

unit SortedListView;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   ComCtrls;

 type
   TSortedListView = class(TListView)
   private
     FSortColumn: Integer;
     procedure SetSortColumn(const Value: Integer);
     procedure SortedListViewCompare(Sender: TObject; Item1, Item2: TListItem;
       Data: Integer; var Compare: Integer);
     procedure SortedListViewColumnClick(Sender: TObject; Column: TListColumn);
     { Private declarations }
   protected
     { Protected declarations }
   public
     constructor Create(AOwner: TComponent); override;
     { Public declarations }
   published
     { Published declarations }
     property SortColumn: Integer read FSortColumn write SetSortColumn;
   end;

 implementation

 {==============================================================================}
 { TSortedListView }
 {==============================================================================}
 constructor TSortedListView.Create(AOwner: TComponent);
 begin
   inherited;

   OnColumnClick := SortedListViewColumnClick;
   OnCompare := SortedListViewCompare;
 end;
 {==============================================================================}

 procedure TSortedListView.SetSortColumn(const Value: Integer);
 begin
   FSortColumn := Value;
   AlphaSort;
 end;
 {==============================================================================}

 procedure TSortedListView.SortedListViewColumnClick(Sender: TObject;
   Column: TListColumn);
 begin
   SortColumn := Column.Index;
 end;
 {==============================================================================}

 procedure TSortedListView.SortedListViewCompare(Sender: TObject;
   Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
 begin
   if SortColumn = 0 then
     Compare := CompareText(Item1.Caption, Item2.Caption)
   else
     Compare := CompareText(Item1.SubItems[SortColumn - 1], Item2.SubItems[SortColumn - 1]);
 end;

 end.

Обзор кода:

Общая информация Код определяет пользовательский компонент TListView, называемый TSortedListView. Этот компонент автоматически сортирует свои элементы, когда пользователь кликает на заголовок столбца.

Анализ кода 1. Класс TSortedListView наследуется от TListView и переопределяет несколько методов: * Create: Инициализирует компонент и устанавливает обработчики событий для кликов по столбцам и сравнений. * SetSortColumn: Устанавливает индекс сортируемого столбца и запускает алфавитное сортировку. * SortedListViewColumnClick: Обновляет индекс сортируемого столбца, когда кликается по столбцу. * SortedListViewCompare: Сравнивает два элемента списка в соответствии с текущим индексом сортируемого столбца. 2. Переменная FSortColumn хранит текущий индекс сортируемого столбца. 3. В конструкторе Create, устанавливаются обработчики событий для: + OnColumnClick: Вызывает SortedListViewColumnClick, когда кликается по столбцу. + OnCompare: Вызывает SortedListViewCompare для сортировки элементов. 4. Процедура SetSortColumn обновляет переменную FSortColumn и запускает алфавитное сортировку с помощью AlphaSort. 5. В SortedListViewColumnClick, свойство SortColumn обновляется индексом кликнутого столбца.

Альтернативное решение Хотя предоставленный код работает, есть более элегантный способ реализации сортировки без переопределения метода Compare: 1. Вместо переопределения метода Compare, можно использовать метод TListView.SortItems и предоставить пользовательскую функцию сравнения. 2. В пользовательской функции сравнения можно сравнивать элементы списка в соответствии с текущим индексом сортируемого столбца.

Пример модификации кода для использования SortItems:

procedure TSortedListView.SortedListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
  SortColumn := Column.Index;
  SortedItems(nil, nil); // Запускает сортировку с текущим индексом сортируемого столбца
end;

procedure TSortedListView.SortItems(Source, Dest: TListItem; Data: Integer; var Compare: Integer);
begin
  if SortColumn = 0 then
    Compare := CompareText(Source.Caption, Dest.Caption)
  else
    Compare := CompareText(Source.SubItems[SortColumn - 1], Dest.SubItems[SortColumn - 1]);
end;

В этом модифицированном коде процедура SortedListViewColumnClick обновляет свойство SortColumn и запускает сортировку с помощью SortedItems. Метод SortItems предоставляет пользовательскую функцию сравнения, которая вызывается для каждого пары элементов списка.

В статье описывается создание компонента TListView, который автоматически сортирует элементы списка при щелчке на заголовке колонки.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сортировка ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-12 15:56:26/0.0039839744567871/0