В таком варианте будет читать сколько угодно секций и с любыми названиями, а так же с любыми именами полей в секциях:
#NoEnv
#SingleInstance, Force
OnExit, BeforeExit
INI := "Config.ini"
if (!FileExist(INI)) {
GoSub, DefaultINI
FileAppend,% iniContent,% INI,UTF-16
}
oINI := {}
ini_is_changed := false
field_width := 300
drop_down_list := ""
iniContent := DumpINI(INI)
For i, block in MatchAll(iniContent, "\[[\p{L}\d]+\]") {
block_name := RegExReplace(block, "s)\[([\p{L}\d]+)\].*", "$1")
drop_down_list .= block_name . (i != 1 ? "|" : "||")
first_name := !first_name ? block_name : first_name
oINI[ block_name ] := {}
For index, line in MatchOnly(block, "([\p{L}\d]+=.*)") {
RegExMatch(line, "([\p{L}\d]+)=(.*)", m)
oINI[ block_name ][ m1 ] := m2
}
}
Gui, 1: Add, DropDownList, w%field_width% v_ddl_selected gDDL_Selected,% drop_down_list
For i, data in oINI[ first_name ]
Gui, 1: Add, Edit,% Format("v_edit{} w{}", A_Index, field_width),% data
Gui, 1: Add, Button, w%field_width% gSaveMe, Save me
Gui, 1: Show
Return
MatchAll(str, reg_ex) {
arr := [], p1 := p2 := 1, match := ""
While (p2 := RegExMatch(str, reg_ex, match, p2 + StrLen(match))) {
(A_Index > 1 && arr.Push( SubStr(str, p1, p2 - p1) ))
p1 := p2
} arr.Push( SubStr(str, p1, StrLen(str)) )
return arr
}
MatchOnly(str, reg_ex) {
p := 1, m := "", s := []
While p := RegexMatch(str, reg_ex, m, p + StrLen(m))
s.Push( m1 )
return s
}
DumpINI(INI_path, data := "") {
if (!data) {
oFile := FileOpen(INI_path, "r", "utf-8")
iniContent := oFile.Read()
oFile.Close()
return iniContent
}
oFile := FileOpen(INI_path, "w", "utf-16")
oFile.Write(DataToINI(data))
oFile.Close()
}
DataToINI(data) {
str := ""
For block_name, block_data in data {
str .= Format("[{}]`r`n", block_name)
For line_name, line_data in block_data
str .= Format("{}={}`r`n", line_name, line_data)
} return str
}
DDL_Selected:
Gui, 1: Submit, NoHide
For k, data in oINI[ _ddl_selected ]
GuiControl, Text, _edit%A_Index%,% data
Return
SaveMe:
Gui, 1: Submit, NoHide
For k in oINI[ _ddl_selected ]
oINI[ _ddl_selected ][ k ] := _edit%A_Index%
ini_is_changed := true
Return
DefaultINI:
iniContent =
(
[name1]
podname1=Норма1
podname2=Гол1
podname3=привет1
podname4=как дела1
[name2]
podname1=Норма2
podname2=Гол2
podname3=привет2
podname4=как дела2
[name3]
podname1=Норма3
podname2=Гол3
podname3=привет3
podname4=как дела3
[name4]
podname1=Норма4
podname2=Гол4
podname3=привет4
podname4=как дела4
)
Return
BeforeExit:
if (ini_is_changed)
DumpINI(INI, oINI)
if (A_ExitReason) {
ExitApp
}
return
GuiClose:
ExitApp
Но я сильно сомневаюсь, что для хранения тут нужен "*.ini", раз стандартные способы обращения к нему тут вообще не используются. Гораздо проще было бы хранить данные в формате JSON и обращаться к нему используя удобства, например, вот этого класса.
На старте сценария, данные из INI читаются как строка и преобразуются из формата данных INI в "объект", а при сохранении, обратно в формат данных INI и затем записываются в файл. JSON — изначально хранит данные в формате "объекта", так, что их преобразование подразумевает лишь интерпретацию для AHK. Да, за этим преобразованием тоже стоит парсер, но он уже описан и Вам не нужно сочинять новый велосипед. Просто берёте и пользуетесь.
Стильно, модно, современно. Поэкспериментируйте.