Hàm là gì ?
Nói đơn giản, hàm là một chương trình con thực hiện một chức năng cụ thể nào đó trong chương trình chính.
Tại sao lại gọi là chương trình con ? Bởi vì trong quá trình viết một ứng dụng, tất nhiên sẽ có một vài đoạn chương trình được dùng đi dùng lại nhiều lần. Ví dụ như bạn cần hiển thị một hộp thoại chứa thông báo ra màn hình chẳng hạn. Bạn viết nó ở đầu chương trình để hiện thông báo bắt đầu chạy chương trình, đến cuối chương trình thì viết lại để hiện thông báo kết thúc chương trình. Bạn thử hình dung nếu có rất nhiều nơi trong chương trình chính của bạn muốn hiển thị thông báo ra màn hình thì cảm giác của bạn sẽ như thế nào !? Thật chán ngấy và phí thời gian khi phải ngồi gõ lại từng dòng lệnh cho một công việc là hiển thị thông báo ra màn hình, trong khi ta đã viết nó ở rất nhiều nơi trong chương trình rồi. Điều này làm cho công việc của bạn không hiệu quả, chương trình thì dài thêm và càng rối mắt.
Để giải quyết vấn đề này, các nhà tin học đã đưa ra một giải pháp. Đó là, chỉ viết đoạn mã xử lý công việc ở một nơi nào đó trong chương trình chính. Sau đó, đặt cho nó một cái tên, đưa cho nó các biến đại diện để tiếp nhận các dữ kiện cần xử lý và chỉ cho nó cách thức để trả về kết quả. Do đoạn mã này nằm bên trong chương trình chính, cho nên ta gọi nó là chương trình con (theo đúng nghĩa đen) hay còn gọi là hàm.
Và cuối cùng, khi muốn sử dụng một hàm bạn chỉ cần quan tâm đến cách thức để truyền dữ kiện cần xử lý cho nó và cách nó trả về một kết quả. Bạn không cần phải bận tâm là bên trong nó làm việc như thế nào, các dòng lệnh được viết ra sao. Bạn chỉ muốn có kết quả cuối cùng, hàm sẽ làm việc đó cho bạn.
Đối với AutoIt, thì để hiển thị một hộp thoại thông báo ra màn hình, AutoIt hỗ trợ cho bạn hàm MsgBox mà bạn đã từng thấy ở các ví dụ. Cũng xin nhắc lại với bạn một điều, sức mạnh của AutoIt nằm ở việc sử dụng các hàm được định nghĩa sẵn, cho nên nếu bạn muốn tạo một ứng dụng hiệu quả thì việc định nghĩa và gọi hàm là không thể thiếu.
Thông thường trong các ngôn ngữ khác (như Pascal) thì một hàm có trả về giá trị cụ thể thì vẫn gọi là hàm. Nhưng nếu hàm đó không trả về một giá trị nào cả, các lệnh bên trong chỉ xử lý những tác vụ mang tính “thủ tục” nên còn được gọi là thủ tục. Tuy nhiên, AutoIt không có khái niệm thủ tục, nên dù hàm có hay không trả ra giá trị thì ta vẫn gọi chung là hàm.
_Main()
Func _Main()
HotKeySet("{ESC}", "_Quit") ; press ESC to exit
While 1
$pos = MouseGetPos()
ToolTip("Mouse : " & $pos[0] & ", " &$pos[1] )
Sleep(10)
WEnd
EndFunc ;==>_Main
Func _Quit()
Exit
EndFunc ;==>_Quit
Phạm vi của một hàm
Trong AutoIt, mỗi hàm là một khối mã riêng biệt. Mã của một hàm chỉ thuộc riêng hàm đó và các câu lệnh trong bất cứ một hàm nào khác đều không thể truy cập đến nó được. Nói theo cách khác, các mã và dữ liệu được định nghĩa bên trong một hàm thì không thể tác động, ảnh hưởng đến các mã hay dữ liệu được định nghĩa bên trong một hàm khác, vì hai hàm có hai phạm vi khác nhau.
Các biến được định nghĩa bên trong một hàm thì được gọi là biến cục bộ (Local). Chúng được tạo ra khi hàm được nạp vào , và sẽ mất khi thoát hàm. Như vậy, một biến cục bộ không thể lưu trữ giá trị của nó giữa hai lần gọi hàm. Trong trường hợp bạn sử dụng một biến toàn cục (Global) bên trong hàm thì nội dung của biến toàn cục sẽ thay đổi, và giá trị của nó vẫn giữ nguyên sau khi hàm kết thúc.
Tất cả các hàm trong AutoIt đều có cùng tầm vực, cho nên bạn không thể định nghĩa một hàm bên trong một hàm khác.
ĐỊNH NGHĨA HÀM
Để định nghĩa một hàm, bạn phải tuân thủ các qui tắc mà ngôn ngữ lập trình đó hỗ trợ. Với AutoIt, dạng tổng quát để khai báo và định nghĩa một hàm như sau :
Func <tên_hàm>( <các tham biến> )
<các lệnh nội bộ>
. . . . .
Return <giá trị>
EndFunc
Giải thích
Func. . . EndFunc : là hai từ khóa bắt buộc, có nhiệm vụ chỉ ra điểm bắt đầu và kết thúc của một hàm
<tên_hàm> : tên đại diện miêu tả ngắn gọn chức năng của hàm
<các tham biến> : khai báo một danh sách tên các biến, mỗi biến được ngăn cách với nhau bằng dấu phẩy. Danh sách này sẽ nhận các dữ kiện được truyền vào để hàm xử lý. Một hàm có thể không có <các tham biến>, tức danh sách tham biến sẽ rỗng. Tuy thế, ngay cả khi không có tham biến nào thì bạn vẫn phải đặt dấu ngoặc đơn vào.
<các lệnh nội bộ> : ở đây bạn chính là thân của hàm. Bạn có thể thực hiện việc khai báo các biến cục bộ (Local), viết các biểu thức , . . . .
Return <giá trị> : tùy chọn, có thể có hoặc không. Nếu như bạn tạo một hàm có trả về một giá trị thì phần này được thêm vào, ngược lại thì không cần. Ví dụ như bạn định nghĩa hàm Sin(x) để tính sin của x, thì khi thực hiện các tính toán xong. Bạn dùng lệnh Return <giá trị> để trả về kết quả vừa tính được cho Sin(x).
Chú ý
Ø Khi khai báo <các tham biến>, bạn không cần đặt vào từ khóa chỉ phạm vi của biến. Theo mặc định, chúng luôn là cục bộ (local). Thậm chí nếu bạn có chỉ định Dim, Local hay Global thì cũng sẽ bị báo lỗi. Tuy nhiên, hai từ khóa Const, ByRef lại được phép đặt vào phía trước mỗi biến trong danh sách các tham biến để mở rộng chức năng của hàm (xem phần “Truyền dữ kiện cho hàm”).
Ø Lệnh Return có chức năng chính là chấm dứt ngay quá trình xử lý bên trong hàm và trả về <giá trị> cho hàm (nếu có). Theo mặc định, AutoIt luôn trả về giá trị cho một hàm. Nếu lệnh Return <giá trị> được dùng thì hàm sẽ trả về <giá trị>. Hàm trả về 0 (hoặc “ “ nếu dùng ở string) nếu Return không tồn tại hoặc Return được gọi mà không có phần <giá trị> theo sau.
Ví dụ
Đoạn mã sau thực hiện việc định nghĩa hàm _RepeatText để lặp lại n lần một chuỗi
$str = "abc"
$new_str = _RepeatText($str, 10, "")
MsgBox(0,"_RepeatText 1", "Source : " & $str & @CRLF & "New string : " & $new_str)
$str = "Love"
$new_str = _RepeatText($str, 5, " - ") ; ngăn cách chuỗi bằng " - "
MsgBox(0,"_RepeatText 2", "Source : " & $str & @CRLF & "New string : " & $new_str)
Func _RepeatText($string, $how_many, $delim)
; $string sẽ chứa chuỗi dữ kiện được truyền từ ngoài vào
; $how_many cho biết sẽ lặp lại bao nhiêu lần
; $delim chỉ định ký tự nào dùng để ngăn cách giữa hai chuỗi được lặp lại
Local $Rep_str =""
For $i=1 To $how_many
$Rep_str &= $string & $delim
Next
Return $Rep_str
EndFunc