Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2016, 19:14   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Сортировка в TStringList

Есть список файлов, который имеет правильную сортировку (По Имя и По возрастанию). Загружаю их в TStringList, где сортировка не радует. Как исправить положение?
Код:
Sort;
Sorted := True
Не помогают
PHP код:
1.txt
10.txt
100.txt
11.txt
12.txt
2.txt
20.txt
200.txt
3.txt
4.txt 
Изображения
Тип файла: png Безымянный.png (15.4 Кб, 286 просмотров)
Shouldercannon вне форума Ответить с цитированием
Старый 27.10.2016, 19:31   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

так какая сортировка нужна?
вы можете написать свой метод сортировки
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.10.2016, 20:01   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чем не нравится? Строкова, естественно '2' больше '10'. Делай пользовательскую и своим методом сортируй как хочется. См. CustomSort
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.10.2016, 20:23   #4
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
так какая сортировка нужна?
вы можете написать свой метод сортировки
По Имя и По возрастанию как на скрине
Shouldercannon вне форума Ответить с цитированием
Старый 27.10.2016, 20:31   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как на скрине нужно символьное имя без расширения в числовое преобразовывать, если удастся конечно, и сортировать по числовому. Либо слева пробелы добавлять до определенной длины и с учетом этого делать. По любому только используя метод CustomSort. Так, например
Код:
function MySort1(List: TStringList; Index1, Index2: Integer): Integer;
var s1,s2: String;
begin
  s1:=StringOfChar(' ',10)+List.Strings[Index1];
  s2:=StringOfChar(' ',10)+List.Strings[Index2];
  Result:=CompareStr(Copy(s1,Length(s1)-11,12),Copy(s2,Length(s2)-11,12));
end;
...
  xList.CustomSort(MySort1);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 27.10.2016 в 20:54.
Аватар вне форума Ответить с цитированием
Старый 28.10.2016, 05:04   #6
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Сортировка списка по аналогу "Проводника Windows"
http://alexander-bagel.blogspot.is/2013/06/windows.html

Заменить
Код:
function CompareStringOrdinal(const S1, S2: string): Integer;
на
Код:
function CompareStringOrdinal(List: TStringList; Index1, Index2: Integer): Integer;
Добавить
Код:
var
  //...
  S1, S2: string; // <--
begin
  S1 := List.Strings[Index1]; // <--
  S2 := List.Strings[Index2]; // <--
  
  // Проверка на пустые строки
  //...
Filka вне форума Ответить с цитированием
Старый 28.10.2016, 08:17   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
Сортировка списка по аналогу "Проводника Windows"
Вот в самый раз
Код:
function StrCmpLogicalW(psz1, psz2: PWideChar): Integer; stdcall; external 'shlwapi.dll';

function StringListCompareLogical(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := StrCmpLogicalW(PWideChar(WideString(List[Index1])), PWideChar(WideString(List[Index2])));
end;

Последний раз редактировалось Shouldercannon; 28.10.2016 в 09:22.
Shouldercannon вне форума Ответить с цитированием
Старый 28.10.2016, 10:34   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,542
По умолчанию

А если сделать так?
Код:
function MySort1(List: TStringList; Index1, Index2: Integer): Integer;
var v1,v2,c: integer;
begin
  val(List.Strings[Index1],v1,c);
  val(List.Strings[Index2],v2,c);
  Result:=v1-v2;
end;
Arigato вне форума Ответить с цитированием
Старый 28.10.2016, 13:20   #9
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
А если сделать так?
Код:
function MySort1(List: TStringList; Index1, Index2: Integer): Integer;
var v1,v2,c: integer;
begin
  val(List.Strings[Index1],v1,c);
  val(List.Strings[Index2],v2,c);
  Result:=v1-v2;
end;
Первыми пошли буквы потом цифры.
Shouldercannon вне форума Ответить с цитированием
Старый 29.10.2016, 10:40   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,542
По умолчанию

У вас в условии не сказано, что в именах файлов могут быть буквы. Показан пример только с цифрами.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
tstringlist sven4ik Общие вопросы Delphi 3 04.06.2013 14:01
Быстрая сортировка(сортировка Хоара). Сортировка фрагмента массива [C++] druger Помощь студентам 0 20.04.2012 15:49
TStringList adr Общие вопросы Delphi 0 05.11.2010 18:29
Сортировка в tStringList Altera Общие вопросы Delphi 16 05.03.2008 09:48
TStringList nimf Общие вопросы Delphi 5 15.11.2007 14:44