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

Сортировать TStringList своим методом сортировки

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

Сортировать TStringList своим методом сортировки

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

{ 
  Suppose you have a TListBox containing some date values. 
  If you want to sort the dates by setting the "Sorted" 
  property to "True" you will see that the dates are not sorted correctly: 

  12.03.2003 
  13.03.2003 
  29.01.2003 
  30.03.2003 

  Now what you can do is to is create a TStringlist, Assign the listbox.Items 
  property to it, sort the stringlist using CustomSort, 
  then Assign it back to listbox.items. 
}

 { 
  Angenommen du hast eine TListBox, welche verschiedene Daten enthalt. 
  Wenn man nun die Liste sortiert haben mochte, kann man die Eigenschaft 
  "Sorted" auf "True" stellen. 
  Man wird aber feststellen, dass die Daten nicht korrekt sortiert werden. 

  12.03.2003 
  13.03.2003 
  29.01.2003 
  30.03.2003 

  Wenn man nun eine TStringlist erstellt und ihr die Listbox.Items zuweist, 
  kann man die StringListe mit einer CustomSort Methode sortieren und 
  dann den Listbox.Items wieder die Items der StringListe zuweisen. 
}


 function CompareDates(List: TStringList; Index1, Index2: Integer): Integer;
 var
   d1, d2: TDateTime;
 begin
   d1 := StrToDate(List[Index1]);
   d2 := StrToDate(List[Index2]);
   if d1 < d2 then
     Result := -1
   else if d1 > d2 then Result := 1
   else
     Result := 0;
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 var
   sl: TStringList;
 begin
   sl := TStringList.Create;
   try
     // listbox1.Sorted := False ! 
    sl.Assign(listbox1.Items);
     sl.CustomSort(CompareDates);
     listbox1.Items.Assign(sl);
   finally
     sl.Free
   end;
 end;

 end.


 {********************************************************************}
 { To sort Integer values:}

 function CompareInt(List: TStringList; Index1, Index2: Integer): Integer;
 var
   d1, d2: Integer;
   r1, r2: Boolean;

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

 begin
   r1 :=  IsInt(List[Index1], d1);
   r2 :=  IsInt(List[Index2], d2);
   Result := ord(r1 or r2);
   if Result <> 0 then
   begin
     if d1 < d2 then
       Result := -1
     else if d1 > d2 then
       Result := 1
     else
      Result := 0;
   end else
    Result := lstrcmp(PChar(List[Index1]), PChar(List[Index2]));
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 var
   sl: TStringList;
 begin
   sl := TStringList.Create;
   try
     // listbox1.Sorted := False; 
    sl.Assign(listbox1.Items);
     sl.CustomSort(CompareInt);
     listbox1.Items.Assign(sl);
   finally
     sl.Free;
   end;
 end;

Перевод контента на русский язык:

Код - решение для сортировки TStringList по значениям даты или целочисленным значениям в TListBox-контроле в Delphi.

Описание работы кода:

  1. Функция CompareDates используется для сравнения двух дат в TStringList. Она конвертирует каждый строковый значений списка в TDateTime с помощью StrToDate, а затем сравнивает даты. Если первая дата меньше второй, она возвращает -1; если они равны, то 0; иначе, 1.
  2. Функция CompareInt используется для сравнения двух целочисленных значений в TStringList. Она использует вспомогательную функцию IsInt, чтобы проверить, можно ли каждое строковое значение конвертировать в целочисленное с помощью Val. Если оба значения могут быть конвертированы, она сравнивает их и возвращает -1, если первое меньше второго, 0, если они равны, или 1, если первое больше второго. Если одно из значений не может быть конвертировано, она использует lstrcmp для выполнения чувствительного к регистру сравнения.
  3. В обработчике события Button1Click для каждого процедуры создается TStringList и присваивается элементы TListBox с помощью Assign. Список затем сортируется с помощью CustomSort, а finally, отсортированный список присваивается обратно TListBox с помощью Assign.

Вот улучшенная версия кода:

procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.Assign(ListBox1.Items);
    sl.CustomSort(CompareDates); // или CompareInt для целочисленных значений
    ListBox1.Items.Assign(sl);
  finally
    sl.Free;
  end;
end;

function CompareDates(List: TStringList; Index1, Index2: Integer): Integer;
var
  d1, d2: TDateTime;
begin
  d1 := StrToDate(List[Index1]);
  d2 := StrToDate(List[Index2]);
  if d1 < d2 then
    Result := -1
  else if d1 > d2 then
    Result := 1
  else
    Result := 0;
end;

function CompareInt(List: TStringList; Index1, Index2: Integer): Integer;
var
  d1, d2: Integer;
  r1, r2: Boolean;

  function IsInt(AString: string; var AInteger: Integer): Boolean;
  var
    Code: Integer;
  begin
    Val(AString, AInteger, Code);
    Result := (Code = 0);
  end;
begin
  r1 := IsInt(List[Index1], d1);
  r2 := IsInt(List[Index2], d2);
  Result := Ord(r1 or r2);
  if Result <> 0 then
  begin
    if d1 < d2 then
      Result := -1
    else if d1 > d2 then
      Result := 1
    else
      Result := 0;
  end
  else
    Result := lstrcmp(PChar(List[Index1]), PChar(List[Index2])));
end;

Это улучшенная версия использует раннее связывание и eliminiert повторный код в обработчиках событий. Она также включает комментарии, чтобы объяснить, что каждый часть кода делает.

Сортировка элементов TStringList можно выполнить с помощью метода CustomSort, который позволяет задать функцию сравнения для сортируемых элементов.


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

Получайте свежие новости и обновления по 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:57:04/0.0041589736938477/0