Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Sort в TStringList


Автор: demm 19.7.2007, 10:52
TStringList содержит:
1-.xlsn
1-.xlso
1.xlsn
1.xlso

после сортировки списка на выходе получается
1.xlsn
1-.xlsn
1.xlso
1-.xlso

а ведь должно быть:
1.xlsn
1.xlso
1-.xlsn
1-.xlso

Почему так получается и как это можно исправить?

Автор: volvo877 19.7.2007, 11:59
Цитата(demm @  19.7.2007,  10:52 Найти цитируемый пост)
Почему так получается и как это можно исправить?

Получается так потому, что строки в методе Sort сравниваются через AnsiCompareStr... А исправить - использованием вместо стандартного Sort-а метода CustomSort со своей функцией сравнения:

Код

function SortProc(List: TStringList; Index1, Index2: Integer): Integer;
begin
     with List do
     if integer(Objects[Index1])=integer(Objects[Index2])
        then result:=0
      else
      if integer(Objects[Index1])<integer(Objects[Index2])
         then result:=-1
       else
       if integer(Objects[Index1])>integer(Objects[Index2])
          then result:=1;
end;

...
  SL.CustomSort(SortProc);
...

Автор: demm 19.7.2007, 18:42
Спасибо за ответ, но нашел где-то другое решение:

Код

var
  OldProcA:Pointer;
  OldProcW:Pointer;
...
procedure GlobalSetStringSort;
  procedure _CompareStringA; register;
  asm
    or [esp+8],SORT_STRINGSORT;
    jmp OldProcA
  end;
  procedure _CompareStringW; register;
  asm
    or [esp+8],SORT_STRINGSORT;
    jmp OldProcW
  end;
  function ReplaceProc(OldProc, NewProc:Pointer):Pointer;
  var
    Addr:^PPointer;
  begin
    Addr:=@PChar(OldProc)[2];
    Result:=Addr^^;
    Addr^^:=NewProc;
  end;
begin
  OldProcW:=ReplaceProc(@CompareStringW,@_CompareStringW);
  OldProcA:=ReplaceProc(@CompareString,@_CompareStringA);
  ReplaceProc(@CompareStringA,@_CompareStringA);
end;
...
...
Procedure MainProc;
GlobalSetStringSort;
...
St.Sort;
...



P.S: т.е. ко всей программе включаем нормальную сортировку используя SORT_STRINGSORT.

Автор: Matematik 31.1.2008, 01:20
demm, спасибо
Несколько дней не мог понять почему неправильно сортирует StringList

Я так понимаю CodeGear (Borland) не считает это ошибкой, типа так и должно быть.
http://qc.codegear.com/wc/qcmain.aspx?d=5705
Жесть!

Автор: fgroup 13.3.2008, 11:51
Попробовал это решение для ситуации описанной в ссылке 
http://qc.codegear.com/wc/qcmain.aspx?d=5705

оно ее не решает :(
Почему?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)