1. Tải bản cài đặt AutoIT mới nhất

    Chào Khách. Nếu bạn mới tham gia và chưa cài đặt AutoIT.
    Vui lòng vào topic trên để tải bản AutoIT mới nhất nhé
    Dismiss Notice
  2. Quy định và nội quy

    Chào Khách. Vui lòng đọc kỹ nội quy và quy định của diễn đàn
    Để tránh bị ban một cách đáng tiếc nhé!
    Dismiss Notice
  3. Hướng dẫn chèn mã AutoIT trong diễn đàn

    Chào Khách. Vui lòng xem qua bài viết này
    Để biết cách chèn mã AutoIT trong diễn đàn bạn nhé :)
    Dismiss Notice

Hướng dẫn Cấu trúc rẽ nhánh trong AutoIt

Thảo luận trong 'Hướng dẫn - Bài tập căn bản' bắt đầu bởi Tungtata, 7/9/15.

  1. Tungtata

    Tungtata Tà tà mà sống ~ Thành viên BQT Administrator
    • 93/113

    Tham gia ngày:
    25/8/15
    Bài viết:
    285
    Đã được thích:
    910
    Nơi ở:
    Hà Nội
    - Phần đầu tiên của bài này là trả lời câu hỏi của bài Các Hàm Xuất Nhập
    Câu hỏi: Ở hộp thoại của InputBox() nếu bấm Cancel thì chuyện gì xảy ra, tại sao?
    Trả lời: Biến $var sẽ chứa chuỗi rỗng.
    Lý Do: Rất đơn giản và hiển nhiên, vì ý nghĩ của Cancel là không làm gì, nên dù có giá trị nhập vào cũng sẽ không được gán cho biến $var.

    Có vấn đề mới nảy sinh ở đây rùi: Làm sao tụi mình có thể nhận biết được khi nào thì Người Dùng bấm Ok và khi nào thì bấm Cancel để xử lý??? Nếu đã xem qua phần Return Value của Hàm InputBox() trong file Help, hẳn các bạn đã có câu trả lời của riêng mình, 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ó nhiều tình huống xảy ra, tương ứng với mỗi tình huống biến @error sẽ có một giá trị đại diện:
    - @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.
    Nếu các bạn quan tâm thì mình xin nói thêm khi @error=0 tức là bình thường, mọi thứ tốt đẹp.

    - Nhân tiện nói về @error mình xin giới thiệu về bọn Macro trong Autoit, 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, nên giờ để đó sau này tính.

    - 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ó 3 loại Cấu Trúc Rẽ Nhánh cơ bản, vấn đề ưu và nhược điểm của 3 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.

    Lưu ý: Bạn nên dùng từ điển để xem nghĩa các từ khóa có trong cấu trúc trước, như thế sẽ nắm bắt nội dung bài tốt hơn.

    1. If... Then...: Dạng 1Tải code mẫu ở dưới nhé
    - 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... được thêm vào 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.
    Mã (AutoIt):

    ;~ Đầu tiên là 1 Hàm nhập: InputBox()  
    $var=InputBox ("Tiêu đề..." ,"Mô tả..." ,"Lee Sai")

    ;~ 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)
     
    Nếu @error khác 1, cụ thể là bằng 0, 2, hoặc 3 thì thông báo với nội dung "Bạn đã bấm Cancel" sẽ không được xuất ra. Và đây là chức năng chính của cấu trúc If... Then...=>thực hiện hay không thực hiện một câu lệnh nào đó. Bên dưới là sơ đồ hoạt của cấu trúc If ở dạng 1, còn sơ đồ bên phải là dạng rút gọn của nó
    [​IMG]

    2. If... Then...: Dạng 2
    (Bài viết được đăng trên hocautoit.com, mong đọc giả vào xem ủng hộ Ban Biên Tập viết tiếp cho cộng đồng)
    Dạng 1 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....
    Mã (AutoIt):
     ;~ Đầu tiên là 1 Hàm nhập: InputBox()
    $var=InputBox ("Tiêu đề..." ,"Mô tả..." ,"Lee Sai")
    ;~ 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"
        ;... Bao nhiêu lệnh ở đây cũng được
    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)
    Từ khóa EndIf được xem là mốc đánh dấu sự kết thúc của cấu trúc If... Then.... Tất cả cấu trúc khác cũng sẽ có từ khóa đánh dấu sự kết thúc của riêng mình. Nhìn vào sơ đồ hoạt động của dạng này bạn sẽ thấy nó hoàn toàn giống với dạng 1, chỉ khác ở số lượng câu lệnh khi điều kiện Đúng.
    [​IMG]
    3. If... Then... Else...: Dạng Đơn
    Lại xét ví dụ ở dạng 2, 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:
    Mã (AutoIt):
     ;~ Đầ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 được dùng để xuất ra bằng 1 Hàm xuất: MsgBox()
        MsgBox (0 ,"Tên đã nhập" ,"Tên bạn là: " &$var &@CRLF &"Thông báo sẽ tự tắt trong 7 giây." ,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ác 1, trong đó có trường hợp @error=0 tức là bấm Ok. Tới đây mình xin lưu ý một điều quan trọng, đã gọi là Cấu Trúc thì khi dùng phải đúng với định dạng của nó, không đảo ngược lại Else ở trên If hoặc Else rồi mới tới Then, những kiểu thay đổi như thế có thể đúng về ngữ nghĩa nhưng sẽ làm cho câu lệnh chạy lung tung hoặc tệ hơn là gay ra lỗi chương trình.
    [​IMG]
    4. If... Then... Else...: Dạng Kép
    - Nếu bạn nào nghĩ dạng thứ 3 của If... Then... đã hoàn hảo cho trường hợp của tụi mình thì hãy nghĩ lại, vì biến @error không chỉ có giá trị 1 và 0 thôi. Và để giải quyết 1 lần cho gọn ta sẽ dùng dạng cuối cùng của If... Then... với từ khóa khác là ElseIF
    Mã (AutoIt):
     ;~ Đầ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..." ,"LeeSai!" ," 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 được dùng để xuất ra bằng 1 Hàm xuất: 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 sẽ tự tắt trong 7 giây." ,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ác 1 và 0) mình đã chỉ định thời gian đợi để nhập là 7 giây. Và trước đó là các biến được gán giá trị Default, một 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 đó.
    [​IMG]

    5. Switch...Case...: Dạng Chỉ Định
    - Với trường hợp của @error như trên thì cấu trúc Dạng Kép của If... Then... xử lý khá tốt, nhưng khi xét một biến có nhiều giá trị trả về thì sao, không lẽ chơi 1 đống If. Không... chúng ta sẽ dùng Switch...Case... cấu trúc thứ 2 của Cấu Trúc Rẽ Nhánh.

    Mã (AutoIt):
     ;~ Đầ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..." ,"LeeSai!" ," M7" ,Default ,Default ,Default ,Default ,7)
    Switch  @error
        Case  0
            ;~ Giá trị nhập vào được dùng để xuất ra bằng 1 Hàm xuất: MsgBox()...
            MsgBox (0 ,"Tên đã nhập" ,"Tên bạn là: " &$var &@CRLF &"Thông báo sẽ tự tắt trong 7 giây." ,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  
    - Tương ứng với mỗi từ khóa Case sẽ là một giá trị của @error và để chỉ tất cả những trường hợp khác ta dùng từ khóa Case kết hợp với Else (Case Else). Ví dụ này có kết quả hoàn toàn giống với ví dụ trước, cách hoạt động cũng thế nên không cần bàn gì thêm cả.
    [​IMG]

    6. Switch...Case...: Dạng Khoanh Vùng
    - Mở rộng cấu trúc này ra tý với một ví dụ mới 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é.
    Mã (AutoIt):
     $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  
    - Bạn thấy đấy trong thực tế đôi khi ta không thể biết chính xác được người dùng sẽ nhập gì vào hay nói khác hơn là không biết giá trị trả về là bao nhiêu, nhưng ta có thể khoanh vùng giá trị để thực hiện câu lệnh cần thiết.

    7. Select...Case...
    - Sơ đồ hoạt động của dạng này giống như của Switch. Đây là cấu trúc phức tạp nhất trong bài này, điều đó đồng nghĩa với việc đây là cái tốt nhất. Vì nó có thể giải quyết tất cả những trường hợp của những cấu trúc ở trên và còn hơn thế nữa. Nó cho phép kiểm tra nhiều biến cùng một lúc, không như Switch...Case... chỉ cho phép 1 biến, ngoài ra nó còn phép dùng các toàn tử And Or để tạo ra hiệu ứng Khoanh Vùng và Chỉ Định nhiều giá trị cùng lúc trong 1 Case. Nói nhiều không bằng xem ví dụ đâu:
    Mã (AutoIt):
     $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 ;Kiểm tra giá trị của $var
            MsgBox (0 ,"Khoanh Vùng" ,"Bạn đã nhập Chuỗi hoặc số 0")
    EndSelect  
    - Về cơ bản thì chừng này lý thuyết sẽ đủ cho tụi mình dùng những cấu trúc này rồi. Khi đi thực tế chắc chắn sẽ nãy sinh nhiều vấn đề khác lúc đó thì tùy trường hợp chúng ta sẽ có những cách giả quyết khác nhau. Bắt đầu khó hơn rùi đây



    Nguồn bài viết: LeeSai - Forum hocautoit.com
     
  2. MsIvy1203

    MsIvy1203 Thành viên mới
    • 1/6

    Tham gia ngày:
    28/2/19
    Bài viết:
    2
    Đã được thích:
    0
    bác ơi, trong câu đầu bài viết bác có nhắc đến:

    "- Phần đầu tiên của bài này là trả lời câu hỏi của bài Các Hàm Xuất Nhập"

    Em search Google hoài không ra bài trước đó của bài này, nên các phần trước đó chưa được học, bác có thể cho em xin link bài trước được không ak?

    Thanks bác nhiều.

    -------------------------------------------

    Trước bài này của bác thì em đang học dở ở đây: https://autoitvn.com/threads/tutorial-autoit-basic-for-beginer.1098/

    -------------------------------------------
    Edit, mình đã tìm lại được nguồn: https://web.archive.org/web/20140414203605/http://hocautoit.com/forum/cac-ham-xuat-nhap
     
    Chỉnh sửa cuối: 1/3/19

Chia sẻ trang này

Đang tải...