1 (изменено: Garaxe, 2020-04-25 05:25:52)

Тема: AHK: Переменная секции

Как правильно задать переменную секции в 44-47 строке? помогите пожалуйста.

/*
iniContent:=
(
"[Acc1]
Login=1
Password=2
Email=4
PassEmail=8
[Acc2]
Login=3
Password=4
Email=1
PassEmail=5
[Acc3]
Login=44
Password=33
Email=1
PassEmail=23"
)
FileDelete,logpass.ini
FileAppend,% iniContent,logpass.ini
*/
IniRead,sectNames,logpass.ini
for a,b in oSectNames:=StrSplit(sectNames,"`n","`r")
{
    IniRead,Section,logpass.ini,% b
    ddl.=b "|"
}
 
Gui, Show, w479 h379, Untitled GUI
Gui, Add, DropDownList, x142 y49 w170 h50 r10 Choose1 vvSection ggSelectSect, % SubStr(ddl,1,-1)
Gui, Add, Edit, x142 y119 w170 h20 vvEdit , Edit
Gui, Add, Edit, x142 y159 w170 h20 vvEdit1 , Edit
Gui, Add, Edit, x142 y199 w170 h20 vvEdit2, Edit
Gui, Add, Edit, x142 y239 w170 h20 vvEdit3, Edit
Gui, Add, Button, x182 y299 w90 h30 , Button
return
 
GuiClose:
ExitApp
 
gSelectSect:
Gui Submit, NoHide
IniRead, login, logpass.ini,% b , Login
IniRead, pass, logpass.ini,% b, Password
IniRead, email, logpass.ini,% b, Email
IniRead, passemail, logpass.ini,% b, PassEmail
GuiControl,,vEdit, %login%
GuiControl,,vEdit1, %pass%
GuiControl,,vEdit2,%email%
GuiControl,,vEdit3,%passemail%
return

2

Re: AHK: Переменная секции

Как-то всё сложно и не совсем понятно. Название темы говорит об одном, а постановка задачи о другом. Ожидается такое поведение?

#NoEnv
#SingleInstance, Force

INI := "Config.ini"
if (!FileExist(INI)) {
	GoSub, DefaultINI
	FileAppend,% iniContent,% INI,UTF-16
}

oINI           := {}
name_count     := 4
podname_count  := 4
field_width    := 300
drop_down_list := ""

Loop,% name_count {
	name := "name" . A_Index
	drop_down_list .= name . (A_Index != 1 ? "|" : "||")
	oINI[name] := {}
	
	Loop,% podname_count {
		podname := "podname" . A_Index
		IniRead, podname_var,% INI,% name,% podname
		oINI[name][podname] := podname_var
	}
}
Gui, 1: Add, DropDownList, w%field_width% v_ddl_selected gDDL_Selected,% drop_down_list
Loop,% podname_count
	Gui, 1: Add, Edit,% Format("v_edit{} w{}", A_Index, field_width),% oINI[ "name1" ][ "podname" . A_Index ]
Gui, 1: Show
	
Return

DDL_Selected:
	Gui, 1: Submit, NoHide
	Loop,% podname_count
		GuiControl, Text, _edit%A_Index%,% oINI[ _ddl_selected ][ "podname" . A_Index ]
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

GuiClose:
	ExitApp

3

Re: AHK: Переменная секции

KusochekDobra, не совсем, он должен считывать секции из ини файла отоброжать их в Dropdownlist, то есть так что б можно было создавать неограниченное количество секций с разными названиями , он их считывал и на их основе делал  Dropdownlist, и когда уже в интерфейсе выбираешь определенную секцию из  Dropdownlist, он менял значение Edit на параметры выбранной секции, но все равно спасибо )

4

Re: AHK: Переменная секции

KusochekDobra, в том скрипте который я прикрепил, можно сколько угодно дописать в ини файл секций они они все отоброзяться в дроплисте, но при переключении дроплиста , едит берет только параметры последней секции вот в этом что то не так)

5 (изменено: KusochekDobra, 2020-04-25 12:21:16)

Re: AHK: Переменная секции

В таком варианте будет читать сколько угодно секций и с любыми названиями, а так же с любыми именами полей в секциях:

#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. Да, за этим преобразованием тоже стоит парсер, но он уже описан и Вам не нужно сочинять новый велосипед. Просто берёте и пользуетесь.

Стильно, модно, современно. Поэкспериментируйте.

6

Re: AHK: Переменная секции

KusochekDobra, это слишком сложно, я слишком дно в программировании, так чуть чуть могу) А насчет скрипта выше, podname'ы должны быть статичны их должно быть 4 штуки и все не больше, не меньше, а так в принципе работает как надо ) Еще раз спасибо за помощь

7

Re: AHK: Переменная секции


/*
iniContent =
(
[Acc1]
Login=1
Password=2
Email=4
PassEmail=8
[Acc2]
Login=3
Password=4
Email=1
PassEmail=5
[Acc3]
Login=44
Password=33
Email=1
PassEmail=23
[]
)
FileDelete,logpass.ini
FileAppend,% iniContent,logpass.ini
*/

INIFILE := A_ScriptFullPath

IniRead, sectNames, %INIFILE% 
 
Gui, Show, w479 h379, Untitled GUI
Gui, Add, DropDownList, x142 y49 w170 h50 r10 Choose1 vvSection ggSelectSect, % "|" StrReplace(sectNames, "`n", "|")
Gui, Add, Edit, x142 y119 w170 h20 vvEdit , Edit
Gui, Add, Edit, x142 y159 w170 h20 vvEdit1 , Edit
Gui, Add, Edit, x142 y199 w170 h20 vvEdit2, Edit
Gui, Add, Edit, x142 y239 w170 h20 vvEdit3, Edit
Gui, Add, Button, x182 y299 w90 h30 , Button
return
 
GuiClose:
	ExitApp
 
gSelectSect:
	Gui Submit, NoHide 
	IniRead, login, %INIFILE%,% vSection , Login
	IniRead, pass, %INIFILE%,% vSection, Password
	IniRead, email, %INIFILE%,% vSection, Email
	IniRead, passemail, %INIFILE%,% vSection, PassEmail
	GuiControl,,vEdit, %login%
	GuiControl,,vEdit1, %pass%
	GuiControl,,vEdit2,%email%
	GuiControl,,vEdit3,%passemail%
	return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: serzh82saratov, 2020-04-25 16:24:58)

Re: AHK: Переменная секции

Garaxe пишет:

podname'ы должны быть статичны их должно быть 4 штуки и все не больше, не меньше

Тогда так проще.


/* 
[Acc1]
Login=1
Password=2
Email=4
PassEmail=8
[Acc2]
Login=3
Password=4
Email=1
PassEmail=5
[Acc3]
Login=44
Password=33
Email=1
PassEmail=23
[] 
*/

Global INIFILE := A_ScriptFullPath

IniRead, sectNames, %INIFILE% 

Gui, Show, w479 h379, Untitled GUI
Gui, Add, DropDownList, x142 y49 w170 h50 r10 Choose1 vvSection ggSelectSect, % StrReplace(sectNames, "`n", "|")
Gui, Add, Edit, x142 y119 w170 h20 vvEdit , % IniRead("Acc1", "Login")
Gui, Add, Edit, x142 y159 w170 h20 vvEdit1 , % IniRead("Acc1", "Password")
Gui, Add, Edit, x142 y199 w170 h20 vvEdit2, % IniRead("Acc1", "Email")
Gui, Add, Edit, x142 y239 w170 h20 vvEdit3, % IniRead("Acc1", "passemail")
Gui, Add, Button, x182 y299 w90 h30 , Button
return
 
GuiClose:
	ExitApp
 
gSelectSect:
	GuiControlGet, vSection
	GuiControl, ,vEdit, % IniRead(vSection, "Login")
	GuiControl, ,vEdit1, % IniRead(vSection, "Password")
	GuiControl, ,vEdit2, % IniRead(vSection, "Email")
	GuiControl, ,vEdit3, % IniRead(vSection, "passemail")
	return

IniRead(Section, Key, Error := " ") {
	IniRead, Value, %IniFile%, %Section%, %Key%, %Error%
	If (Value = "" && Error != " ")
		Value := Error
	Return Value
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Переменная секции

serzh82saratov, вот да, абсолютно то что нужно было! Спасибо)

10

Re: AHK: Переменная секции

serzh82saratov, как его в инифайлу привязать

11

Re: AHK: Переменная секции

Global INIFILE := "путь к файлу в кавычках"

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui