1

Тема: AHK: Сохранение данных

Приветствую. Недавно начал заниматься простеньким скриптом и столкнулся с проблемой... В основном скрипт работает на переменной, в которую нужно указать имя персонажа в родительном падеже. Но я хотел-бы сделать так, что-бы при перезапуске скрипта не приходилось вводить имя заново. Примерно такое-же можно заметить и в биндере того-же Кваса. Я поискал ещё пару тем на форуме и нашёл тему с похожей функцией в .ini файле. Но в .ini файле, который лежит в папке биндера - ничего подобного нет (я про текст). Ещё хочу спросить, возможно ли такое: один раз ввести имя персонажа в gui, но последующие разы гуи открываться не будет, но если нажать на бинд - то появится возможность изменить имя персонажа.


Gui, Add, Button, x167 y139 w100 h30 gKey , Done
Gui, Add, Edit, x92 y99 w130 h30 vName , 
Gui, Add, Text, x42 y99 w50 h30 , На ухе у
Gui, Add, Text, x222 y99 w170 h30 , закреплена bluetooth гарнитура.
Gui, Font, S14 CDefault Bold, Verdana
Gui, Add, Text, x92 y9 w250 h60 , Введите имя в родительном падеже
; Generated using SmartGUI Creator for SciTE
Gui, Show, w438 h228, Имя персонажа
return
GuiClose:
ExitApp
return
Key:
GuiControlGet, Name
Gui, Destroy
1:
:?:/rf:: 													 	 	 		 					     
SendInput, /rf{space}		
input, rf, V, {enter}               						     
SendMessage, 0x50,, 0x4190419,, A
Sleep 100 								 					    
SendInput, {f6}/do На ухе %Name% закреплена bluetooth гарнитура.{enter} 
sleep 1000														
SendInput, {f6}/me зажал кнопку на гарнитуре.{enter}
sleep 1000														
sendinput, {f6}/todo %rf% *зажав кнопку.{enter}  	 
sleep 1000 								 					 	 
SendInput, {f6}/r %rf%{enter}	 					  	
Sleep 1
SendInput, {f6}/me отпустил кнопку на гарнитуре.
return

И ещё хотел-бы попросить: Если всё-таки найдётся человек, который исправит это какими-то строками - попрошу объяснить за что отвечают новые строки.

Благодарю за внимание и помощь.

Ламер с:

2 (изменено: sememix, 2019-08-08 01:40:46)

Re: AHK: Сохранение данных

Создай файл, не обязательно ini.
При первом запуске, в этом файле что-то есть? Если да, то это и будет, то самое имя, если он пуст, то пусть вылезет GUI в котором введёшь имя.
Второй вариант - помести в текстовый файл имя, которое от туда постоянно и считывай.
Третий вариант - SAMP udf. Функция getUsername()- Возвращает ник локального игрока. И ничего вводить не надо.

name := getUsername()
getUsername() {
    if(!checkHandles())
        return ""
    
    dwAddress := dwSAMP + ADDR_SAMP_USERNAME
    sUsername := readString(hGTA, dwAddress, 25)
    if(ErrorLevel) {
        ErrorLevel := ERROR_READ_MEMORY
        return ""
    }
    
    ErrorLevel := ERROR_OK
    return sUsername
}
checkHandles() {
    if(iRefreshHandles+500>A_TickCount)
        return true
    iRefreshHandles:=A_TickCount
    if(!refreshGTA() || !refreshSAMP() || !refreshMemory()) {
        return false
    } else {
        return true
    }
    
    return true
}

3 (изменено: Danny_Angel0s, 2019-08-08 02:43:06)

Re: AHK: Сохранение данных

На счёт второго варианта: Мне нужен код, в котором будет либо inputbox, либо "edit" из gui и при вводе в строку оно будет сохранять введённое сообщение в файл, а потом уже считывать из файла. Знаю что плохо объяснил, так что лучше наведу пример нужной мне функции:
При запуске скрипта активируется либо окно inputbox (допустим). Если ввести в inputbox какое-то сообщение, оно сохраниться в файле (.ini, .txt, не знаю какой там должен быть) и потом будет считываться даже после перезапуска скрипта.
С udf не вариант, так как его нет для версии 0.3е. Ну либо я плохо искал.

Ламер с:

4

Re: AHK: Сохранение данных

UDF не вариант потому что вам нужно имя не в именительном падеже. Вот вам пример с INI файлами:

global ini := "ini.ini"


IfNotExist, % ini
{
	inputbox, abc,, Введите имя
	if ErrorLevel {
		msgbox, Для продолжения работы скрипта необходимо ввести имя
		ExitApp
	} else {
		IniWrite, abc, %ini%, Section, Key1
		reload
	}
}
	
IniRead, name, %ini%, Section, Key1

msgbox, Ваше имя: %name%
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

5 (изменено: Danny_Angel0s, 2019-08-09 13:48:21)

Re: AHK: Сохранение данных

belyankin12
Делает ник "abc". В строке "IniWrite, abc, %ini%, Section, Key1", пытался изменить abc на переменную name, что-бы появилось то, что было написано в inputbox, но выдавало пустое место. И если я правильно понял, строка "if ErrorLevel msgbox Для продолжения работы скрипта необходимо ввести имя" отвечает за то, что если поле ввода будет пустое - появится этот msgbox с этим текстом, но его нет, появляется "abc".

Хотя никто не отменял того, что я хочу реализовать невозможное, или просто непонятно объяснил проблему.

Мне так-же ещё предложили ещё один код, но это в .txt



!1::
InputBox, varNick, Ввод ника, Введите ник в поле ниже.
if (!ErrorLevel)
  FileAppend, % "`n" varNick, Nick.txt
        MsgBox, Вы ввели ник: %varNick%
Return

!2::
FileRead, nick, Nick.txt
MsgBox, % nick
Return

И, кстати, после перезапуска текст "Вы ввели ник" в msgbox (при нажатии альт+2) пропадает. Но мне нужно для sendinput, так что думаю это не сильно важно.

Ламер с:

6

Re: AHK: Сохранение данных

C errorlevel вы правильно поняли. Давайте я лучше комментарии расставлю, так понятнее будет наверное:

global ini := "ini.ini" ; объявляем переменную с путем до ини файла


IfNotExist, % ini ; если файла не существует то (если существует, то условие будет пропущено)
{
	inputbox, abc,, Введите имя ; спрашиваем имя у пользователя, переменная abc хранит содержимое строки ввода
	if ErrorLevel { ; если окно закрыто нажатием кнопки "Отмена"
		msgbox, Для продолжения работы скрипта необходимо ввести имя
		ExitApp ; выходим из приложения
	} else { ; если закрытием кнопки "Ок"
		IniWrite, %abc%, %ini%, Section, Key1 ; записываем в ини файл значение переменной abc (то, что ввел в строку пользователь) - при этом файл %ini% будет создан
		reload ; перезапускаем скрипт (не обязательная штука впрочем, я вписал эту команду для наглядности, что после перезапуска все сохраняется) - теперь весь код пошел заново
	}
}

; так как до перезапуска скрипта мы сохранили значение переменной abc в ини файл, то условие выше не будет выполнено, так как теперь ini файл существует
IniRead, name, %ini%, Section, Key1 ; читаем значение из ини файла по адресу Секция Section, ключ Key1 в переменную name

msgbox, Ваше имя: %name%
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

7

Re: AHK: Сохранение данных

belyankin12
Спасибо, конечно, но оно всё время выдаёт только "abc", это как-то решается?

Ламер с:

8

Re: AHK: Сохранение данных

А, тфу, где iniwrite abc нужно в знаки процента обрамить (указать интерпретатору что это переменная) - забыл.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.