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

Сортировать TListView, используя нужный метод

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

Сортировать TListView, используя нужный метод

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

{ 
  This example shows how to use the TListView's CustomSort method to 
  sort the items in the list using a ordering function. 
  This allows you to sort custom data in the correct order you want. 

  When the user clicks on a column header, the ListView will be sorted 
  by that column. 
  If the user clicks on the same column again, the sort order will be toggled. 

  (***) 

  Dieses Beispiel zeigt die Verwendung der CustomSort Methode einer TListView. 
  Damit kann man z.B Zahlen korrekt (d.h nach ihrer Grosse) sortieren lassen. 
  Wenn der Anwender auf den Kopf einer Spalte klickt, wird die ensprechende 
  Spalte sortiert. Bei nochmaligem Klicken auf dieselbe Spalte wird die 
  Sortierreihenfolge umgekehrt. 

}

 { custom sort styles }

 type
   TCustomSortStyle = (cssAlphaNum, cssNumeric, cssDateTime);

 var
   { variable to hold the sort style }
   LvSortStyle: TCustomSortStyle;
   { array to hold the sort order }
   LvSortOrder: array[0..4] of Boolean; // High[LvSortOrder] = Number of Lv Columns 

implementation

 {$R *.DFM}

 function CustomSortProc(Item1, Item2: TListItem; SortColumn: Integer): Integer; stdcall;
 var
   s1, s2: string;
   i1, i2: Integer;
   r1, r2: Boolean;
   d1, d2: TDateTime;

   { Helper functions }

   function IsValidNumber(AString : string; var AInteger : Integer): Boolean;
   var
     Code: Integer;
   begin
     Val(AString, AInteger, Code);
     Result := (Code = 0);
   end;

   function IsValidDate(AString : string; var ADateTime : TDateTime): Boolean;
   begin
     Result := True;
     try
       ADateTime := StrToDateTime(AString);
     except
       ADateTime := 0;
       Result := False;
     end;
   end;

   function CompareDates(dt1, dt2: TDateTime): Integer;
   begin
     if (dt1 > dt2) then Result := 1
     else
       if (dt1 = dt2) then Result := 0
     else
       Result := -1;
   end;

   function CompareNumeric(AInt1, AInt2: Integer): Integer;
   begin
     if AInt1 > AInt2 then Result := 1
     else
       if AInt1 = AInt2 then Result := 0
     else
       Result := -1;
   end;

 begin
   Result := 0;

   if (Item1 = nil) or (Item2 = nil) then Exit;

   case SortColumn of
     -1 :
     { Compare Captions }
     begin
       s1 := Item1.Caption;
       s2 := Item2.Caption;
     end;
     else
     { Compare Subitems }
     begin
       s1 := '';
       s2 := '';
       { Check Range }
       if (SortColumn < Item1.SubItems.Count) then
         s1 := Item1.SubItems[SortColumn];
       if (SortColumn < Item2.SubItems.Count) then
         s2 := Item2.SubItems[SortColumn]
     end;
   end;

   { Sort styles }

   case LvSortStyle of
     cssAlphaNum : Result := lstrcmp(PChar(s1), PChar(s2));
     cssNumeric  : begin
                     r1 := IsValidNumber(s1, i1);
                     r2 := IsValidNumber(s2, i2);
                     Result := ord(r1 or r2);
                     if Result <> 0 then
                       Result := CompareNumeric(i2, i1);
                   end;
     cssDateTime : begin
                     r1 := IsValidDate(s1, d1);
                     r2 := IsValidDate(s2, d2);
                     Result := ord(r1 or r2);
                     if Result <> 0 then
                       Result := CompareDates(d1, d2);
                   end;
   end;

   { Sort direction }

   if LvSortOrder[SortColumn + 1] then
     Result := - Result;
 end;


 { The ListView's OnColumnClick event }

 procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
 begin
   { determine the sort style }
   if Column.Index = 0 then
     LvSortStyle := cssAlphaNum
   else
     LvSortStyle := cssNumeric;

   { Call the CustomSort method }
   ListView1.CustomSort(@CustomSortProc, Column.Index -1);

   { Set the sort order for the column}
   LvSortOrder[Column.Index] := not LvSortOrder[Column.Index];
 end;

Это код-набор на языке Delphi, демонстрирующий использование метода CustomSort компонента TListView для сортировки элементов в списке с помощью пользовательской функции сортировки.

Стили сортировки Код определяет перечисление TCustomSortStyle с тремя значениями: cssAlphaNum, cssNumeric и cssDateTime. Эти стили определяют, как элементы должны быть отсортированы в зависимости от их текстовых или числовых значений.

Функция сортировки Функция CustomSortProc - это пользовательская функция сортировки, которая принимает два объекта TListItem (Item1 и Item2) и целое число (SortColumn) в качестве входных параметров. Она возвращает целое значение, указывающее порядок сортировки элементов.

Внутри этой функции: * Проверяется, является ли любая из этих строк null * Извлекаются текстовые или числовые значения из элементов в зависимости от выбранной колонки * Сравниваются эти значения с помощью switch-оператора, который зависит от стиля сортировки LvSortStyle * Возвращает результат сравнения

Логика сортировки Код определяет три вспомогательные функции: IsValidNumber, IsValidDate и CompareDates. Эти функции используются для валидации и сравнения текстовых или числовых значений.

Событие OnColumnClick ListView Когда заголовок колонки кликается, срабатывает обработчик события TForm1.ListView1ColumnClick. Этот обработчик: * Определяет стиль сортировки в зависимости от выбранной колонки * Вызывает метод CustomSort с пользовательской функцией сортировки и индексом выбранной колонки * Устанавливает порядок сортировки для колонки (то есть переключает его)

Улучшения Чтобы сделать этот код более устойчивым, вы могли бы добавить обработку ошибок для случаев, когда входные данные являются недопустимыми. Кроме того, вам может потребоваться использование более эффективного алгоритма сортировки при работе с большими данными.

В целом, это хороший пример реализации пользовательской сортировки в TListView с помощью Delphi.

Сортировать 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 16:28:26/0.003939151763916/0