1

Тема: AHK: #include подружить с переменными

Как известно #include не принимает переменные и тупо считает их текстом. В связи с этим у меня такая вот проблема:
Имеется динамический путь до файла .ahk. Папка/[Переменная]/file.ahk.
И собственно вопрос, есть ли способы решения этой проблемы. Как вариант думаю сделать так.

if(Переменная == 1)
	#include Папка\1\file.ahk
if(Переменная == 2
	#include Папка\2\file.ahk

Стоит ли копать в этом направлении? Или есть другой способ?

2 (изменено: Alectric, 2016-04-14 15:37:18)

Re: AHK: #include подружить с переменными

#Include / #IncludeAgain

Справка пишет:

Скрипт ведёт себя так, как если бы всё содержимое вставляемого файла физически находилось на месте директивы #Include (как будто вы скопировали и вставили его из этого файла). Вследствие этого, таким способом обычно нельзя объединить два изолированных скрипта в один нормально функционирующий (как можно этого добиться, смотрите здесь: www.autohotkey.com/forum/topic18545.html).

Можно попытаться использовать "*i " и перечислить все возможные пути к файлу.

Справка пишет:

Перед именем файла можно поставить *i и один пробел, что позволит программе игнорировать неудачи при загрузке вставляемого файла.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3

Re: AHK: #include подружить с переменными

Alectric пишет:

#Include / #IncludeAgain

Справка пишет:

Скрипт ведёт себя так, как если бы всё содержимое вставляемого файла физически находилось на месте директивы #Include (как будто вы скопировали и вставили его из этого файла). Вследствие этого, таким способом обычно нельзя объединить два изолированных скрипта в один нормально функционирующий (как можно этого добиться, смотрите здесь: www.autohotkey.com/forum/topic18545.html).

Можно попытаться использовать "*i " и перечислить все возможные пути к файлу.

Справка пишет:

Перед именем файла можно поставить *i и один пробел, что позволит программе игнорировать неудачи при загрузке вставляемого файла.

Не вышло. Если больше предожений не будет, сделаю методом сравнения.

4

Re: AHK: #include подружить с переменными

alekksss пишет:

сделаю методом сравнения.

А нам расскажете как это?

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

5

Re: AHK: #include подружить с переменными

serzh82saratov пишет:
alekksss пишет:

сделаю методом сравнения.

А нам расскажете как это?

if(var == 1)
	#include dir\1\file.ahk
else if(var == 2)
	#include dir\2\file.ahk
else if(var == 3)
	#include dir\3\file.ahk

6

Re: AHK: #include подружить с переменными

А вы по ссылке из 2 поста не читали:

Как и другие директивы, #Include не может выполняться условно. Другими словами, этот пример работать не будет:
if x = 1
    #Include SomeFile.ahk  ; Эта строка будет выполнена независимо от значения х.
    y = 2  ; А эта строка принадлежит If выше, поскольку директивы
           ; не могут принадлежать If.

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

7

Re: AHK: #include подружить с переменными

Опять прблемка) Вычитал что это тоже не сработает. Есть предложения?

8

Re: AHK: #include подружить с переменными

Предложения могут появится из постановки конкретной задачи, в виде - зачем это нужно.

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

9

Re: AHK: #include подружить с переменными

А если мне не иклюдить а запускать скрипт index.ahk через Run. Подскажите как закрыть его потом из другого скрипта.

10

Re: AHK: #include подружить с переменными

serzh82saratov Суть такая. В GUI окне юзверь выбирает из DropDownList определенное значение, нажимает кнопку "Загрузить" и по результатам дропдоуна иклюдить нужный файл из нужной папки. Динамическое подключение.

11 (изменено: Malcev, 2016-04-14 19:02:41)

Re: AHK: #include подружить с переменными

Первое, что приходит на ум.

if(var = 1)
   file := "1.txt"
if(var = 2)
   file := "2.txt"
FileCopy, %file%, c:\file.txt, 1
#include c:\file.txt

12

Re: AHK: #include подружить с переменными

Malcev Я что-то такое представлял, сохранять в файл. Займусь. Спасибо огромное.

13 (изменено: serzh82saratov, 2016-04-14 19:16:23)

Re: AHK: #include подружить с переменными

Скорее так, иначе снова похоже на условное выполнение include.


#include c:\file.txt
-----
FileCopy, %var%.txt, c:\file.txt, 1
Reload
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: #include подружить с переменными

Да, точно.
Может тогда стоит инклюдить все файлы.
Каждый из которых будет состоять из функции.
И потом в зависимости от переменной обращаться к соответствующей функции?

15

Re: AHK: #include подружить с переменными

Так это надо их видеть. Мало ли, может в них директивы какие, или ещё чего...

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

16

Re: AHK: #include подружить с переменными

Я решил не мудрить с плагин-системой. Всё будет вшито в один файл и вызываться всё в нужный момент в нужных условиях.

17

Re: AHK: #include подружить с переменными

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

1.ahk

WheelUp::vkBD
WheelDown::vkBB

2.ahk

Count := 0
#IfWinActive, Total Commander
Shift::
arr:=["^{f3}^{vk52}", "^{f5}^{vk52}", "^{f6}^{vk52}", "^{f4}^{vk52}"]
SendInput % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<250))+1]
return

3.ahk

#Include 1.ahk
#Include 2.ahk

18

Re: AHK: #include подружить с переменными

При запуске скрипта выполняется команды, которые расположены до определений горячих клавиш, команд Return, Exit. У вас определения попадают вперёд, поэтому Count := 0 не выполняется.

19

Re: AHK: #include подружить с переменными

YMP, спасибо! Перенес Count := 0 в начало третьего сценария и кажется, теперь работают оба вложеных сценария.
А можно ли как-то оставить этот параметр во втором сценарии, но так, чтобы все вложеные сценарии по-прежнему работали?

20

Re: AHK: #include подружить с переменными

Попробуй переименовать 1.ahk в 2.ahk и наоборот.

21

Re: AHK: #include подружить с переменными

ypppu, так у меня не работает GUI из первого скрипта. Я его здесь не приводил в пример, т.к. большой объем кода. Также GUI перестает отображаться, если вначале скрипта размещено подобное:


Loop
{
		ControlSend, , `n, Warning
		ControlSend, , `n, Delete Item
}
return

Конечно, хотелось бы узнать, почему.

22 (изменено: Malcev, 2016-05-12 20:02:17)

Re: AHK: #include подружить с переменными

Потому что идет вечный цикл.
Так будет работать:

#IfWinActive, Total Commander
Shift::
if (Count = "")
   Count := 0
arr:=["^{f3}^{vk52}", "^{f5}^{vk52}", "^{f6}^{vk52}", "^{f4}^{vk52}"]
SendInput % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<250))+1]
return

Либо так:

#IfWinActive, Total Commander
Shift::
Count += 0
arr:=["^{f3}^{vk52}", "^{f5}^{vk52}", "^{f6}^{vk52}", "^{f4}^{vk52}"]
SendInput % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<250))+1]
return

23

Re: AHK: #include подружить с переменными

Для понимания советую прочитать в русской справке про секцию авто-выполнения.

24

Re: AHK: #include подружить с переменными

Malcev, спасибо, работает!
ypppu, попробовал поискать одноименную статью, к сожалению, не нашел.

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

+ Как это выглядит:
OnMessage(0x404, "AHK_NOTIFYICON")
AHK_NOTIFYICON(wParam, lParam)
{
    if (lParam = 0x202) ; WM_LBUTTONUP
    {
        Suspend
        return 1
    }
    else if (lParam = 0x205) ; WM_RBUTTONUP
    {
        Menu, Tray, Show
        Sleep 1000
        return 1 ; In case of load failure.
    }
    else if (lParam = 0x208) ; WM_MBUTTONUP
    {
        Reload
        return 1
    }
}
return

#Include 1.ahk ; не работает GUI из этого вложенного сркипта
#Include 2.ahk

#Include 1.ahk 
#Include 2.ahk

; далее не работает

OnMessage(0x404, "AHK_NOTIFYICON")
AHK_NOTIFYICON(wParam, lParam)
{
    if (lParam = 0x202) ; WM_LBUTTONUP
    {
        Suspend
        return 1
    }
    else if (lParam = 0x205) ; WM_RBUTTONUP
    {
        Menu, Tray, Show
        Sleep 1000
        return 1 ; In case of load failure.
    }
    else if (lParam = 0x208) ; WM_MBUTTONUP
    {
        Reload
        return 1
    }
}
return

25

Re: AHK: #include подружить с переменными

http://www.script-coding.com/AutoHotkey … #chapter_1

26

Re: AHK: #include подружить с переменными

ypppu, спасибо! Прочитал. К сожалению, в виду общей неграмотности в программировании, метода решения проблемы размещения в одном файле приведенного сценария со вложенными не нашел. Возможно ли вообще привести в работоспособность такой сценарий целиком?

27

Re: AHK: #include подружить с переменными

Чтобы повысить грамотность, изучите команды, использованные в Ваших скриптах.

28

Re: AHK: #include подружить с переменными

ypppu, я признателен Вашему желанию сподвигнуть пользователей на изучение языка, но для меня программирование как явление достаточно сложное для понимания. По крайней мере, сейчас.

С надежой на подсказку, повторюсь:
Что необходимо сделать, чтобы приведенный скрипт не воздействовал на вложенный за ним сценарий с элементами GUI?

OnMessage(0x404, "AHK_NOTIFYICON")
AHK_NOTIFYICON(wParam, lParam)
{
    if (lParam = 0x202) ; WM_LBUTTONUP
    {
        Suspend
        return 1
    }
    else if (lParam = 0x205) ; WM_RBUTTONUP
    {
        Menu, Tray, Show
        Sleep 1000
        return 1 ; In case of load failure.
    }
    else if (lParam = 0x208) ; WM_MBUTTONUP
    {
        Reload
        return 1
    }
}
return

#Include 1.ahk ; частично работает, но не работает GUI из этого вложенного сркипта
#Include 2.ahk ; работает

29

Re: AHK: #include подружить с переменными

Лично мне не хватает мотивации искать камень преткновения в чужих сложных скриптах. Особенно, когда вопрошающий затрудняется сформулировать вопрос.
Могу научить простому методу (метод исключения). Добавляешь в скрипт новые команды постепенно. Если скрипт начнёт работать неправильно, значит проблема в последней добавленной команде.

30

Re: AHK: #include подружить с переменными

becauseim
Выполнение останавливается, если встречает команды Return и Exit, я ведь уже об этом упоминал.


}
return

#Include 1.ahk ; частично работает, но не работает GUI из этого вложенного сркипта
#Include 2.ahk ; работает

Этот Return у вас не нужен, т.к. конец определения функции обозначен закрывающей фигурной скобкой.

31

Re: AHK: #include подружить с переменными

YMP, Спасибо!

32

Re: AHK: #include подружить с переменными

У меня аналогичный вопрос - возможно ли перенести определения такого вида в отдельный файл и сделать ему #include в начале основного скрипта чтобы получилось нечто вроде
start.ahk

#include soft.ahk

f1::lbutton

soft.ahk

#ifwinactive Paint
f1::
  msgbox f1
return
#ifwinactive

У меня спотыкается на return, а переопределять через hotkey мне чет не хочется - хочется сохранить нативность кода.

Оборачивать все такое в функции такого вида?

f1::paint_f1()

paint_f1()
{
  msgbox f1
}

Так неудобно получается и есть проблемы с глобальными переменными, которые заманаешься перечислять через global.

33

Re: AHK: #include подружить с переменными

Не особо понятно, чего вы хотите добиться.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

34

Re: AHK: #include подружить с переменными

Скрипт сейчас у меня один и в него, чтобы не запускать множество отдельных ahk, напихано множество разнородного содержимого.

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

Так-то, определение всех функций, которые мог, уже вынес в отдельные скрипты и подключаю через инклуды, а вот эти определения хоткеев остались в одной куче - и, думаю, пришла пора их как-то упорядочить и структурировать, чтобы не пытаться искать среди кода для фотошопа код для mpc или winamp'а.

Еще проблема в том, что ни akelpad ни notepad++ не понимают директивы ahk (#if, #ifwinactive и прочие) и следовательно сворачивать/разворачивать их не умеют, чтобы упростить редактирование и навигацию в скриптах когда их много. Так что проще открыть несколько вкладок с тематическими скриптами, чем пытаться ориентироваться в одном файле.

35

Re: AHK: #include подружить с переменными

Если проблема в том, что определения горячих клавиш мешают перед секцией автовыполнения, сделайте в начале include goto на нужное место.
Но вообще по-хорошему нужно использовать функции, а не метки, а глобальных переменных либо не должно быть совсем, либо предельно мало.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

36 (изменено: ant_serg57, 2023-03-06 17:09:22)

Re: AHK: #include подружить с переменными

Спасибо за совет, но наконец разобрался как все правильно делать.
Немного поэкспериментировав так и сяк, выяснил что в инклудах тоже надо делать свой return либо сразу либо после определения глобальных переменных и констант - после этого все начинает работать нормально и никаких ошибок не вылезает.
То есть каждый инклуд должен быть вида :

return

#ifwinactive Paint
f1::
  msgbox f1
return
#ifwinactive

Так-то да, глобальные переменные вещь довольно своеобразная и ее лучше использовать с умом.
Функции конечно логичнее, но когда используется сложная логика с переходами по goto, то они немного не в кассу.