2014-03-06 6 views
1

У меня есть TStringList я создаю на FormCreateПочему мой TStringList получает отсортирован

ScriptList := TStringList.Create; 

В другой функции в моей программе после того, как я загрузил строки в список У меня есть следующий код

ScriptList.Sorted := True; 
    ScriptList.Sort; 
    for i := 0 to ScriptList.Count - 1 do 
    ShowMessage(ScriptList[i]); 

Но список не отсортирован Почему?

Отредактировано: Заполнение списка осуществляется с помощью следующего кода

function TfrmMain.ScriptsLocate(const aComputer: boolean = False): integer; 
var 
    ScriptPath: string; 
    TempList: TStringList; 
begin 
    TempList := TStringList.Create; 
    try 
    if aComputer = True then 
     begin 
     ScriptPath := Folders.DirScripts; 
     Files.Search(TempList, ScriptPath, '*.logon', False); 
     ScriptList.AddStrings(TempList); 
     end 
    else 
     begin 
     if ServerCheck then 
      begin 
      ScriptPath := ServerPath + 'scripts_' + Network.ComputerName + '\'; 
      Folders.Validate(ScriptPath); 
      TempList.Clear; 
      Files.Search(TempList, ScriptPath, '*.logon', False); 
      ScriptList.AddStrings(TempList); 
      Application.ProcessMessages; 

      ScriptPath := ServerPath + 'scripts_' + 'SHARED\'; 
      Folders.Validate(ScriptPath); 
      TempList.Clear; 
      Files.Search(TempList, ScriptPath, '*.logon', False); 
      ScriptList.AddStrings(TempList); 
      end; 
     end; 
    finally 
    TempList.Free; 
    end; 
    ScriptList.Sort; 
    Result := ScriptList.Count; 
end; 

FileSearch функция:

function TFiles.Search(aList: TstringList; aPathname: string; const aFile: string = '*.*'; const aSubdirs: boolean = True): integer; 
var 
    Rec: TSearchRec; 
begin 
    Folders.Validate(aPathName, False); 
    if FindFirst(aPathname + aFile, faAnyFile - faDirectory, Rec) = 0 then 
    try 
     repeat 
     aList.Add(aPathname + Rec.Name); 
     until FindNext(Rec) <> 0; 
    finally 
     FindClose(Rec); 
    end; 
    Result := aList.Count; 
    if not aSubdirs then Exit; 
    if FindFirst(aPathname + '*.*', faDirectory, Rec) = 0 then 
    try 
     repeat 
     if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') then 
      Files.Search(aList, aPathname + Rec.Name, aFile, True); 
     until FindNext(Rec) <> 0; 
    finally 
     FindClose(Rec); 
    end; 
    Result := aList.Count; 
end; 

Основная проблема заключается в том, что список заполняется в порядке с деталями, которые я хочу, но он никогда не сортируется.

ответ

8

Когда вы установили Sorted в True, вы говорите, что хотите, чтобы список поддерживался в порядке. Когда новые элементы будут добавлены, они будут вставлены в порядке. Когда Sorted - True, метод Sort ничего не делает, потому что код построен на предположении, что список уже является порядком.

Таким образом, в вашем кодовом вызове Sort ничего не делает и его можно удалить. Тем не менее, я хотел бы взять на себя альтернативный подход, удалить настройку Sorted и вызвать Sort явно:

ScriptList.LoadFromFile(...); 
ScriptList.Sort; 
for i := 0 to ScriptList.Count - 1 do 
    ... 

Теперь, на самом деле я думаю, что ваш код не совсем, как вы утверждали. Вы утверждаете, что загрузили файл, а затем установили Sorted в True. Это не может быть так. Вот SetSorted реализация:

procedure TStringList.SetSorted(Value: Boolean); 
begin 
    if FSorted <> Value then 
    begin 
    if Value then Sort; 
    FSorted := Value; 
    end; 
end; 

Так что, если Sorted является False, когда вы установите его в True, список будет отсортирован.


Но даже это не объясняет, что вы сообщаете. Потому что если Sorted: True, когда вы звоните LoadFromFile, каждая новая строка будет вставлена ​​в очередь. Итак, то, что вы сообщаете в вопросе, не может быть всей историей.


Если вы не делаете последующие дополнения к списку, она чище, на мой взгляд, игнорировать Sorted свойство. Оставьте значение Sorted в качестве значения по умолчанию False. И позвоните по телефону Sort, если вы хотите принудительно выполнить заказ в списке. Тем не менее, возможно, стоит немного углубиться, чтобы понять, почему ваши утверждения в вопросе не совпадают с реализацией TStringList.

+0

Я вижу, что мой вопрос может привести к предположению, что я загружаю элементы из файла - это не так. Я делаю поиск двух каталогов для файлов определенного типа и их добавления в список. После этого я хочу, чтобы список сортировался. – OZ8HP

+0

Все равно код в вопросе приведет к сортировке списка.Поэтому я думаю, вы должны сделать короткий SSCCE, чтобы показать, что вы имеете в виду. –

+0

Я не уверен на 100%, что такое SSCCE :-) Я отредактировал вопрос, чтобы добавить еще код. – OZ8HP

Смежные вопросы