1

我有一个在 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;

文件搜索功能:

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;

主要问题是列表中填满了我想要的项目,但它永远不会被排序。

4

1 回答 1

8

当您设置为时SortedTrue您表示您希望列表保持有序。添加新项目时,它们将按顺序插入。当Sortedis时True,该Sort方法什么也不做,因为代码是建立在列表已经有序的假设之上的。

所以,在你的代码调用Sort中什么都不做,可以被删除。但是,我会采取替代方法,删除设置SortedSort显式调用:

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

现在,实际上我认为您的代码并不像您声称的那样。您声称您加载了文件,然后设置SortedTrue. 不能这样。这是SetSorted实现:

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

因此,如果SortedFalse当您将其设置为 时True,列表将被排序。


但即使这样也不能解释你报告的内容。因为 ifSortedTrue当您调用 时LoadFromFile,每个新行都会按顺序插入。因此,您在问题中报告的内容不可能是全部。


除非您在列表中进行后续添加,否则在我看来,忽略该Sorted属性会更干净。保留Sorted其默认值False。并Sort在您想对列表强制执行排序时调用。尽管如此,可能值得深入挖掘以了解为什么您在问题中的断言与TStringList.

于 2014-03-06T09:32:47.727 回答