1 AutoIT - T2: Cấu trúc rẽ nhánh Mon Aug 22, 2011 3:56 pm
Trunks-Kun
Administrator
Nếu đã xem qua Return Value của Hàm InputBox() hẳn các bạn cũng đã biết cách nhận biết. Nhưng mình cũng sẽ nói lại cho nhưng bạn chưa kịp xem. Khi tụi mình bấm Cancel Hàm InputBox() được xem là hoạt động không thành công tức là Failure (Sau này tụi mình sẽ gọi tắt là False). Khi có tình huống False, Hàm sẽ thực hiện những công việc sau:
- Gán 1 chuỗi rỗng cho biến nhận ($var).
- Thực hiện gán giá trị cho @error.
Trong đó cái đáng chú ý nhất là @error. Tại sao lại cần có cái này? - Là vì Hàm InputBox() bị False không chỉ trong trường hợp bấm Cancel mà còn có những trường hợp sau:
- @error = 1: Nút Cancel được bấm.
- @error = 2: Hết thời gian đợi để bấm. (Timeout)
- @error = 3: Hộp thoại không được xuất hiện.
(Và nếu các bạn quan tâm thì mình xin nói thêm là khi @error = 0 tức là bình thường, mọi thứ đều tốt đẹp. )
Nhân tiện nói về @error mình xin giới thiệu về Macro, chúng là những biến đặc biệt của AutoIT. Dựa trên đặt điểm của giá trị mà Macro lưu trữ, AutoIT đã chia chúng ra làm 4 loại là: Related, Directory, System và Time. Tuy chúng không khó dùng, nhưng để giới thiệu hết thì mất thời gian lém... khi rãnh các bạn hãy xem qua bài Biến đặc biệt để xem chi tiết về chúng.
Giờ thì quay lại bài học thui Làm sao để nhận biết 3 trường hợp của biến @error? Câu trả lời ở ngay tiêu đề của bài: Cấu trúc rẽ nhánh. AutoIT có 4 loại Cấu Trúc Rẽ Nhánh cơ bản, vấn đề ưu và nhược điểm của 4 loại này mình xin bỏ qua vì nhận định cá nhân có thể không đúng, hơn nữa nó cũng không cần thiết phải nêu lên bởi trong quá trình sử dụng mỗi người sẽ có cách đánh giá của riêng mình. Bây giờ chúng ta sẽ đi từng ví dụ để biết cách sử dụng các Cấu Trúc Rẽ Nhánh này.
If... Then...
Ví dụ T2.1: Dạng 1
Mình sẽ sử dụng lại ví dụ ở bài trước, để các bạn dễ nắm bắt. Câu lệnh If...Then... ở giữa sẽ xuất ra 1 thông báo dạng MsgBox() bằng cách kiểm tra xem biến @error có bằng 1 hay không.
Ví dụ T2.2: Dạng 2
Trong ví dụ T2.1, If... Then... là dạng rút gọn và nó chỉ sử dụng được khi chỉ có 1 câu lệnh cần thực thi. Trong trường hợp có từ 2 câu lệnh trở lên thì tụi mình phải dùng thêm từ khóa EndIf, tức là dạng 2 của If... Then....
If...ElseIf...Else... Ví dụ T2.3: Dạng Đơn
Lại xét ví dụ T2.1, nếu như tụi mình bấm Cancel thì sẽ nhận được thông báo, nhưng thông báo kế tiếp vẫn hiện ra và điều này là không cần thiết khi ta đã Cancel. Tụi mình sẽ giải quyết vấn đề này bằng ví dụ sau:
Cấu trúc If...Then...Else... ở đây sẽ giúp ta kiểm soát các thông báo tốt hơn, bởi nó chỉ cho phép thông báo thứ 2 hiện ra khi @error không bằng 1, trong đó có trường hợp @error=0.
Ví dụ T2.4: Dạng Kép
Như các bạn thấy trong phần chú thích Code, mục đích của tụi mình là xác định xem Người Dùng bấm Ok hay Cancel, nhưng bạn nào tinh ý sẽ thấy rằng cấu trúc ở ví dụ T2.2 không đáp ứng được hoàn toàn yêu cầu đặt ra. Và cấu trúc Dạng Kép sẽ giải quyết được vấn đề đó.
Sử dụng thêm từ khóa ElseIf như 1 If thứ 2 sẽ giúp tụi mình đưa ra thêm 1 điều kiện nữa để thực thi 1 số câu lệnh nào đó, nhằm tăng độ chính xác khi thực thi câu lệnh.
Để thông báo thứ 3 xuất hiện (tức là @error không bằng 1 hoặc 0) mình đã chỉ định thời gian đợi để nhập là 7 giây. Và trước đó là các biến định dạng của hộp thoại được gán giá trị là Default, đây cũng là từ khóa đặc biệt của AutoIT, nó giúp ta bỏ qua biến cần được truyền vào của một Hàm nào đó.
Switch...Case... Ví dụ T2.5: Dạng Chỉ Định
Cũng như cấu trúc If...ElseIf...Else... ở dạng kép, nhưng cấu trúc này cho phép tụi mình đưa ra nhiều điều kiện hơn nữa, có thể nói là rất nhiều. Cách thức kiểm tra @error và kết quả thực thi của cấu trúc này cũng tương tự như ví dụ T2.4 nên mình không giải thích gì thêm.
Ví dụ T2.6: Dạng Khoanh Vùng
Để mô tả tốt dạng này tụi mình sẽ phải sữa lại code 1 chút và thêm 1 cấu trúc If... Then.... Đối tượng cần kiểm tra từ @error sẽ đổi thành $var.
Ở đây nếu Người Dùng nhập số 0 hoặc nhập Chuỗi Ký tự, chương trình sẽ đưa ra 1 thông báo rồi thoát luôn, tụi mình hãy xem điều đó thực hiện như thế nào nhé.
Ở dạng khoanh vùng của Switch...Case... chỉ cần giá trị của biến $var nằm trong vùng giới hạn của điều kiện nào (Case) thì các câu lệnh tương ứng sẽ được thực thi.
Và như các bạn thấy không nhất thiết phải có trường hợp của từ khóa Else cấu trúc mới hoạt động.
Select...Case... Ví dụ T2.7
Trong ví dụ này tụi mình có thể thấy cấu trúc rẽ nhánh Select...Case... không hề có sự ràng buộc vào biến mà nó kiểm tra, tức là có thể kiểm tra bao nhiêu biến tùy thích.
Để có được tính năng khoanh vùng kiểm tra như của cấu trúc Switch...Case..., ta chỉ việc dùng toán tử And cho 2 biểu thức so sánh như trong ví dụ là được.
Nguồn: leesai.co.cc
- Gán 1 chuỗi rỗng cho biến nhận ($var).
- Thực hiện gán giá trị cho @error.
Trong đó cái đáng chú ý nhất là @error. Tại sao lại cần có cái này? - Là vì Hàm InputBox() bị False không chỉ trong trường hợp bấm Cancel mà còn có những trường hợp sau:
- @error = 1: Nút Cancel được bấm.
- @error = 2: Hết thời gian đợi để bấm. (Timeout)
- @error = 3: Hộp thoại không được xuất hiện.
(Và nếu các bạn quan tâm thì mình xin nói thêm là khi @error = 0 tức là bình thường, mọi thứ đều tốt đẹp. )
Nhân tiện nói về @error mình xin giới thiệu về Macro, chúng là những biến đặc biệt của AutoIT. Dựa trên đặt điểm của giá trị mà Macro lưu trữ, AutoIT đã chia chúng ra làm 4 loại là: Related, Directory, System và Time. Tuy chúng không khó dùng, nhưng để giới thiệu hết thì mất thời gian lém... khi rãnh các bạn hãy xem qua bài Biến đặc biệt để xem chi tiết về chúng.
Giờ thì quay lại bài học thui Làm sao để nhận biết 3 trường hợp của biến @error? Câu trả lời ở ngay tiêu đề của bài: Cấu trúc rẽ nhánh. AutoIT có 4 loại Cấu Trúc Rẽ Nhánh cơ bản, vấn đề ưu và nhược điểm của 4 loại này mình xin bỏ qua vì nhận định cá nhân có thể không đúng, hơn nữa nó cũng không cần thiết phải nêu lên bởi trong quá trình sử dụng mỗi người sẽ có cách đánh giá của riêng mình. Bây giờ chúng ta sẽ đi từng ví dụ để biết cách sử dụng các Cấu Trúc Rẽ Nhánh này.
If... Then...
Ví dụ T2.1: Dạng 1
- Code:
;~ Đầu tiên là 1 Hàm nhập: InputBox()
$var = InputBox("Tiêu...(title)","Mô tả...(prompt)","Giá trị mặc định (default)")
;~ Kiểm tra xem có bấm Cancel không, bằng cách kiểm tra giá trị của @error
If @error=1 Then MsgBox(0,"Dạng 1","Bạn đã bấm Cancel")
;~ Giá trị nhập vào, được dùng để xuất ra bằng 1 Hàm xuất: MsgBox()
MsgBox(0,"Tiêu đề Hàm xuất (title)","Nội dung xuất (text): "&$var)
Mình sẽ sử dụng lại ví dụ ở bài trước, để các bạn dễ nắm bắt. Câu lệnh If...Then... ở giữa sẽ xuất ra 1 thông báo dạng MsgBox() bằng cách kiểm tra xem biến @error có bằng 1 hay không.
Ví dụ T2.2: Dạng 2
Trong ví dụ T2.1, If... Then... là dạng rút gọn và nó chỉ sử dụng được khi chỉ có 1 câu lệnh cần thực thi. Trong trường hợp có từ 2 câu lệnh trở lên thì tụi mình phải dùng thêm từ khóa EndIf, tức là dạng 2 của If... Then....
- Code:
;~ Đầu tiên là 1 Hàm nhập: InputBox()
$var = InputBox("Tiêu...(title)","Mô tả...(prompt)","Giá trị mặc định (default)")
;~ Kiểm tra xem có bấm Cancel không, bằng cách kiểm tra giá trị của @error
If @error=1 Then
___MsgBox(0,"Dạng 2","Bạn đã bấm Cancel"&@LF&'Biến $var sẽ bằng "LS"')
___$var="LS"
EndIf
;~ Giá trị nhập vào, được dùng để xuất ra bằng 1 Hàm xuất: MsgBox()
MsgBox(0,"Tiêu đề Hàm xuất (title)","Nội dung xuất (text): "&$var)
If...ElseIf...Else... Ví dụ T2.3: Dạng Đơn
Lại xét ví dụ T2.1, nếu như tụi mình bấm Cancel thì sẽ nhận được thông báo, nhưng thông báo kế tiếp vẫn hiện ra và điều này là không cần thiết khi ta đã Cancel. Tụi mình sẽ giải quyết vấn đề này bằng ví dụ sau:
- Code:
;~ Đầu tiên là 1 Hàm nhập: InputBox() - chỉ nhập tối đa 7 ký tự
$var = InputBox("Nhập Tên","Hãy nhập tên của bạn vào","LeeSai!"," M7")
;~ Kiểm tra @error là Ok hay Cancel
If @error=1 Then
___MsgBox(0,"Dạng Đơn","Bạn đã bấm Cancel")
Else
___;~ Giá trị nhập vào...: MsgBox() 0 chỉ hiển thị trong 7 giây
___MsgBox(0,"Tên đã nhâp","Tên bạn là: "&$var&@CRLF&"Thông báo...",7)
EndIf
Cấu trúc If...Then...Else... ở đây sẽ giúp ta kiểm soát các thông báo tốt hơn, bởi nó chỉ cho phép thông báo thứ 2 hiện ra khi @error không bằng 1, trong đó có trường hợp @error=0.
Ví dụ T2.4: Dạng Kép
Như các bạn thấy trong phần chú thích Code, mục đích của tụi mình là xác định xem Người Dùng bấm Ok hay Cancel, nhưng bạn nào tinh ý sẽ thấy rằng cấu trúc ở ví dụ T2.2 không đáp ứng được hoàn toàn yêu cầu đặt ra. Và cấu trúc Dạng Kép sẽ giải quyết được vấn đề đó.
- Code:
;~ Đầu tiên là 1 Hàm nhập: InputBox() - chỉ nhập tối đa 7 ký tự
$var = InputBox("Nhập Tên","Hãy..."," M7",Default,Default,Default,Default,7)
;~ Kiểm tra @error là Ok hay Cancel
If @error=1 Then
___MsgBox(0,"Dạng Kép","Bạn đã bấm Cancel")
ElseIf @error=0 Then
___;~ Giá trị nhập vào...: MsgBox() 0 chỉ hiển thị trong 7 giây
___MsgBox(0,"Tên đã nhâp","Tên bạn là: "&$var&@CRLF&"Thông báo...",7)
Else
___MsgBox(0,"Dạng Kép","Có lỗi nhập")
EndIf
Sử dụng thêm từ khóa ElseIf như 1 If thứ 2 sẽ giúp tụi mình đưa ra thêm 1 điều kiện nữa để thực thi 1 số câu lệnh nào đó, nhằm tăng độ chính xác khi thực thi câu lệnh.
Để thông báo thứ 3 xuất hiện (tức là @error không bằng 1 hoặc 0) mình đã chỉ định thời gian đợi để nhập là 7 giây. Và trước đó là các biến định dạng của hộp thoại được gán giá trị là Default, đây cũng là từ khóa đặc biệt của AutoIT, nó giúp ta bỏ qua biến cần được truyền vào của một Hàm nào đó.
Switch...Case... Ví dụ T2.5: Dạng Chỉ Định
- Code:
;~ Đầu tiên là 1 Hàm nhập: InputBox() - chỉ nhập tối đa 7 ký tự
$var = InputBox("Nhập Tên","Hãy..."," M7",Default,Default,Default,Default,7)
;~ Kiểm tra @error là Ok hay Cancel
Switch @error
___Case 0
______;~ Giá trị nhập vào...: MsgBox() 0 chỉ hiển thị trong 7 giây
______MsgBox(0,"Tên đã nhâp","Tên bạn là: "&$var&@CRLF&"Thông báo...",7)
___Case 1
______MsgBox(0,"Dạng Kép","Bạn đã bấm Cancel")
___Case Else
______MsgBox(0,"Dạng Kép","Có lỗi nhập")
EndSwitch
Cũng như cấu trúc If...ElseIf...Else... ở dạng kép, nhưng cấu trúc này cho phép tụi mình đưa ra nhiều điều kiện hơn nữa, có thể nói là rất nhiều. Cách thức kiểm tra @error và kết quả thực thi của cấu trúc này cũng tương tự như ví dụ T2.4 nên mình không giải thích gì thêm.
Ví dụ T2.6: Dạng Khoanh Vùng
Để mô tả tốt dạng này tụi mình sẽ phải sữa lại code 1 chút và thêm 1 cấu trúc If... Then.... Đối tượng cần kiểm tra từ @error sẽ đổi thành $var.
Ở đây nếu Người Dùng nhập số 0 hoặc nhập Chuỗi Ký tự, chương trình sẽ đưa ra 1 thông báo rồi thoát luôn, tụi mình hãy xem điều đó thực hiện như thế nào nhé.
- Code:
$var=InputBox("Nhập Số","Hãy nhập một số gì đó, trừ số 0 và Chuỗi",7," M7")
If $var=0 Then ;Kiểm tra giá trị của $var
___MsgBox(0,"Khoanh Vùng","Bạn đã nhập Chuỗi hoặc số 0")
___Exit ;Từ khóa để thoát chương trình
EndIf
Switch $var ;Kiểm tra biến $var
___Case -9999999 To -1
______MsgBox(0,"Khoanh Vùng","Bạn đã nhập số Âm")
___Case 1 To 9
______MsgBox(0,"Khoanh Vùng","Số có 1 chữ số")
___Case 10 To 99
______MsgBox(0,"Khoanh Vùng","Số có 2 chữ số")
___Case 100 To 999
______MsgBox(0,"Khoanh Vùng","Số có 3 chữ số")
___Case 1000 To 9999
______MsgBox(0,"Khoanh Vùng","Số có 4 chữ số")
___Case 10000 To 99999
______MsgBox(0,"Khoanh Vùng","Số có 5 chữ số")
___Case 100000 To 999999
______MsgBox(0,"Khoanh Vùng","Số có 6 chữ số")
___Case 1000000 To 9999999
______MsgBox(0,"Khoanh Vùng","Số có 7 chữ số")
EndSwitch
Ở dạng khoanh vùng của Switch...Case... chỉ cần giá trị của biến $var nằm trong vùng giới hạn của điều kiện nào (Case) thì các câu lệnh tương ứng sẽ được thực thi.
Và như các bạn thấy không nhất thiết phải có trường hợp của từ khóa Else cấu trúc mới hoạt động.
Select...Case... Ví dụ T2.7
Trong ví dụ này tụi mình có thể thấy cấu trúc rẽ nhánh Select...Case... không hề có sự ràng buộc vào biến mà nó kiểm tra, tức là có thể kiểm tra bao nhiêu biến tùy thích.
- Code:
$var=InputBox("Nhập Số","Hãy nhập một số gì đó, trừ số 0 và Chuỗi",2," M2")
Select
___Case @error=1 ;Kiểm tra xem có bấm Cancel không
______MsgBox(0,"Khoanh Vùng","Bạn đã bấm Cancel")
______Exit ;Từ khóa để thoát chương trình
___Case $var<0
______MsgBox(0,"Khoanh Vùng","Bạn đã nhập số Âm")
___Case ($var>0) And ($var<9)
______MsgBox(0,"Khoanh Vùng","Số có 1 chữ số")
___Case ($var>10) And ($var<99)
______MsgBox(0,"Khoanh Vùng","Số có 2 chữ số")
___Case $var=0
______MsgBox(0,"Khoanh Vùng","Bạn đã nhập Chuỗi hoặc số 0")
EndSelect
Để có được tính năng khoanh vùng kiểm tra như của cấu trúc Switch...Case..., ta chỉ việc dùng toán tử And cho 2 biểu thức so sánh như trong ví dụ là được.
Nguồn: leesai.co.cc