按鍵精靈——指令碼流程結構(3)

啊——發表於2020-12-17

中斷命令

讓指令碼隨時停止執行的命令
EndScript
ExitScript

EndScript(指令碼停止執行)

除了F12可以讓指令碼停止執行,還可以用EndScript

開啟記事本,當執行這段程式碼時
keypress “1”,1
delay 100
keypress “2”,1
delay 100
EndScript //到這裡就結束執行了,結果為12
keypress “3”,1

ExitScript (退出指令碼)

雖然EndScript和ExitScript都可以停止指令碼,但是
EndScript只能停止當前執行緒
而ExitScript可以停止整個指令碼

執行以下程式碼
beginthread 多執行緒//這是一個啟動多執行緒的命令
delay 1000
tranceprint “主指令碼”
exitscript//結果從執行緒主指令碼就結束程式
//endscript//若換成endscript,從執行緒主指令碼後,會繼續執行執行緒
tranceprint “停止指令碼”
sub 多執行緒()//這是一個多執行緒
do
tranceprint “執行緒” & i
delay 200
loop
end sub

RestartScript(重啟指令碼執行)

可以重啟指令碼,讓指令碼從頭執行

執行以下程式碼
for i=0 to 2
delay 1000
tranceprint “內容” & i
next
restartscrip//重啟指令碼,執行結果不會再執行指令碼結束,會不斷重複0 1 2……
tranceprint “指令碼結束”

(Sub)子程式

一個指令碼內容相同或相似,或者把一個大的分解成若干個子任務。
以上情況可以單獨寫成子程式,然後再呼叫,呼叫完後,會自動回到呼叫處,然後繼續往下執行。
子程式如果不被呼叫,是不會被執行的
子程式可以互相呼叫

語法格式
Sub 子程式名(引數列表)
指令碼程式碼
End Sub

呼叫子程式
Call 子程式名(引數列表)//如果沒有這個,子程式是不會被執行的

1.不帶引數的子程式
引數,每個引數都是用逗號隔開,這些引數叫形參,僅僅只是當前的子程式,如果傳進來的叫實參

例如ifcolor中的一個補血指令碼,在完整指令碼中,補血只是一個小功能,所以可以把補血放倒一個子程式中。
call 自動補血()//從這裡跳到自動補血裡
tranceprint “呼叫自動補血完成”
sub 自動補血()
ifclolr 1289,281,“B9A05E”,0, then
messagebox “顏色等於”
else
messagebox"顏色不等於"
end if
end sub//執行完後會回到call後面

2.帶引數的子程式
可以往子程式裡傳遞引數

例如下列程式碼
x=1
y=2
call 子程式(x,y)//x對應a,y對應b,一一對應,不能多寫,也不能少寫
sub 子程式(a,b)//a和b是引數,是形參,也就是說,只有當在子程式內的時候才會顯示的
tranceprint “a=” & a
tranceprint “b=” & b
end sub

從上面執行的指令碼來看,實參x的值傳遞給了形參a,實參y的值傳遞給了形參b,所以a的值是1,b的值是2.
當實參的值傳遞給了形參後,形參再如何改變,實參都不會改變&

例如下列交換變數的值的例子
x=1
y=2
call 交換變數的值(x,y)//實參
sub 交換變數的值(x,y)//此x,y非彼x,y,這裡是形參
z=x
x=y
y=z
tranceprint “交換後,形參x=” & x
tranceprint “交換後,形參y=” & y
end sub
上面可以看出,子程式裡x,y交換了,主指令碼中仍然是原值

call互相呼叫子程式時,有時會死迴圈,可能使指令碼崩潰
因為每次呼叫子程式都會用一段記憶體來儲存未執行的部分,所以記憶體會佔用越來越多,最終導致崩潰

比如以下程式碼:
call a()
sub a()
call b()
tranceprint “a”//被儲存到記憶體裡,被迴圈呼叫,被迴圈儲存
end sub
call a()
tranceprint “b”//被儲存到記憶體裡
end sub

Function(函式)

函式和子程式類似,唯一不同的就是,函式要有返回值

語法格式:
Function 函式名(形參)
指令碼程式碼
End Function

例如下列程式碼
和=加法(1,2)//加法是一個函式
tranceprint “1+2=” & 和
function 加法(a,b)
加法=a+b//這是一個返回值的寫法
end function

相關文章