1

Тема: AHK: Оптимизация готового скрипта

Добрый день.
Есть готовый скрипт. Работает как задумано, расположение всяческих кнопок\полей задано (разве только с положением текста разобраться до конца не удалось).

menu, tray, add,
menu, tray, add, Закрыть &(F4), l
menu, tray, add, Свернуть &в &трей &(F7), d

g := [0, 1568, 3799, 6257, 7947, 10506, 14507, 16988, 20407, 24597, 26872, 31439, 35598, 39564, 45001, 50123, 54528, 60462, 65444, 72951, 79986, 89565, 103657, 114284, 129144, 146855, 167053, 189564, 214481, 240477]

b:

m:="%"
Menu, j, Add, Свернуть &в &трей &(F7), d
Menu, j, Add, Закрыть &(F4), l
Menu, h, Add, Действия, :j
Gui, Menu, h
Gui, Add, Tab2, w177 h20,Подсчёты|Расчёты|Таблица
Gui, Add, Text, x65 y+98, Значение:
Gui, Add, Edit, number x+15 section w150 vo, 1
gui, font, s10,
Gui, Add, Button, x165 y+15 h30 w80 default, Посчитать
gui, font,,
Gui, Add, Text, x50 y+30 section, Здесь располагается текст.
Gui, Add, Text, x25 y+5, Инструкция и советы по применению скрипта.
Gui, Add, Text, x60 y+5 section, Нечто вроде навигации по вкладкам.
Gui, Add, Button, x25 y+66, Свернуть в трей (F7)
Gui, Add, Button, x+170, Закрыть (F4)
Gui, Tab, 2
Gui, Add, Edit, number x35 y+11 section w110 vy, 1
Gui, Add, Radio, x+20 Checked vz, Задать верхнее значение`n(всегда расчитывается без множителя)
Gui, Add, Radio, y+5, Задать нижнее значение
Gui, Add, Text, w1 x10 y+10, 
Gui, Add, DropDownList, x+226 w120 vb, Без множителя||+50%m%|+100%m%|+150%m%
Gui, Add, Text, x65 y+12, Значение:
Gui, Add, Edit, number x+15 section w150 vx, 1
gui, font, s10,
Gui, Add, Button, x165 y+15 h30 w80, Вычислить
gui, font,,
Gui, Add, Text, x50 y+30 section, Здесь располагается другой текст.
Gui, Add, Text, x45 y+5, Инструкция и советы по применению скрипта.
Gui, Add, Text, x35 y+5, Нечто вроде навигации по вкладкам.
Gui, Add, Text, x45 y+5, В том числе, пояснение по функциям второй вкладки.
Gui, Add, Text, x126 y+5 section, Центрировать постоянно приходится вручную.
Gui, Add, Button, x25 y+30, Свернуть в трей (F7)
Gui, Add, Button, x+170, Закрыть (F4)
Gui, Tab, 3
Gui, Add, Text, h17 x80 y+5, Без множителя
Gui, Add, Text, h17 x+15, (+50%m%)
Gui, Add, Text, h17 x+45, (+100%m%)
Gui, Add, Text, h17 x+45, (+150%m%)
gosub, a
Gui, Show, , Подсчёт
return

GuiClose:
exitapp

ButtonЗакрыть(f4):
exitapp

ButtonВычислить:
Gui, Submit
sleep, 50
if (z=1)
{
if (x<=y)
MsgBox, 0, Подсчёт, Значение %x% меньше или равно верхнему значению %y%.
	else
	{
	i:=ceil(x/y)
	i:=i-1
	a:=ceil((x/y-i)*100)
	if (a=100) 
		{
		a:=0
		i:=i+1
		}
	sleep, 50
	MsgBox, 0, Значение = %x%, верхнее значение = %y%, их отношение = %i%,%a%.
	}
}
if (z=2)
{
if (y>1) and (y<31)
	{
	if (b="Без множителя")
	m:=1
	if (b="+50%")
	m:=1.5
	if (b="+100%")
	m:=2
	if (b="+150%")
	m:=2.5
	i:=ceil(x/m/g[y])
	i:=i-1
	a:=ceil((x/m/g[y]-i)*100)
	if (a=100) 
		{
		a:=0
		i:=i+1
		}
	sleep, 50
	if (b="Без множителя")
	MsgBox, 0, Значение = %x%, Нижнее значение = %y%, их отношение без множителя = %i%,%a%.
	if (b="+50%")
	MsgBox, 0, Подсчёт, Нижнее значение = %y%, их отношение с первым множителем = %i%,%a%.
	if (b="+100%")
	MsgBox, 0, Подсчёт, Нижнее значение = %y%, их отношение со вторым множителем = %i%,%a%.
	if (b="+150%")
	MsgBox, 0, Подсчёт, Нижнее значение = %y%, их отношение с третьим множителем = %i%,%a%.
	}
	else
		{
		sleep, 50
		if (y=1)
 		MsgBox, 0, Подсчёт, Разумному пользователю ни к чему указывать единицу для этого расчёта. Первый элемент массива равен нулю. К чему допускать деление на ноль?
		else
		MsgBox, 0, Подсчёт, Доступны только значения от 1 до 30. Можно было бы указать, что с двойки, но не хочется акцентировать на ней (двойке) внимание.
		}
}
goto, f

ButtonСвернутьвтрей(f7):
gui, destroy
sleep, 10
menu, tray, add, Свернуть &в &трей &(F7), d
menu, tray, delete, Свернуть &в &трей &(F7)
MsgBox, 0, Подсчёт, Приложение свёрнуто в трее. Для использования достаточно нажать клавишу F3 или выбрать пункт "Восстановить" в меню иконки.
menu, tray, add, Восстановить &(F3), r
sleep, 500
return

ButtonПосчитать:
Gui, Submit
gui, destroy
m:=1.0
Gui, Add, Text,, Значение = %O%,
gosub, t

if (i < 31) 	{
		Gui, Add, Text, x+5,расчёт с массивом = %i% целых %a% сотых.
		}
Gui, Add, Text, xm section, Значение = %O%, при первом множителе (+50%m%)
m:=1.5
gosub, t

if (i < 31) 	{
		Gui, Add, Text, x+5,расчёт с массивом = %i% целых %a% сотых.
		}
Gui, Add, Text, xm section, Значение = %O%, при втором множителе (+100%m%)
m:=2.0
gosub, t

if (i < 31) 	{
		Gui, Add, Text, x+5,расчёт с массивом = %i% целых %a% сотых.
		}
Gui, Add, Text, xm section, Значение = %O% , при третьем множителе(+150%m%)
m:=2.5
gosub, t

if (i < 31) 	{
		Gui, Add, Text, x+5,расчёт с массивом = %i% целых %a% сотых.
		}
Gui, Add, Button, x280 default, Готово
sleep, 50
Gui, Show, , Подсчёт
return

ButtonГотово:
goto, f

t:
for i, u in g
{
if (u*m-O >= 0)
	{
	i:=i-1
	a:=ceil((O-a)/(u*m-a)*100)
	m:="%"
	if (a=100) 
		{
		a:=0
		i:=i+1
		}
	return
	}
if (i = 30) 
	gosub, n
a:=u*m
}
return

n:
Gui, Add, Text, x+5,Требуется больше %i%-ти элементов массива. Выход за пределы.
i:=31
m:="%"
return

a:
for i, u in g
	{
	m:=1
	a:=ceil(u*m)
	Gui, Add, Text, w70 x10 y+5,Номер %i%
	Gui, Add, Text, w70 x+18,%a%
		loop, 3
			{
			m:=m+0.5
			a:=ceil(u*m)
			Gui, Add, Text, w70 x+10,%a%
			}
	}
sleep, 150
return

f:
sleep, 50
gui, destroy
sleep, 50
goto, b

f3::
	gui, destroy
	menu, tray, add, Восстановить &(F3), r
	menu, tray, delete, Восстановить &(F3)
	menu, tray, add, Свернуть &в &трей &(F7), d
	goto, b ; запуск скрипта на F3

f7:: 
	gui, destroy
	sleep, 10
	menu, tray, add, Свернуть &в &трей &(F7), d
	menu, tray, delete, Свернуть &в &трей &(F7)
	MsgBox, 0, Подсчёт уровня, Приложение свёрнуто в трее. Для использования достаточно нажать клавишу F3 или выбрать пункт "Восстановить" в меню иконки.
	menu, tray, add, Восстановить &(F3), r
	sleep, 300
	return

r:
menu, tray, delete, Восстановить &(F3)
menu, tray, add, Свернуть &в &трей &(F7), d
goto, b

d:
gui, destroy
	sleep, 10
	menu, tray, delete, Свернуть &в &трей &(F7)
	MsgBox, 0, Подсчёт уровня, Приложение свёрнуто в трее. Для использования достаточно нажать клавишу F3 или выбрать пункт "Восстановить" в меню иконки.
	menu, tray, add, Восстановить &(F3), r
	sleep, 300
	return

l:
exitapp

f4:: ExitApp ; закрытие скрипта на F4

Хотелось бы теперь получить помощь в вынесении мусора из тела программы. Сделать скрипт более лаконичным, грамотно привести в порядок. Например, как-нибудь превратить десять строк кода в две, сохраняя их функционал или сократить количество задействованных переменных. Моих начальных знаний для этого не хватило.
Скриптом занимаюсь на работе и больше по памяти (доступ в интернет принципиально использую только в рамках рабочих функций), а дома на него времени просто нет.

Заодно хотелось бы уточнить вот такой момент: при активации скрипта в трее автоматически появляется его иконка и во встроенном меню у него есть пункты "Suspend Hotkeys", "Pause Script" и "Exit". Можно ли их как-нибудь оттуда убрать\спрятать? Если нет, то можно ли хотя бы поместить мои пункты меню выше этих?

Буду рад любым подсказкам и советам.
Большое спасибо.

2

Re: AHK: Оптимизация готового скрипта

Хотелось бы теперь получить помощь в вынесении мусора из тела программы.

А смысл? Вы же не будете код скрипта вешать на доску почёта?

... пункты "Suspend Hotkeys", "Pause Script" и "Exit". Можно ли их как-нибудь оттуда убрать\спрятать?

Можно, для этого есть команда Menu,Tray.

3

Re: AHK: Оптимизация готового скрипта

ypppu

А смысл? Вы же не будете код скрипта вешать на доску почёта?

Мы-то  не будем, но грамотно оформлять свои работы полезно с первых шагов. А может и будем - кто нас знает?

4

Re: AHK: Оптимизация готового скрипта

Код оформлен правильно. Отступы и комментарии есть. Мусора нет. Когда Вы посмотрите на него через много лет, то поймёте порядок работы.
В нынешнем виде - это лучший вариант для просмотра в Блокноте. Если хочется отдельные подпрограммы, функции и т. п. убрать под спойлер, используйте специальные редакторы для скриптов: AHK: Удобный редактор / среда для AHK.

5

Re: AHK: Оптимизация готового скрипта


gosub, a
goto, f

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

6

Re: AHK: Оптимизация готового скрипта

Имена процедур должны говорить о том, что делает их код.

Это было сделано нарочно. Меньше длина переменной - меньше переменная отбирает ресурса. Поправил.

menu, tray, nostandard
menu, tray, add, Свернуть &в &трей &(F7), killthemall
menu, tray, add, Закрыть &(F4), awayfromhere

massiv := [0, 1568, 3799, 6257, 7947, 10506, 14507, 16988, 20407, 24597, 26872, 31439, 35598, 39564, 45001, 50123, 54528, 60462, 65444, 72951, 79986, 89565, 103657, 114284, 129144, 146855, 167053, 189564, 214481, 240477]

begin:

Menu, mainmenu, Add, Свернуть &в &трей &(F7), killthemall
Menu, mainmenu, Add, Закрыть &(F4), awayfromhere
Menu, allmenu, Add, Действия, :mainmenu
Gui, Menu, allmenu
Gui, Add, Tab2, w177 h20,Подсчёты|Расчёты|Таблица
Gui, Add, Text, x65 y126, Значение:
Gui, Add, Edit, number x+15 section w150 vZnach, 1
gui, font, s10,
Gui, Add, Button, x165 y+15 h30 w80 default, Посчитать
gui, font,, 
Gui, Add, Text, x30 center y+30 w350, Здесь располагается текст. Инструкция и советы по применению скрипта. Нечто вроде навигации по вкладкам.
Gui, Add, Button, x17 y326, Свернуть в трей (F7)
Gui, Add, Button, x+140 w110, Закрыть (F4)
Gui, Tab, 2
Gui, Add, Edit, number x35 y+11 w110 vVerhorniz, 1
Gui, Add, Radio, x+20 Checked vOneRadio, Задать верхнее значение`n(всегда расчитывается без множителя)
Gui, Add, Radio, y+5, Задать нижнее значение
Gui, Add, Text, w1 x10 y+10, 
Gui, Add, DropDownList, x+186 w120 vOneDropList, Без множителя||+50`%|+100`%|+150`%
Gui, Add, Text, x65 y126, Значение:
Gui, Add, Edit, number x+15 section w150 vChislo, 1
gui, font, s10,
Gui, Add, Button, x165 y+15 h30 w80, Вычислить
gui, font,,
Gui, Add, Text, x30 y+30 center w350, Здесь располагается другой текст. Инструкция и советы по применению скрипта. Нечто вроде навигации по вкладкам. В том числе, пояснение по функциям второй вкладки. X-положение приходится вычислять на глаз.
Gui, Add, Button, x17 y326, Свернуть в трей (F7)
Gui, Add, Button, x+140  w110, Закрыть (F4)
Gui, Tab, 3
Gui, Add, Text, h17 x80 y+5, Без множителя
Gui, Add, Text, h17 x+15, (+50`%)
Gui, Add, Text, h17 x+45, (+100`%)
Gui, Add, Text, h17 x+45, (+150`%)
gosub, writetable						; расчёт таблицы и запись её в третьей вкладке
Gui, Show, w400, Подсчёт
return

ButtonВычислить:
Gui, Submit
sleep, 50
if (OneRadio=1)							; работа с верхним значением
{
if (Chislo<=Verhorniz)
MsgBox, 0, Подсчёт, Значение %Chislo% меньше или равно верхнему значению %Verhorniz%.
	else
	{
	nomer:=ceil(Chislo/Verhorniz)				; отделение целой части отношения значения пользователя к верхнему значению через округление в большую сторону
	nomer:=nomer-1
	buffer:=ceil((Chislo/Verhorniz-nomer)*100)		; отделение сотых единиц
	if (buffer=100) 
		{
		buffer:=0
		nomer:=nomer+1
		}
	sleep, 50
	MsgBox, 0, Подсчёт, Значение = %Chislo%, верхнее значение = %Verhorniz%, их отношение = %nomer%,%buffer%.
	}
}
if (OneRadio=2)
{
if (Verhorniz>1) and (Verhorniz<31)				; работа с нижним значением (порядковым номером элемента массива)
	{
	if (OneDropList="Без множителя")
	mnojitel:=1
	if (OneDropList="+50%")
	mnojitel:=1.5
	if (OneDropList="+100%")
	mnojitel:=2
	if (OneDropList="+150%")
	mnojitel:=2.5
	nomer:=ceil(Chislo/mnojitel/massiv[Verhorniz])		; отделение целой части отношения значения пользователя к элементу массива
	nomer:=nomer-1
	buffer:=ceil((Chislo/mnojitel/massiv[Verhorniz]-nomer)*100)	; отделение сотых единиц
	if (buffer=100) 
		{
		buffer:=0
		nomer:=nomer+1
		}
	sleep, 50
	if (OneDropList="Без множителя")
	MsgBox, 0, Подсчёт, Значение = %Chislo%, нижнее значение = %Verhorniz%, их отношение без множителя = %nomer%,%buffer%.
	if (OneDropList="+50%")
	MsgBox, 0, Подсчёт, Значение = %Chislo%, нижнее значение = %Verhorniz%, их отношение с первым множителем = %nomer%,%buffer%.
	if (OneDropList="+100%")
	MsgBox, 0, Подсчёт, Значение = %Chislo%, нижнее значение = %Verhorniz%, их отношение со вторым множителем = %nomer%,%buffer%.
	if (OneDropList="+150%")
	MsgBox, 0, Подсчёт, Значение = %Chislo%, нижнее значение = %Verhorniz%, их отношение с третьим множителем = %nomer%,%buffer%.
	}
	else
		{
		sleep, 50
		if (Verhorniz=1)
 		MsgBox, 0, Подсчёт, Разумному пользователю ни к чему указывать единицу для этого расчёта. Первый элемент массива равен нулю. К чему допускать деление на ноль?
		else
		MsgBox, 0, Подсчёт, Доступны только значения от 1 до 30. Можно было бы указать, что с двойки, но не хочется акцентировать на ней (двойке) внимание.
		}
}
goto, finish

ButtonПосчитать:
Gui, Submit
gui, destroy
mnojitel:=1
Gui, Add, Text,, Значение = %Znach%,
gosub, podchet

if (koef < 31) 	{
		Gui, Add, Text, x+5,расчёт с массивом = %nomer% целых %buffer% сотых.
		}
Gui, Add, Text, xm section, Значение = %Znach%, при первом множителе (+50`%)
mnojitel:=1.5
gosub, podchet

if (koef < 31) 	{
		Gui, Add, Text, x+5,расчёт с массивом = %nomer% целых %buffer% сотых.
		}
Gui, Add, Text, xm section, Значение = %Znach%, при втором множителе (+100`%)
mnojitel:=2
gosub, podchet

if (koef < 31) 	{
		Gui, Add, Text, x+5,расчёт с массивом = %nomer% целых %buffer% сотых.
		}
Gui, Add, Text, xm section, Значение = %Znach% , при третьем множителе (+150`%)
mnojitel:=2.5
gosub, podchet

if (koef < 31) 	{
		Gui, Add, Text, x+5,расчёт с массивом = %nomer% целых %buffer% сотых.
		}
Gui, Add, Button, x280 default, Готово
sleep, 50
Gui, Show, , Подсчёт
return

ButtonГотово:
goto, finish

podchet:							; просмотр массива и сверка с указанным числом
for nomer, elem in massiv
{
if (elem*mnojitel-Znach >= 0)					; если текущий элемент массива больше указанного пользователем значения
	{
	nomer:=nomer-1
	buffer:=ceil((Znach-buffer)/(elem*mnojitel-buffer)*100) ; буферная переменная=первые два знака после запятой от деления разницы значения пользователя и предыдущего элемента массива на разницу текущего и предыдущего элементов массива
	if (buffer=100) 
		{
		buffer:=0
		nomer:=nomer+1
		}
	return
	}
if (nomer = 30) 
	gosub, overlimit
buffer:=elem*mnojitel						; присвоение буферной переменной значения текущего элемента массива
}
return

overlimit:
Gui, Add, Text, x+5,Требуется больше %koef%-ти элементов массива. Выход за пределы.
nomer:=31
return

writetable:							; заполнение таблицы для третьей вкладки
for nomer, elem in massiv
	{
	mnojitel:=1
	buffer:=ceil(elem*mnojitel)
	Gui, Add, Text, w70 x10 y+5,Номер %nomer%
	Gui, Add, Text, w70 x+18,%buffer%
		loop, 3
			{
			mnojitel:=mnojitel+0.5
			buffer:=ceil(elem*mnojitel)
			Gui, Add, Text, w70 x+10,%buffer%
			}
	}
sleep, 150
return

ButtonСвернутьвтрей(f7):
gui, destroy
sleep, 10
menu, tray, deleteall
MsgBox, 0, Подсчёт, Приложение свёрнуто в трее. Для использования достаточно нажать клавишу F3 или выбрать пункт "Восстановить" в меню иконки.
menu, tray, add, Восстановить &(F3), zanovo
menu, tray, add, Закрыть &(F4), awayfromhere
sleep, 500
return

finish:
sleep, 50
gui, destroy
sleep, 50
goto, begin

f3::
	gui, destroy
	menu, tray, deleteall
	menu, tray, add, Свернуть &в &трей &(F7), killthemall
	menu, tray, add, Закрыть &(F4), awayfromhere
	goto, begin ; запуск скрипта на F3

f7:: 
	gui, destroy
	sleep, 10
	menu, tray, deleteall
	MsgBox, 0, Подсчёт уровня, Приложение свёрнуто в трее. Для использования достаточно нажать клавишу F3 или выбрать пункт "Восстановить" в меню иконки.
	menu, tray, add, Восстановить &(F3), zanovo
	menu, tray, add, Закрыть &(F4), awayfromhere
	sleep, 300
	return

zanovo:
menu, tray, deleteall
menu, tray, add, Свернуть &в &трей &(F7), killthemall
menu, tray, add, Закрыть &(F4), awayfromhere
goto, begin

killthemall:
	gui, destroy
	sleep, 10
	menu, tray, deleteall
	MsgBox, 0, Подсчёт уровня, Приложение свёрнуто в трее. Для использования достаточно нажать клавишу F3 или выбрать пункт "Восстановить" в меню иконки.
	menu, tray, add, Восстановить &(F3), zanovo
	menu, tray, add, Закрыть &(F4), awayfromhere
	sleep, 300
	return

GuiClose:
exitapp

ButtonЗакрыть(f4):
exitapp

awayfromhere:
exitapp

f4:: ExitApp ; закрытие скрипта на F4

По мне тут мусора ещё многовато... Ладно, по порядку и конкретнее:
1) Подскажите, пожалуйста, как организовать работу скрипта в мультиоконном режиме? То есть, у меня по нажатию кнопки "Посчитать" в первой вкладке раньше появлялось второе окошко с результатом и кнопкой "Готово", но скрипт не реагировал на нажатие этой кнопки. Поэтому теперь после нажатия кнопки "Посчитать" и всех расчётов весь gui рисуется каждый раз заново.
1.1) Связано с передыдущим пунктом. Нажатие на кнопку "Вычислить" во второй вкладке даёт команду программе произвести подсчёты, выдать результат и перерисовать gui заново (делая активной первую вкладку), вместо того чтобы по закрытию окошка с результатом вернуть окно интерфейса с активной второй вкладкой.
2) Как прописать функции для клавиш (F3, F4 и F7) соответственно тем функциям и кнопкам ("Восстановить", "Закрыть" и "Свернуть в трей") за которые они отвечают? Приходится дублировать описание одних и тех же действий. Как-то объединить, например,

f7:: 
	gui, destroy
	sleep, 10
	menu, tray, deleteall
	MsgBox, 0, Подсчёт уровня, Приложение свёрнуто в трее. Для использования достаточно нажать клавишу F3 или выбрать пункт "Восстановить" в меню иконки.
	menu, tray, add, Восстановить &(F3), zanovo
	menu, tray, add, Закрыть &(F4), awayfromhere
	sleep, 300
	return

и

killthemall:
	gui, destroy
	sleep, 10
	menu, tray, deleteall
	MsgBox, 0, Подсчёт уровня, Приложение свёрнуто в трее. Для использования достаточно нажать клавишу F3 или выбрать пункт "Восстановить" в меню иконки.
	menu, tray, add, Восстановить &(F3), zanovo
	menu, tray, add, Закрыть &(F4), awayfromhere
	sleep, 300
	return

Это делается как-то через hotkey? По идее, так оно было бы правильнее, но эта часть мне не очень далась. Главная проблема в том, что если я "сверну" приложение на кнопку в  интерфейсе, то не закрывая окошко выскакивающего сообщения я могу "свернуть ещё раз" уже свёрнутое приложение, что вызовёт ещё одно окошко. Путём нехитрых манипуляций я могу накопить порядка шести таких окошек, а мне вовсе не нужно, чтобы скрипт реагировал на клавишу F3 когда приложение активно и на клавишу F7 когда оно "свёрнуто".
3) При задействовании клавиш F3 и F7 либо соответствующих кнопок интерфейса, либо через соответствующее меню, скрипт вынужден каждый раз удалять из трея все меню и выставлять определённые обратно. Как устроить, чтобы он удалял строго определённые меню только если они там есть. Как написать "if такая-то менюшка есть - delete её"? Нужно как-то применить UseErrorLevel? Если просто указать ему удалить такую-то менюшку из трея, а её там не окажется - он выдаёт ошибку.

Это что я хотел бы поправить в коде на данном этапе. Спасибо за помощь.

7

Re: AHK: Оптимизация готового скрипта

Oomniq пишет:

Это было сделано нарочно. Меньше длина переменной - меньше переменная отбирает ресурса. Поправил.

Здравствуйте.
Длина имени переменной увеличивает длину файла, текст которого Вы набираете на 1 байт за каждый символ, но на способности и скорости работы это никак не сказывается.

Для организации кода можно использовать псевдокод, позволяющий самостоятельно смотреть на конструируемый объект больше с понятной, человеческой позиции, используя в его описании привычную терминологию. Потом, когда картина становится понятна, или достаточно проработаны нужные детали это просто переносится в код выполняемого сценария.

Так же, есть довольно популярное мнение, в некоторых выводах которого оператор "GoTo" выглядит как рудимент. Безусловно, метка перехода удобна, но если Вы пишете серьёзный проект, то  проблемы связанные именно с этой частностью могут стать неизбежными. Любой алгоритм можно описать в теле циклов без использования "GoTo", да и выглядеть он будет куда нагляднее.

8

Re: AHK: Оптимизация готового скрипта

В чем "злость" Goto?

9 (изменено: Oomniq, 2016-10-02 18:17:37)

Re: AHK: Оптимизация готового скрипта

Любой алгоритм можно описать в теле циклов без использования "GoTo", да и выглядеть он будет куда нагляднее.

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

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

По мультиокну пробовал:

ButtonПосчитать:
Gui, Submit
mnojitel:=1
Gui, 2:Add, Text,, Значение = %Znach%,
gosub, podchet

if (koef < 31) 	{
		Gui, 2:Add, Text, x+5,расчёт с массивом = %nomer% целых %buffer% сотых.
		}
Gui, 2:Add, Text, xm section, Значение = %Znach%, при первом множителе (+50`%)
mnojitel:=1.5
gosub, podchet

if (koef < 31) 	{
		Gui, 2:Add, Text, x+5,расчёт с массивом = %nomer% целых %buffer% сотых.
		}
Gui, 2:Add, Text, xm section, Значение = %Znach%, при втором множителе (+100`%)
mnojitel:=2
gosub, podchet

if (koef < 31) 	{
		Gui, 2:Add, Text, x+5,расчёт с массивом = %nomer% целых %buffer% сотых.
		}
Gui, 2:Add, Text, xm section, Значение = %Znach% , при третьем множителе (+150`%)
mnojitel:=2.5
gosub, podchet

if (koef < 31) 	{
		Gui, 2:Add, Text, x+5,расчёт с массивом = %nomer% целых %buffer% сотых.
		}
Gui, 2:Add, Button, x280 default, Готово
sleep, 50
Gui, 2:Show, , Подсчёт
return

Button2:Готово: 			; здесь пробовал разные вариации
goto, finish

Но на нажатие кнопки "Готово" никакой реакции добиться не получалось.

10

Re: AHK: Оптимизация готового скрипта


2ButtonГотово:

Button(Кнопка) - предпоследний абзац в разделе.