gpt4 book ai didi

delphi - 为什么我的TStringList不排序

转载 作者:行者123 更新时间:2023-12-03 19:00:14 26 4
gpt4 key购买 nike

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


主要的问题是,列表中的内容已填满我想要的项目,但从未对其进行排序。

最佳答案

当将Sorted设置为True时,表示要按顺序维护列表。添加新项目时,将按顺序插入它们。当SortedTrue时,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,则会对列表进行排序。



但是,即使那样也不能解释您的举报。因为如果在调用 SortedTrueLoadFromFile,则将按顺序插入每一行。因此,您在问题中所举报的内容可能并非全部。



在我看来,除非您要对该列表进行后续添加,否则忽略 Sorted属性会更干净。保留 Sorted作为其默认值 False。如果要对列表强制排序,请调用 Sort。尽管如此,可能有必要更深入地了解为什么问题中的断言与 TStringList的实现不一致。

关于delphi - 为什么我的TStringList不排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22220186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com