-2

我正在使用 TMemIniFile 来存储配置,我需要按 alpha 顺序对这些部分进行排序。

为此,我创建了 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的私有成员)

我创建了一个 Helper 类来通过属性公开该成员。但是 Delphi 10.1 不再支持这种行为

我开始将 TMemIniFile 复制/粘贴到我的单元,经过无尽的过程,我最终制作了整个 System.IniFile 的副本,只是为了访问 FSections。

我的问题是如何访问该 FSections 成员,而无需复制该单元中的所有内容以获得可见性

或者是否有另一种方法可以在保存之前对部分进行排序?(我只是从 FSections 调用 TStringList.Sort)

4

1 回答 1

5

与其依赖类型转换和“破解”私有成员,不如使用继承的方法将部分放入您自己的部分TStringListReadSections()根据需要对该列表进行排序,然后使用继承的 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;
于 2016-09-15T05:32:23.317 回答