Autoit 入門書

Autoit の基礎 – 関数とユーザー定義関数

関数

関数とは、引数ひきすうと呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群を言います。

AutoIt には元々組み込まれている関数が 200以上あり、AutoIt の愛好者が作成した UDF も大量にあります。

UDF とは、ユーザー定義関数(User Defined Function)を略したものです。

これらの関数以外に、繰り返し行うコードを簡略化するために、ユーザー自身が「ユーザー定義関数」を作成することができます。

ユーザー定義関数

引数と返し値を持つことのできる関数を、ユーザー自身が作成したものを「ユーザー定義関数」と言います。

キーワード:Func…Return…EndFunc

ユーザー定義関数の形式は次のようになります。

Func autoit("パラメータ1","パラメータ2", ....); 「autoit」の部分は関数の名前を指定します。

コード....

Return

EndFunc

Return句 で返し値を指定できます。

ユーザー定義関数内で Return句を使用すると、関数はそこで終了します。

その際に返し値を指定しない場合は「0」を返します。

次のように関数内で関数定義をすることはできません。

Func max($x, $y)
Func min($x, $y)

EndFunc
EndFunc

例えば、「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 に変更されていますね。

グローバル変数は、プログラム中のすべての範囲で有効になります。

コメント