1 (изменено: Indomito, 2013-11-06 20:04:17)

Тема: AHK: Определение адреса метки до её использования

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

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

2

Re: AHK: Определение адреса метки до её использования

Тебе нужен массив именно случайных чисел для идентификации, т.е. 1,2,3... не подходят?
Можно попробовать использовать счетчик тактов процессора, довольно трудно будет получить 2 одинаковых числа в пределах одного скрипта:

SetBatchLines -1
DllCall("QueryPerformanceCounter", "Int64*", C0)
DllCall("QueryPerformanceCounter", "Int64*", C1)
MsgBox % C0 " `;  diff = " C1 - C0

3

Re: AHK: Определение адреса метки до её использования

Генерируйте первый раз число от 1 до 100, второй раз от 101 до 200, третий раз от 201 до 300 и так далее. Наверно это быстрее, чем всякий раз перебирать массив.

4 (изменено: Indomito, 2013-11-06 17:37:29)

Re: AHK: Определение адреса метки до её использования

Irbis пишет:

Тебе нужен массив именно случайных чисел для идентификации, т.е. 1,2,3... не подходят?

поясню для чего он нужен.
Есть некое число подпрограмм, которые определяют HotKey, т.е. их много но клавиши могут совпадать.
Может 1,2,3... подойдут, но я не знаю как их передать ибо они находятся в секции

#If inActive("Имя окна")
Клавиша1::
; Код исполнения
return
Клавиша2::
; Код исполнения
return
;==== и т.д.
#IfWinActive

  Получается до активации окна я не могу получить/вычислить UIA , и я модифицировал код в такой вид.

#If inActive("Имя окна")
Клавиша1::
a:=1
fnUIA (&a)
; Код исполнения
return
Клавиша2::
a:=1
fnUIA (&a)
; Код исполнения
return
;==== и т.д.
#IfWinActive

Но есть ли гарантия что при повторном входе адрес переменной не низменится, вот что я пытаюсь обойти и решить.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

5

Re: AHK: Определение адреса метки до её использования

Наверно, тупею. Опять ничего не понял в замысле. Зачем это UIA вычислять и что с ним потом делать?

6

Re: AHK: Определение адреса метки до её использования

YMP пишет:

Зачем это UIA вычислять и что с ним потом делать?

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

a:=Array[i]

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

a:=Array[fUIA(что то, что было ранее вычислено именно для этого фрагмента скрипта)]

, проблема в том что индекс должен быть ранее расчитан на этапе инициализации.

Вот что я пытаюсь решить, а ГПСЧ был первой, мыслю, но я понял, что толку то он мне не даст.

P.S. Скрипт откомпилирован.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

7

Re: AHK: Определение адреса метки до её использования

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

Не понятно, что значит работать по массиву.

если к нему обращаться каждый раз, то начинаются тормоза

Каждый раз, когда что? И зачем он нужен, если к нему не обращаться?

Во избежание оных я пытаюсь каким-то Макаром ещё до нажатия на них построить индексный массив

Из одного массива другой массив? Что значит построить?

проблема в том что индекс должен быть ранее расчитан на этапе инициализации

А в чём тут проблема?

8

Re: AHK: Определение адреса метки до её использования

После ряда проверок я пришёл к вот такому решению

A::
goto обход_переменной
переменная_имя_уникальное:=0 ; позже в неё будет записан индекс
обход_переменной
a:=Array[fUIA(переменная_имя_уникальное)]
; Код
Return

;Инициализация в которой записаны или метки или переменные в виде массива
;Предварительно внести все имена используемых переменных в список, по-другому никак, разве что прочитать из главного окна скрипта.
; Это не я писал + адреса переменных не нужны.
list := ["переменная_имя_уникальное1", "переменная_имя_уникальное2"]
var1 := 1, var2 := 2

addr1 := &var1

for k,v in list
   if (&%v% = addr1)
      MsgBox, % v

после инициализации в переменная_имя_уникальное будет занесён индекс в массиве который требует предобработки

Я вроде верно всё записал

P.S. Тjлько вот определиться переменная без её прямого использования, ведь AHK не предикатный язык.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

9 (изменено: Indomito, 2013-11-06 18:49:53)

Re: AHK: Определение адреса метки до её использования

YMP первый массив требует предобработки, а во второй просто записаны индексы первого, вот почему я так извращаюсь.

YMP пишет:

А в чём тут проблема?

а как обратиться к нему не зная индекса - клавиша то не нажималась.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

10

Re: AHK: Определение адреса метки до её использования

Indomito пишет:

а как обратиться к нему не зная индекса - клавиша то не нажималась.

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

11

Re: AHK: Определение адреса метки до её использования

Я думал, что понял вопрос в 1ом сообщении, дал готовое решение. Кажется, вопрос был сформулирован неверно.

12

Re: AHK: Определение адреса метки до её использования

OFF:
Судя по названию темы, сложно что-то понять, прочитав 1-й пост.
Indomito, мне кажется что тебе стоит отдохнуть немного, отвлечься... Ото мозги кипят уже наверно.

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

13 (изменено: Indomito, 2013-11-06 20:07:18)

Re: AHK: Определение адреса метки до её использования

Так попытаюсь объяснить.

Надо сделать предобработку клавиши до её нажатия.
1. Запускается скрипт и начинается инициализация
- обрабатывается массив А
- берутся или вычисляются уникальные идентификаторы для каждой подпрограммы
- по уникальным идентификаторам однозначно устанавливается соответствие индекса в массиве А
- определяется индекс в массиве А и заносится в массив В
2. Когда нажимается клавиша, то она по индексу в массиве В берёт значения из массива А

По сути идентификатор может быть просто индексом в массиве А,  и тогда не требуется массив В. Проблема в том что бы подпрограмма знала этот индекс до её запуска. Я теоретически перебрал в голове все варианты, но так и не нашёл нормального/правильного решения.

P.S. ypppu я бы поменял название топика, но не знаю на что, т.е. если писать по нормальному, то он не умещается по длине, а сокращённый вариант - бред получается.

P.P.S. Хотя, кажется придумал "AHK: Определение адреса метки до её использования" - адреса мне будет достаточно, далее я сам, т.е. по адресу все можно получить, только вот как его получить - я не знаю + будет ли он статическим или динамически, я тоже не знаю.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

14 (изменено: Alectric, 2013-11-06 20:13:52)

Re: AHK: Определение адреса метки до её использования

Indomito пишет:

Надо сделать предобработку клавиши до её нажатия.

Может по такому шаблону попытаетесь:

; инициализация
Обработка массивов и т.д.
Пред-обработка клавиши (вам же извесно какая клавиша для чего в вашем скрипте)
return

; Непосредственно клавиша
Key::
{
бла-бла-бла
}
return

; функции если имеются
Functions()
{
...
}

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

15 (изменено: Indomito, 2013-11-06 20:30:34)

Re: AHK: Определение адреса метки до её использования

Alectric пишет:

Может по такому шаблону попытаетесь:

не выйдет, клавиши могут совпадать, надо по меткам. Ну и ещё я могу поменять клавишу и забыть об этом написать.

А без предописания меток ни как не получиться? Я просто хочу гарантировать 100% попадание, ну просто избежать опечатки в метки.

Вариант массива меток я уже делал и многократно наталкивался на ошибку или опечатку, ну мне это просто надоело и вот решил подойти с другой стороны. Адреса уникальны, как и имена... правда как потом по нажатию на клавишу сразу найти то что нужно?
Есть вариант такой:

LCtrl::
Key_XB01:
vAXB01:=0
; код
return

Метка определяет положение HoyKeY - LCtrl, переменная нужна что бы в неё занести индекс для действий по LCtrl.
Осталась проблема определения самой переменной....
Правда можно их предварительно описать, вот скрипт

;Предварительно внести все имена используемых переменных в список, по-другому никак, разве что прочитать из главного окна скрипта.
; Это не я писал + адреса переменных не нужны.
list := ["переменная_имя_уникальное1", "переменная_имя_уникальное2"]
var1 := 1, var2 := 2

addr1 := &var1

for k,v in list
   if (&%v% = addr1)
      MsgBox, % v

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

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

16

Re: AHK: Определение адреса метки до её использования

Тут, главное, непонятна глобальная цель всей этой возни с индексами. А без этого задача звучит довольно бредово. Да и постоянно концы висят в объяснениях.

- берутся или вычисляются уникальные идентификаторы для каждой подпрограммы

Идентификаторы чего?

- по уникальным идентификаторам однозначно устанавливается соответствие индекса в массиве А

Соответствие индекса чему?

17 (изменено: Alectric, 2013-11-06 20:44:25)

Re: AHK: Определение адреса метки до её использования

Тогда попробуйте так, только при первом нажатии клавиши ничего не произойдет:

; инициализация
Обработка массивов и т.д.
return

; Непосредственно клавиша
Key::
{
  if initkey%A_ThisHotkey%=
  {
    initkey%A_ThisHotkey%=1
    gosub,Inicialization    ; или функцию можно использовать
    return          ;  можно убрать return чтобы продолжить выполнение клавиши
  }

  бла-бла-бла  ; что клавиша должна делать
}
return

Inicialization:
{
  что вы там хотели проинициализировать
}
return

; функции если имеются
Functions()
{
...
}

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

18

Re: AHK: Определение адреса метки до её использования

А что это такое

if initkey%A_ThisHotkey%=

разве не надо чему то приравнять или с чем то сравнить?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

19 (изменено: Alectric, 2013-11-06 20:58:36)

Re: AHK: Определение адреса метки до её использования

Indomito пишет:

А что это такое

if initkey%A_ThisHotkey%=

разве не надо чему то приравнять или с чем то сравнить?

Дословно:
если переменная initkey%какую вы клавишу нажали% равна "ничему" (или False).

Затем ниже ей уже присваивается единица.
И второй раз этот "if" уже не выполнится.

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

20 (изменено: Indomito, 2013-11-06 21:07:32)

Re: AHK: Определение адреса метки до её использования

Я написал на основе примера тест

#Persistent
a::
;initkey%A_ThisHotkey%
a:=  %A_ThisHotkey%
msgbox % a
return

MsgBox ничего не вывел... что то я не понял

Блин ступил, надо так

#Persistent
a::
a:=  A_ThisHotkey
msgbox % a
return

Так, а как получить уникальность то.... ? Переменная всегда будет initkey%A_ThisHotkey%, т.е. в моём случае initkeyа

И про

бла-бла-бла  ; что клавиша должна делать

ну присвоили мы её 1, а потом что с этим делать то, что то я не очень понимаю.

И ещё таких переменных может быть две и более, так одинаковых клавиш много в скрипте.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

21

Re: AHK: Определение адреса метки до её использования

Indomito пишет:

Так, а как получить уникальность то.... ? Переменная всегда будет initkey%A_ThisHotkey%, т.е. в моём случае initkeyа

Это и есть уникальность вроде...

Повторно точно такую-же горячую клавишу нельзя использовать

#Persistent
a::
a:=  A_ThisHotkey
msgbox % a
return


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

22 (изменено: Indomito, 2013-11-06 21:10:15)

Re: AHK: Определение адреса метки до её использования

Да. проблема в том что их много, много RShift, RCtrl и т.д.

Нужна двойная уникальность переменная и её адрес или... что-то иное, но одно имени мало.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

23

Re: AHK: Определение адреса метки до её использования

Indomito пишет:

Да. проблема в том что их много, много RShift, RCtrl и т.д.

Нужна двойная уникальность переменная и её адрес или... что-то иное, но одно имени мало.

Все было-бы куда ясней если можно было бы увидеть весь ваш код.

Видимо он засекречен...

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

24

Re: AHK: Определение адреса метки до её использования

Alectric пишет:

Видимо он засекречен...

да, нет, просто он большой, а что именно показать я не знаю

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

25

Re: AHK: Определение адреса метки до её использования

Скинь мне файл я посмотрю.

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

26 (изменено: Indomito, 2013-11-06 21:25:06)

Re: AHK: Определение адреса метки до её использования

Alectric пишет:

Скинь мне файл я посмотрю.

все файлы? Ты там просто запутаешься, честное слово... около 5000 строк, не сжатый exe весит около 3 Мб... кажется или больше.

Я кажется нашёл более простое решение, но на основе твоего

#Persistent
goto initvar
a::
if (!Var1) 
      return
 msgbox % Var1
return
b::
if (!Var2) 
      return
 msgbox % Var2
return

initvar:
Var1:=1
Var2:=2
return

  Ну массивы я пропустил, для упрощения, для наглядности.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

27 (изменено: Alectric, 2013-11-06 21:29:50)

Re: AHK: Определение адреса метки до её использования

Indomito пишет:
Alectric пишет:

Скинь мне файл я посмотрю.

все файлы? Ты там просто запутаешься, честное слово... около 5000 строк, не сжатый exe весит около 3 Мб... кажется или больше.

Да глупость сказал.
У самого такая программа на 2900 строк.

Только лучше вместо "goto" используй "gosub", т.к. там в конце все равно "Return".

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

28 (изменено: Indomito, 2013-11-06 21:41:25)

Re: AHK: Определение адреса метки до её использования

Alectric пишет:

Только лучше вместо "goto" используй "gosub", т.к. там в конце все равно "Return".

это по привычке.
У меня все ahk-файлы подключаются по #Include
И в каждом модуле:
Первая строчка goto leave_Games(как пример, в каждом модуле разные метки, они именуются по его имени)
Потом код
Последняя leave_Games:

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

Кстати, рекомендую такой метод, ну если ты иного не используешь.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

29 (изменено: Alectric, 2013-11-06 21:49:33)

Re: AHK: Определение адреса метки до её использования

Можно записать "инициализацию" в начале и уже из нее разрешать дальнейшее выполнение.

Инициализация:
{
  initDone=1
}
if initDone=
  return

Остальной код

LButton::
{
  if initDone=
    return
  Остальной код
}

Это упростит ваш код.

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

30 (изменено: Indomito, 2013-11-06 22:02:18)

Re: AHK: Определение адреса метки до её использования

Это ты про всё в целом или про то тему топика?
Если про всё, то не думаю что получится т.е. RETURN просто завершит скрипт.

Вот основной файл.

;*********************************************
;***************BEGIN SCRIPT******************
;*********************************************
;-----Инициализация
; Скрипт не выгружается
#Persistent
; Запрет повторного запуска
#SingleInstance

OnExit, EndASOS

;=============Секция подключения файлов
#Include c:\AHK\Include\                  ;  Устанавливаем путь к общим файлам
#Include PathUses.ahk
#Include C:\AHK\AllSystemOS\              ; Устанавливаем путь к файлам скрипта
#Include ResourceASOS.ahk                 ; Установка ресурсов скрипта
#Include VarScript.ahk                    ; Переменные/константы для скрипта и начальная инициализация
#Include HelpKey.ahk                      ; Справка по клавишам
#Include Games.ahk                        ; Управление играми
#Include AppStartUp.ahk                   ; Запуск приложений
#Include RunCon.ahk                       ; Запуск с консоли
;Тут писать новые подключаемые файлы к скрипту.
#Include EventManager.ahk                 ; Менеджер событий
#Include InitASOS.ahk                     ; Инициализатор скрипта. Обязательно последняя в списке подключения!!!!
#Include TrayASOS.ahk
;=============Секция инициализации скрипта
Gosub InitASOS        ;Старт иницализации
fnPathUses()          ;Иницализация путей
fnResource()          ;Иницализация ресурсов скрипта
fnOverallSection()    ;Иницализация блока переменных
fn_arMainKeyInit()
; Тут дописывать нужные иницализации.
fnTrayASOS()          ;Cменить иконку скрипта  и меню скрипта. Обязательно тут перед завершение инициализации скрипта!
Gosub lCloseInitASOS  ;Завершение иницализации. Обязательно последний вызов после всех!
return

ExitSub:
lExitProc:
EndASOS:
ExitApp
;============= 


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

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

31 (изменено: Alectric, 2013-11-06 22:08:31)

Re: AHK: Определение адреса метки до её использования

Indomito пишет:

У меня все ahk-файлы подключаются по #Include
И в каждом модуле:
Первая строчка goto leave_Games(как пример, в каждом модуле разные метки, они именуются по его имени)
Потом код
Последняя leave_Games:

Я про подключаемые файлы.

Или я вас не так понял...

OFF:
Уже спать пора...

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

32

Re: AHK: Определение адреса метки до её использования

Я так и не понял. Что такое "предобработка клавиши"?
Как понимать "уникальные идентификаторы для каждой подпрограммы"? Что это такое и с чем его едят?

33

Re: AHK: Определение адреса метки до её использования

Если сравнить твой код и мой, то мой это две строчки, а твой нет причём нет необходимости в проверке, т.к. она та и не нужна, ибо инициализация выполняется в другом скрипте и не зависит от подключаемых скриптов - см. мой код, это главный, т.е. main.ahk
Твой код

Инициализация:
{
  initDone=1
}
if initDone=
  return

Остальной код

LButton::
{
  if initDone=
    return
  Остальной код
}

Мой код:

goto Avoid_VarScript  ; На точку обхода.
fnOverallSection(){
;код инициализации файла VarScript.ahk
return
}
;Остальной код
Avoid_VarScript: ; точка обхода

Что проще?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

34

Re: AHK: Определение адреса метки до её использования

ypppu пишет:

Я так и не понял. Что такое "предобработка клавиши"?
Как понимать "уникальные идентификаторы для каждой подпрограммы"? Что это такое и с чем его едят?

Поясняю.

Есть скрипт, который является фрагментом другого скрипта.
В этом скрипте присутствуют, ну скажем 10 определений клавиши RShift, они срабатывают по-разному, так как каждая из них находится в секции проверки активности разных окон.
Так вот проблема заключалась в том, что бы задать каждой клавише RShift разные действия, но они задаются из области, которая не контролирует окна.
Конечно, можно проблему решить проще, но мне показалось, что оптимально создать массив, который определит действия каждой клавиши. Проверять какое из окон активно, то же вариант, но надо сначала сделать предварительную инициализацию каждой из клавиш, что бы она сразу/напрямую считала нужные действия из массива, а не динамически их обрабатывала в ходе нажатия.
Что бы поменять действия по нажатию на клавишу, то я просто вношу поправки в массив, а не в процедуру обработки нажатия на клавишу.

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

Вроде полностью объяснил, почему мне потребовался вариант с предопределением индексов

P.S. Ещё есть вариант, с предописанием и проверкой меток, но там нет зависимости от окон. Все подпрограммы работают в одном окне, пока не запустится любое полноэкранное приложение - тогда они просто отключаются, но не все, остаются 2-3 клавиши. Они позволяют контролировать это полно экранное приложение и ещё кое-что, что должно постоянно срабатывать.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

35

Re: AHK: Определение адреса метки до её использования

Правильно ли я понял суть:
- в зависимости от совокупности неких условий нажатие одних и тех же клавиш должно приводить к совершению разных действий;
- условий настолько много, что их проверка после нажатия клавиши приводит к неприемлемой задержке;
- поэтому возникла мысль проверять как можно большую часть (или все) условий до нажатия клавиши;
- для того, чтобы сопоставить наборы действий каждой клавиши наборам условий, потребовался массив(~ы);
- затруднение возникло в том, как к моменту нажатия клавиши "сообщить ей" требуемый индекс?

Ходит Спесь, надуваючись, С боку на бок переваливаясь. Ростом-то Спесь аршин с четвертью, Шапка-то на нём во целу сажень, Пузо-то его всё в жемчуге, Сзади-то у него раззолочено... Идет Спесь, видит: на небе радуга; Повернул Спесь во другую сторону: Не пригоже-де мне нагибатися!
А. К. Толстой

36 (изменено: Indomito, 2013-11-07 01:07:29)

Re: AHK: Определение адреса метки до её использования

Korobkoff всё абсолютно верно, я теперь вот написал в начале каждой клавиши, такой фрагмент.

RShift::
if (!listVar[iWitcher2_RShift]) 
    return
; Далее код получения по значению переменной Witcher2_RShift, которая является индексом в массиве
; Потом код выполнения
return

По идее всё верно, но скрип ещё не написал, доделываю основную обработку обработку массива и думаю как оформить эти переменные.

Например так (Инициализация)

listVar := [Witcher2_RShift, Witcher2_LShift,......]
Witcher2_RShift:=0, Witcher2_LShift:=0

или как то иначе.

Жаль что нет в AHK положить по адресу...

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

37

Re: AHK: Определение адреса метки до её использования

В таком случае сама идея разгрузки постпроверки представляется мне немного странной. Если проверка условий не будет связана с нажатием клавиши, то с чем она будет связана?

Ходит Спесь, надуваючись, С боку на бок переваливаясь. Ростом-то Спесь аршин с четвертью, Шапка-то на нём во целу сажень, Пузо-то его всё в жемчуге, Сзади-то у него раззолочено... Идет Спесь, видит: на небе радуга; Повернул Спесь во другую сторону: Не пригоже-де мне нагибатися!
А. К. Толстой

38 (изменено: Indomito, 2013-11-07 01:37:10)

Re: AHK: Определение адреса метки до её использования

Если переменная не false, т.е. содержит индекс массива то в остальные переменные по индексу запишутся нужные значения, проще не получается, т.е. так сейчас и работает.

Я просто думаю как оформить сами переменные, как вариант вызывать функцию с передачей имени переменной, возвращать можно индекс, но как на прямую заполнить/записать в переменную, что то не зная её имени... в AHK нет таких средств или я о них не знаю.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

39 (изменено: Irbis, 2013-11-07 20:32:45)

Re: AHK: Определение адреса метки до её использования

Indomito пишет:

<...>но как на прямую заполнить/записать в переменную, что то не зная её имени... в AHK нет таких средств или я о них не знаю.

Видимо мне тоже не суждено постичь целиком замысел ТС'а. Относительно данного предложения - можно поручить запись/хранение переменной процедуре хоткея, и адрес переменной будет неважен, для этого обработку хоткея поместить в функцию. До инициализации (в данном случае по хоткеям F2/F3, но можно любым способом, хоть в цикле данными из массива), контекстные клавиши в Опере и блокноте недоступны.

F2::F1_opera(1) ; Инициализация F1 для оперы
F3::F1_notepad(2) ; Инициализация F1 для блокнота


#if WinActive("ahk_class OperaWindowClass")
F1::F1_opera()
F1_opera(p:=0)
{
   static a:=0 ; идентификатор
   if p {
      a:=p
      Return
   }
   if !a
      Return
  ; Тело хоткея
   MsgBox % "Опера`nUIA = " a
}
#if

#if WinActive("ahk_class Notepad")
F1::F1_notepad()
F1_notepad(p:=0)
{
   static a:=0 ; идентификатор
   if p {
      a:=p
      Return
   }
   if !a
      Return
  ; Тело хоткея
   MsgBox % "Блокнот`nUIA = " a
}
#if