Funkcje

edytuj

Func...EndFunc

edytuj

Funkcje w AutoIt są kawałkami kodu, który można wywołać, podając jego nazwę. Deklaruje się je pomiędzy Func a EndFunc.

Func nazwa_funkcji(<lista_argumentów>)
         ...
   <kod który funkcja ma wykonać>
         ...
EndFunc


Funkcje wykorzystuje się po to, by nie pisać kilkukrotnie identycznego kodu, ew. podobnego, ale o innych parametrach. Redukujemy w ten sposób rozmiar skryptu, co znacząco przyczynia się do jego uproszczenia.

Przykład:

Func test()   ;"test" to nazwa funkcji, nawiasy są obowiązkowe nawet gdy nie ma argumentów
   MsgBox(4,"Test","to jest MsgBox wywołany z funkcji")
EndFunc


W ten sposób zadeklarowaliśmy funkcję, po uruchomieniu programu jednak nic się nie dzieje. Aby wywołać funkcję wystarczy podać jej nazwę:

test()
Func test()
   MsgBox(4,"Test","to jest MsgBox wywołany z funkcji")
EndFunc


Nie ma znaczenia, gdzie deklarujemy funkcje. Dla wygody i czytelności programu najlepiej jest umieścić je na samym końcu kodu.

W nawiasie możemy umieścić parametry przekazywane do funkcji:

test("To jest przykład wykorzystania")
test("parametru funkcji, oczywiście")
test("funkcje nie służą tylko do wyświetlania")
test("prostych MsgBox'ów ;-)")
 
Func test($tekst)
   MsgBox(4,"Test",$tekst)
EndFunc

W ten prosty sposób, nie musimy powtarzać tego samego kawałku kodu (wyświetlanie MsgBox'a) - podaliśmy tylko parametr (w tym przypadku ciąg znaków), na których funkcja opiera swoje działanie. Oczywiście, funkcja może mieć więcej niż jeden parametr.

Prosta funkcja przedstawiająca sumę 2 parametrów:

dodaj(5,2)

Func dodaj($a,$b)
   $c = $a + $b
   MsgBox(4,"Suma: ", $c)
EndFunc


Możliwe jest utworzenie funkcji, do której w zależności od potrzeb możemy przekazywać różne ilości parametrów. Konieczne jest wtedy zadeklarowanie domyślnej wartości parametrów, które są opcjonalne. Ilość przekazanych do funkcji parametrów możemy odczytać za pomocą makra @NumParams.

Przykład (wypisuje ilość parametrów przekazanych do funkcji):

test()                  ;wypisze liczbę 0
test(1)                 ;wypisze liczbę 1
test(1,1)               ;wypisze liczbę 2
test(5,6,7)             ;wypisze liczbę 3

Func test($1=0,$2=0,$3=0)
   MsgBox(4,"Ilość parametrów",@NumParams)
EndFunc

Domyślne wartości funkcji mogą być zadeklarowane jako wyrażenie:

test()      ;wyświetli 0
test(1)     ;wyświetli 2
test(1,1)   ;wyświetli 4
test(1,1,1) ;wyświetli 3

Func test( $a=0, $b=0, $c=$a+$b)
   MsgBox( 0, "", $a+$b+$c)
EndFunc

Należy jednak zachować ostrożność, gdyż pozornie identyczna funkcja:

Func test( $c=$a+$b, $a=0, $b=0)
   MsgBox(0,"",$a+$b+$c)
EndFunc

spowoduje wystąpienie błędu. Wynika to z kolejności przypisywania wartości parametrom. Przypisywanie odbywa się od lewej strony nawiasu do prawej. W momencie przypisywania wartości parametrowi $c nie jest jeszcze znana wartość $a i $b.


UWAGA: Próba przekazania do funkcji większej ilości parametrów niż zadeklarowana spowoduje wystąpienie błędu.


Return

edytuj

Funkcja może również być wykorzystana do zwrócenia określonej wartości. Służy do tego komenda Return.

W tym przykładzie funkcja zwraca dzisiejszą datę w formacie mm/dd/yyyy:

MsgBox(1, "aktualna data", dzis())

Func dzis()
   Return (@MON & "/" & @MDAY & "/" & @YEAR)
EndFunc

Return ma podwójne działanie:

- natychmiastowe opuszczenie funkcji

- zwrócenie przez funkcję podanej wartości. Jeżeli po Return nie podamy żadnej wartości, to zwrócone będzie 0.

Jeżeli w definicji funkcji nie będzie użyte Return, to zakończenie działania funkcji nastąpi po osiągnięciu EndFunc, a funkcja zwróci 0.


Parametry przekazywane do funkcji oraz wartości zwracane przez funkcję mogą być także typu tablicowego np.(funkcja zwraca tablicę utworzoną z przekazanych do niej parametrów, przy czy parametr drugi i trzeci są opcjonalne):

Func tablica($1,$2=0,$3=0)
   Local $tab[3]=[$1,$2,$3]
   Return $tab
EndFunc

W tym przypadku w wywołaniu funkcji możemy pominąć tylko końcowe parametry, te którym nadano domyślne wartości.


Default

edytuj

Jeżeli chcemy aby domyślne wartości mogły przyjąć dowolne parametry należy użyć słowa kluczowego Default, a domyślne wartości parametrów zdefiniować wewnątrz funkcji:

MyFunc(Default,Default,Default)         ;wyświetli Jeden Dwa Trzy
MyFunc(Default,Default,"Pięć")          ;wyświetli Jeden Dwa Pięć
MyFunc(Default,"Pięć",Default)          ;wyświetli Jeden Pięć Trzy

Func MyFunc($Param1 = Default, $Param2 = Default, $Param3 = Default)
   If $Param1 = Default Then $Param1 = 'Jeden'
   If $Param2 = Default Then $Param2 = 'Dwa'
   If $Param3 = Default Then $Param3 = 'Trzy'
   MsgBox(0, 'Parametr', $Param1 & @LF & $Param2 & @LF & $Param3)
EndFunc


IsKeyword

edytuj

Powyższy przykład można także zrealizować z przy użyciu zdefiniowanej w języku funkcji IsKeyword. Funkcja ta zwraca wartość 1 gdy argument ma wartość Default lub 2 gdy Null (dla innych wartości argumentu zwraca 0):

MyFunc(Default,Default,Default)         ;wyświetli Jeden Dwa Trzy
MyFunc(Default,Default,"Pięć")          ;wyświetli Jeden Dwa Pięć
MyFunc(Default,"Pięć",Default)          ;wyświetli Jeden Pięć Trzy

Func MyFunc($Param1 = Default, $Param2 = Default, $Param3 = Default)
   If IsKeyword($Param1)=1 Then $Param1 = 'Jeden'
   If IsKeyword($Param2)=1 Then $Param2 = 'Dwa'
   If IsKeyword($Param3)=1 Then $Param3 = 'Trzy'
   MsgBox(0, 'Parametr', $Param1 & @LF & $Param2 & @LF & $Param3)
EndFunc


ByRef, Const

edytuj

Parametry przekazywane do funkcji mogą być zadeklarowane poleceniem ByRef lub Const.

Const oznacza, że parametr jest stałą i nie może być zmieniony wewnątrz funkcji.

ByRef oznacza, że ewentualne działania wewnątrz funkcji będą wykonywane bezpośrednio na zmiennej przekazywanej do funkcji, a nie na jej kopi. Może to znacznie przyśpieszyć działanie programu, zwłaszcza przy operowaniu na dużych zmiennych tablicowych. Dodatkowo ByRef jest stosowana dla obsługi obiektów ActiveX. W takim przypadku także przyśpiesza to działanie programu, równocześnie nie powoduje zwiększenia zapotrzebowania na pamięć RAM.

Przykład:

Dim $a=1, $b=1
test($a,$b)

MsgBox(64, "Test", "$a = " & $a & @LF & "$b = " & $b)

Func test(ByRef $par1, $par2)
   $par1=2			;nastąpi także zmiana wartości zmiennej $a na 2
   $par2=2			;natomiast zmienna $b nie ulegnie zmianie
EndFunc

Jeżeli chcemy użyć ByRef dla drugiego lub dalszego parametru, to w definicji funkcji po przecinku musi być obowiązkowo spacja, w przeciwnym razie wystąpi błąd.

Przykład:

Func test1($par1, ByRef $par2) ;dobrze
   ;treść funkcji test1
EndFunc

Func test2($par1,ByRef $par2) ;błąd
   ;treść funkcji test2
EndFunc


W AutoIt nie ma rozróżnienia (jak np. w Pascalu) między funkcją, a procedurą.

Każda funkcja może być wywołana w sposób proceduralny, tzn. bez zwracania wartości:

suma(2,5)            ;wywołanie proceduralne (bez zwracania wartości)
$liczba=suma(2,5)    ;wywołanie funkcyjne (ze zwróceniem wartości)
 
Func suma($a,$b)
   Local $suma
   $suma=$a+$b
   MsgBox(,"Suma wynosi",$suma)
   Return $suma
EndFunc

Pierwsze wywołanie funkcji spowoduje wyświetlenie komunikatu, drugie dodatkowo przypisze zmiennej $liczba wartość zwróconą przez tę funkcję.