#variables #debugging #scope #conditional-statements #autohotkey
#переменные #отладка #область видимости #условные операторы #автоотключение
Вопрос:
Я получаю два странных предупреждения.
- Одно из них: «Эта локальная переменная имеет то же имя, что и глобальная переменная», ссылаясь на
wx
,wy
,ww
,wh
. - Другое — «
ELSE
без соответствияIF
«, относящееся к двумif-else
операторам.
Вот весь сценарий.
#NoEnv
#Warn
SendMode Input
SetWorkingDir %A_ScriptDir%
screen_scaling_factor := A_ScreenDPI/96
^p::mouse_move_win(200,300)
mouse_move_win(x,y,horizontal:="left",vertical:="top",mouse_click:=""){
wingetpos,wx,wy,ww,wh,a
global screen_scaling_factor
if horizontal="left"{
x1 := wx x * screen_scaling_factor
}else{
x1 := wx ww - x * screen_scaling_factor
}
if vertical="top"{
y1 := wy y * screen_scaling_factor
}else{
y1 := wy wh - y * screen_scaling_factor
}
DllCall("SetCursorPos", int, x1, int, y1)
}
-
Однако, когда я добавляю в
local
качестве первой строки функции для включения «принудительного локального режима», первое предупреждение исчезает. -
Когда я добавляю круглые скобки к условию if или удаляю фигурные скобки после него, как показано ниже, второе предупреждение исчезает.
if (horizontal="left"){
x1 := wx x * screen_scaling_factor
}else{
x1 := wx ww - x * screen_scaling_factor
}
или
if horizontal="left"
x1 := wx x * screen_scaling_factor
else
x1 := wx ww - x * screen_scaling_factor
Есть идеи, почему это происходит?
Ответ №1:
Если вы хотите использовать оператор if в устаревшем стиле (пожалуйста, не делайте этого), вы не можете начинать фигурные скобки с той же строки, что и оператор if. Вам придется опустить начальную фигурную {
скобку на одну строку вниз.
Но, пожалуйста, просто используйте выражение if-statement в современном стиле, например:
mouse_move_win(x,y,horizontal:="left",vertical:="top",mouse_click:=""){
wingetpos,wx,wy,ww,wh,a
global screen_scaling_factor
if (horizontal="left"){
x1 := wx x * screen_scaling_factor
}else{
x1 := wx ww - x * screen_scaling_factor
}
if (vertical="top"){
y1 := wy y * screen_scaling_factor
}else{
y1 := wy wh - y * screen_scaling_factor
}
DllCall("SetCursorPos", int, x1, int, y1)
}
Кроме того, лично я бы назвал этот стиль фигурных скобок отвратительным, но, конечно, это просто личные предпочтения, ха-ха.
Но на всякий случай, если вы не знали, вы можете опустить фигурные скобки из одного оператора if / else:
mouse_move_win(x,y,horizontal:="left",vertical:="top",mouse_click:="")
{
wingetpos,wx,wy,ww,wh,a
global screen_scaling_factor
if (horizontal="left")
x1 := wx x * screen_scaling_factor
else
x1 := wx ww - x * screen_scaling_factor
if (vertical="top")
y1 := wy y * screen_scaling_factor
else
y1 := wy wh - y * screen_scaling_factor
DllCall("SetCursorPos", int, x1, int, y1)
}
РЕДАКТИРОВАТЬ: о, кажется, вы отредактировали свой пост. Я начал вводить это до того, как вы его отредактировали, но потом мне пришлось что-то делать.
В любом случае, мой ответ должен ответить на ваши вопросы.
Комментарии:
1. Первый абзац, похоже, не подходит к концу. Вы имеете в виду, что я использую стиль выражения в параметрах функции, поэтому мне лучше не использовать устаревший стиль в этой функции? Кстати, у вас есть какие-либо идеи по поводу первого сообщения об ошибке?
2. Я не знаю, что я там печатал, должно быть, была какая-то ошибка, я отредактировал последнее предложение сейчас. И я почти уверен, что первая ошибка возникла только из-за неправильной интерпретации кода из-за неправильных фигурных скобок.
Ответ №2:
Используйте mouse_move _win
(200, 300) вместо mouse_move(200,300)
Когда вы определяете horizontal:=»left», это означает, что значение по умолчанию — Left , то есть, если значение не указано, предполагается, что оно left . Так что
если горизонтально = влево
не требуется.
Поэтому я предполагаю, что ваш код должен быть наоборот с комбинациями if и else.
^p::mouse_move_win(200, 300)
mouse_move_win(x, y, horizontal:="left", vertical:="top", mouse_click:="") {
wingetpos,wx,wy,ww,wh,a
global screen_scaling_factor
if horizontal=right
x1 := wx ww - x * screen_scaling_factor
else
x1 := wx x * screen_scaling_factor
if vertical=bottom
y1 := wy wh - y * screen_scaling_factor
else
y1 := wy y * screen_scaling_factor
DllCall("SetCursorPos", int, x1, int, y1)
}
Это отлично сработало для меня
Комментарии:
1. для чего нужен mouse_click:=»»? Просто из любопытства…
2. Кажется, я забыл вставить последнюю строку кода, в которой реализовано действие «щелчка мышью», когда для этого аргумента установлено значение true.
3. Это
mouse_move(200,300)
опечатка. И да, функция, очень похожая на эту, только без объявленияlocal
в первой строке, работает довольно хорошо, в то время как это не так, поэтому меня это озадачивает. @user14349190