関数
関数とは、引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群を言います。
AutoIt には元々組み込まれている関数が 200以上あり、AutoIt の愛好者が作成した UDF も大量にあります。
UDF とは、ユーザー定義関数(User Defined Function)を略したものです。
これらの関数以外に、繰り返し行うコードを簡略化するために、ユーザー自身が「ユーザー定義関数」を作成することができます。
ユーザー定義関数
引数と返し値を持つことのできる関数を、ユーザー自身が作成したものを「ユーザー定義関数」と言います。
キーワード:Func…Return…EndFunc
ユーザー定義関数の形式は次のようになります。
Func autoit("パラメータ1","パラメータ2", ....); 「autoit」の部分は関数の名前を指定します。
コード....
Return
EndFunc
Return句 で返し値を指定できます。
ユーザー定義関数内で Return句を使用すると、関数はそこで終了します。
その際に返し値を指定しない場合は「0」を返します。
例えば、「Autoit3」というユーザー定義関数を作成したい場合、次のように書きます。
Func Autoit3()
MsgBox(0, "", "これはサンプルです。")
EndFunc
パラメーターを指定する場合は次のように書きます。
Func Autoit3($False, $True)
MsgBox(0, $False, $True)
EndFunc
始めからパラメーターの変数に値を代入しても構いません。
Func Autoit3($False = 0, $True = 1)
MsgBox(0, $False, $True)
EndFunc
パラメーターは指定しなくても構いません。
この関数を呼び出す場合は次のように書きます。
Autoit3()
パラメーターを指定する場合は次のように書きます。
Autoit3(0, 1)
2つの数の内、大きい方を返すサンプル
プログラム中で何度も 2つの数値を比較する場合など、「ユーザー定義関数」を作成しておくと作業の効率が良くなります。
$x = 3
$y = 4
MsgBox(0, "", "$x と $y 大きいのは: " & max($x, $y))
Func max($x, $y) ;2つの数の内大きい方を返す。
If $x > $y Then
Return "$x(" & $x & ")"
Else
Return "$y(" & $y & ")"
EndIf
EndFunc ;==>max
テキストファイルの内容を返すユーザー定義関数
例えば何度もテキストファイルの内容を取得する場合、毎回 FileOpen、FileRead、FileClose を書くのは時間がかかり、コードも長くなってしまい、とても効率が悪いですね。
そんな時にユーザー定義関数を作成しておくと便利です。
$textfile = "test.txt"
MsgBox(0, "test.txtの内容: ", _FileRead($textfile))
$textfile = "Autoit.txt"
MsgBox(0, "Autoit.txtの内容: ", _FileRead($textfile))
Func _FileRead($file)
Local $open = FileOpen($file)
Local $read = FileRead($open)
FileClose($open)
Return $read
EndFunc
関数内の変数のスコープ(作用範囲)
関数内の変数のスコープ(作用範囲)は2種類あります。
1つはローカル変数、もう1つはグローバル変数です。
ローカル変数は、関数内でのみ有効であり、関数外には影響しません。(例えば関数外に同名の変数がある場合など)
グローバル変数は、ローカル変数と違い、プログラム中のすべての範囲で有効になります。
Global $Global = 100 ; グローバル変数 $Global の宣言。100を代入。
MsgBox(0, "", " 関数_Aのローカル変数の値:" & _A() & @LF & " 関数_Bのローカル変数の値:" & _B() & @LF & " 関数_Cのローカル変数の値:" & _C() & @LF & " グローバル変数$Globalの値:" & $Global)
; & で文字列を連結,@LF は改行(ラインフィード)
Func _A()
Local $Global
$Global += 10 ; ローカル変数の値に10を足します。
Return $Global ; ローカル変数の値を返します。
EndFunc ;==>_A
Func _B()
Local $Local
$Local = 2 ^ 4 ; 16
$Global -= $Local ; グローバル変数から関数_B のローカル変数の値を引きます。
Return $Local
EndFunc ;==>_B
Func _C()
Local $Local
$Local += 30 ; ローカル変数の値に 30を足します。
Return $Local ; ローカル変数の値を返します。
EndFunc ;==>_C
関数 _A では グローバル変数 $Global と同名のローカル変数 $Global を使用していますが、グローバル変数 $Global に影響はありません。
関数 _B と _C では同じローカル変数 $Local を使用しており、代入している値も違いますが、どちらの関数にも影響していません。
では、グローバル変数の $Global はどうでしょう?
関数_B 内で $Global から $Local の値を引いているので、初めに代入した $Global の値 100 は 84 に変更されていますね。
グローバル変数は、プログラム中のすべての範囲で有効になります。
コメント