如何对 TMemIniFile 上的部分进行排序
How to Sort Sections on TMemIniFile
我正在使用 TMemIniFile 来存储配置,我需要按字母顺序对部分进行排序。
为此,我创建了 TMemIniFile
的后代
TRWStudioMemIniFile = class(TMemIniFile)
public
procedure UpdateFile; override;
procedure GetSortedStrings(List: TStrings);
end;
{ TRWStudioMemIniFile }
procedure TRWStudioMemIniFile.GetSortedStrings(List: TStrings);
var
I, J: Integer;
Strings: TStrings;
begin
List.BeginUpdate;
try
Sections.Sort;
for I := 0 to Sections.Count - 1 do
begin
List.Add('[' + Sections[I] + ']');
Strings := TStrings(Sections.Objects[I]);
for J := 0 to Strings.Count - 1 do List.Add(Strings[J]);
List.Add('');
end;
finally
List.EndUpdate;
end;
end;
procedure TRWStudioMemIniFile.UpdateFile;
var
List: TStringList;
begin
List := TStringList.Create;
try
GetSortedStrings(List);
List.SaveToFile(FileName, Encoding);
finally
List.Free;
end;
end;
但它需要访问 Sections(实际上是 FSections:TStringList,它是 TMemIniFile 的私有成员)
我创建了一个助手 class 来通过 属性 公开该成员。但是 Delphi 10.1
不再支持此行为
我开始 copy/paste TMemIniFile 到我的单元,经过无休止的过程,我最终制作了整个 System.IniFile 的副本,只是为了访问 FSections。
我的问题是如何访问该 FSections 成员而无需复制该单元的所有内容以获得可见性
或者有没有其他方法可以在保存前对部分进行排序? (我只是从 FSections 调用 TStringList.Sort)
而不是依赖类型转换和 "cracking open" 私有成员,您可以使用继承的 ReadSections()
方法将这些部分放入您自己的 TStringList
中,将该列表排序为需要,然后使用继承的 ReadSectionValues()
方法读取每个部分的字符串:
var
sections: TStringList;
values: TStringList;
begin
sections := TStringList.Create;
try
ReadSections(sections);
sections.Sort;
values := TStringList.Create;
try
List.BeginUpdate;
try
for I := 0 to sections.Count - 1 do
begin
List.Add('[' + sections[I] + ']');
values.Clear; // Just in case
ReadSectionValues(sections[i], values);
for J := 0 to values.Count - 1 do
List.Add(values[J]);
List.Add('');
end;
finally
List.EndUpdate;
end;
finally
values.Free;
end;
finally
sections.Free;
end;
end;
我正在使用 TMemIniFile 来存储配置,我需要按字母顺序对部分进行排序。
为此,我创建了 TMemIniFile
的后代 TRWStudioMemIniFile = class(TMemIniFile)
public
procedure UpdateFile; override;
procedure GetSortedStrings(List: TStrings);
end;
{ TRWStudioMemIniFile }
procedure TRWStudioMemIniFile.GetSortedStrings(List: TStrings);
var
I, J: Integer;
Strings: TStrings;
begin
List.BeginUpdate;
try
Sections.Sort;
for I := 0 to Sections.Count - 1 do
begin
List.Add('[' + Sections[I] + ']');
Strings := TStrings(Sections.Objects[I]);
for J := 0 to Strings.Count - 1 do List.Add(Strings[J]);
List.Add('');
end;
finally
List.EndUpdate;
end;
end;
procedure TRWStudioMemIniFile.UpdateFile;
var
List: TStringList;
begin
List := TStringList.Create;
try
GetSortedStrings(List);
List.SaveToFile(FileName, Encoding);
finally
List.Free;
end;
end;
但它需要访问 Sections(实际上是 FSections:TStringList,它是 TMemIniFile 的私有成员)
我创建了一个助手 class 来通过 属性 公开该成员。但是 Delphi 10.1
不再支持此行为我开始 copy/paste TMemIniFile 到我的单元,经过无休止的过程,我最终制作了整个 System.IniFile 的副本,只是为了访问 FSections。
我的问题是如何访问该 FSections 成员而无需复制该单元的所有内容以获得可见性
或者有没有其他方法可以在保存前对部分进行排序? (我只是从 FSections 调用 TStringList.Sort)
而不是依赖类型转换和 "cracking open" 私有成员,您可以使用继承的 ReadSections()
方法将这些部分放入您自己的 TStringList
中,将该列表排序为需要,然后使用继承的 ReadSectionValues()
方法读取每个部分的字符串:
var
sections: TStringList;
values: TStringList;
begin
sections := TStringList.Create;
try
ReadSections(sections);
sections.Sort;
values := TStringList.Create;
try
List.BeginUpdate;
try
for I := 0 to sections.Count - 1 do
begin
List.Add('[' + sections[I] + ']');
values.Clear; // Just in case
ReadSectionValues(sections[i], values);
for J := 0 to values.Count - 1 do
List.Add(values[J]);
List.Add('');
end;
finally
List.EndUpdate;
end;
finally
values.Free;
end;
finally
sections.Free;
end;
end;