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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2014, 15:48   #1
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию сортировка в stringlist

Необходимо отсортировать по возрастанию имена файлов полученных из папки, ts.Sorted := True; не помог

Код:
var
  sr: TSearchRec;
  ts: TStringList;
begin
  mmo1.Clear;
  ts := TStringList.Create;
  ts.Sorted := True;
  if FindFirst('C:\Users\Admin\Desktop\Новая папка (16)\*.png', faAnyFile, sr) = 0
  then
  begin
    repeat
      ts.Add(sr.Name);
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
  mmo1.Lines.Assign(ts);
  ts.Free;
end;
выводит такой результат
1.png
10.png
11.png
12.png
14.png
15.png
16.png
17.png
2.png
3.png
4.png
5.png
6.png
7.png
8.png
9.png
Terikon вне форума Ответить с цитированием
Старый 05.10.2014, 16:05   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

И что, отсортировала по возрастанию символов. Для того чтобы 2.png шло после 1.png, а не 17.png нужно или выровнять слева пробелами имена файлов или использовать метод customsort стриглиста
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.10.2014, 16:13   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Всё правильно отсортировал.
Цитата:
И что, отсортировала по возрастанию символов. Для того чтобы 2.png шло после 1.png, а не 17.png нужно или выровнять слева пробелами имена файлов или использовать метод customsort стриглиста
Согласен.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.10.2014, 16:31   #4
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию

решил использовать customsort
нашёл такую функцию сортировки, скажите как правильно передать ей параметры
вызов делаю здесь

end;
ts.CustomSort(StringListCompareStri ngs);
mmo1.Lines.Assign(ts);
ts.Free;


Код:
function StringListCompareStrings(List: TStringList;
  Index1, Index2: Integer): Integer;
begin
  if List.Strings[Index1] = List.Strings[Index2] then
    Result := 0
  else if List.Strings[Index1] < List.Strings[Index2] then
    Result := 1
  else
    Result := -1;
end;
Terikon вне форума Ответить с цитированием
Старый 05.10.2014, 16:39   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

если оба имени файла - это числа, сравнить эти числа, иначе сравнить имена файлов.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.10.2014, 16:47   #6
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию

Код:
var
  sr: TSearchRec;
  ts: TStringList;
begin
  mmo1.Clear;
  ts := TStringList.Create;
  ts.Sorted := True;
  if FindFirst('C:\Users\Admin\Desktop\Новая папка (16)\*.png', faAnyFile, sr) = 0
  then
  begin
    repeat
      ts.Add(ChangeFileExt(sr.Name,''));  //записываю только имена файлов без расширения, т.е. только цифры
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
  ts.CustomSort(StringListCompareStrings);///как заставить эту функцию работать ?
  mmo1.Lines.Assign(ts);
  ts.Free;
end;

Код:
function StringListCompareStrings(List: TStringList;
  Index1, Index2: Integer): Integer;
begin
  if List.Strings[Index1] = List.Strings[Index2] then
    Result := 0
  else if List.Strings[Index1] < List.Strings[Index2] then
    Result := 1
  else
    Result := -1;
end;
на выходе вот это
1
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
Terikon вне форума Ответить с цитированием
Старый 05.10.2014, 16:50   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
на выходе вот это
что закодил, то и получил.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.10.2014, 17:18   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Строка '17' меньше строки '2'. А вот число 17 больше числа 2. Делай выводы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.10.2014, 17:24   #9
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию

вот рабочий код, может кому пригодится, всем спасибо

Код:
function mySort(List: TStringList; first, second: Integer): Integer;
begin
  result := StrToInt(List.Strings[first]) - StrToInt(List.Strings[second]);
end;;


procedure TForm18.btn8Click(Sender: TObject);
var
  sr: TSearchRec;
  ts: TStringList;
begin
  mmo1.Clear;
  ts := TStringList.Create;
  if FindFirst('C:\Users\Admin\Desktop\Новая папка (16)\*.png', faAnyFile, sr) = 0
  then
  begin
    repeat
      ts.Add(ChangeFileExt(sr.Name, ''));
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
  ts.CustomSort(mySort);
  mmo1.Lines.Assign(ts);
  ts.Free;
end;

Последний раз редактировалось Terikon; 05.10.2014 в 17:52.
Terikon вне форума Ответить с цитированием
Старый 05.10.2014, 17:37   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
вот рабочий код, может кому пригодится, всем спасибо
Attention!!! говнокод detected!
Warning!!! DON'T COPYPASTE THIS!!!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
StringList nefakt Общие вопросы Delphi 14 05.02.2014 19:55
Сортировка в StringList chui Общие вопросы Delphi 8 04.04.2013 20:28
Поиск и удаление строк в StringList из другово stringlist SmoK777 Общие вопросы Delphi 3 06.08.2012 08:21
Stringlist record222 Общие вопросы Delphi 1 26.06.2012 17:35
stringlist grater83 Общие вопросы Delphi 2 21.09.2009 14:26