Увеличение номера раздела INI-файла
У меня есть INI-файл, в котором хранятся некоторые целые числа для настроек. Имена разделов хранятся следующим образом:
[ColorScheme_2]
name=Dark Purple Gradient
BackgroundColor=224
BackgroundBottom=2
BackgroundTop=25
...
[ColorScheme_3]
name=Retro
BackgroundColor=5
BackgroundBottom=21
BackgroundTop=8
...
Мне нужно придумать способ создания новых секций, которые увеличивают номер цветовой схемы +1 от самого высокого номера секции. У меня есть comboBox, который перечисляет текущие имена colorscheme, поэтому, когда пользователь сохраняет в INI-файл, существующая схема просто перезаписывается. Как я могу проверить текст ComboBox, чтобы увидеть, является ли он существующим разделом, и если нет, создать новый с помощью увеличенное имя? (например, из приведенного выше кода ColorScheme_2
и ColorScheme_3
уже существуют, поэтому следующий раздел для создания будет ColorScheme_4
).
2 ответа:
Вы можете прочитать все разделы с помощью
ReadSections
метод, затем повторите возвращенный список строк и проанализируйте каждый элемент в нем, чтобы сохранить наибольшее найденное значение индекса:uses IniFiles; function GetMaxSectionIndex(const AFileName: string): Integer; var S: string; I: Integer; Index: Integer; IniFile: TIniFile; Sections: TStringList; const ColorScheme = 'ColorScheme_'; begin Result := 0; IniFile := TIniFile.Create(AFileName); try Sections := TStringList.Create; try IniFile.ReadSections(Sections); for I := 0 to Sections.Count - 1 do begin S := Sections[I]; if Pos(ColorScheme, S) = 1 then begin Delete(S, 1, Length(ColorScheme)); if TryStrToInt(S, Index) then if Index > Result then Result := Index; end; end; finally Sections.Free; end; finally IniFile.Free; end; end;
И использование:
procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(IntToStr(GetMaxSectionIndex('d:\Config.ini'))); end;
Как я могу проверить текст ComboBox, чтобы увидеть, является ли он существующим разделом, и если нет, создать новый с увеличенным именем?
Вот так:
const cPrefix = 'ColorScheme_'; var Ini: TIniFile; Sections: TStringList; SectionName: String; I, Number, MaxNumber: Integer; begin Ini := TIniFile.Create('myfile.ini') try SectionName := ComboBox1.Text; Sections := TStringList.Create; try Ini.ReadSections(Sections); Sections.CaseSensitive := False; if Sections.IndexOf(SectionName) = -1 then begin MaxNumber := 0; for I := 0 to Sections.Count-1 do begin if StartsText(cPrefix, Sections[I]) then begin if TryStrToInt(Copy(Sections[I], Length(cPrefix)+1, MaxInt), Number) then begin if Number > MaxNumber then MaxNumber := Number; end; end; end; SectionName := Format('%s%d', [cPrefix, MaxNumber+1]); end; finally Sections.Free; end; // use SectionName as needed... finally Ini.Free; end; end;