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

AutoHotKey Căn bản về Array

Thảo luận trong 'AutoHotkey' bắt đầu bởi DuyMinh, 21/7/18.

  1. DuyMinh

    DuyMinh Thành viên năng động
    • 28/34

    Tham gia ngày:
    14/3/17
    Bài viết:
    177
    Đã được thích:
    92
    Note: Người viết bài là người chỉ học lập trình vì đam mê, và không có chuyên sâu, nên nếu dùng những từ chuyên môn sai thì ae cũng đừng trách nhé.

    I. Giới thiệu:

    - Vấn đề chính trong AHK thì Array chính là Object, mà không phải Object nào cũng là Array... :p
    - Array trong AHK cũng có nhiều loại, căn bản nhất thì đó là Simple Array(aka Indexed Array - Giống y chang bên AutoIT) và Associative Arrays (Mảng liên hợp, khai báo giống Object bên AutoIT)
    Mã (AutoIt):

    ; Khai báo Simple Array, có 2 cách:
    ; Cách 1: giống bên AutoIT
    aArray1 := [1, "DuyMinh", 3.47, True]
    ; Cách 2: Sử dụng hàm built-in Array   ---   <Tên Array> := Array(value1, ..., valuen)
    aArray1 := Array(1, "DuyMinh", 3.47, True)

    ; Lấy giá trị từ simple Array, đương nhiên là cứ như bình thường rồi...:p
    ; Nói thêm 1 tẹo, mảng bắt đầu từ 1, không như bên AutoIT là 0
    Value := aArray1[2] -> Output: DuyMinh

    ; Thế thì gán giá trị vào array thì như lào, đương nhiên là ngược lại thôi. :D
    aArray1[2] := "Duy Handsome" ; => Đùa thôi =]]

    ; Tiếp tục là thêm giá trị vào 1 vị trí trên mảng, ta sử dụng .InsertAt, bắt đầu giống Object rồi đấy...
    aArray1.InsertAt(2, "Ta là thứ 2", "Vây t thứ 3") ; => Thêm 2 giá trị vào vị trí thứ 2 và 3 => đẩy vị trí thứ 2 lúc đầu là "DuyMinh" lên vị trí thứ 4
    ; Vậy mảng ta có được hiện tại sẽ là:
    ; aArray1 := [1, "Ta là thứ 2", "Vậy t thứ 3", "DuyMinh", 3.47, True]
    ; Đương nhiên mấy thứ này hiểu là chính, cũng ít khi áp dụng lắm...

    ; Tương tự như trên, thêm vào cuối t dùng .push
    aArray1.Push("Giá trị 1", "Giá trị 2", v.v...)

    ; Vậy xóa giá trị trong mảng? Ta dùng .RemoveAt(Index) và .Pop()
    aArray1.RemoveAt(1) ; Remove vị trí thứ 1
    aArray1.Pop() ; Remove giá trị cuối cùng của Array

    ; Ngoài ra để lấy số phần tử của mảng thì ta dùng: .MaxIndex() hoặc .Length()
    Msgbox % aArray1.MaxIndex() ; => Output: 6

    ; Cái MaxIndex() nhìn là hiểu sử dụng ở trong vòng lặp rồi.
    ; Bên AutoIT thì muốn tạo vòng lặp đi từ đầu mảng tới cuối mảng, ta sử dụng
    For $i = 0 to Ubound($aArray1) - 1
        Msgbox(0,0, $aArray1[$i])
    Next

    ; Thì bên AHK này, sẽ là:
    Loop % aArray1.MaxIndex() { ; Muốn sử dụng biểu thức thì phải có %, nhớ thím kakanet đã nói ở những bài trước nhé.
        Msgbox % aArray1[A_Index] ; => A_Index tương đương với $i đấy, số lần lặp hiện tại...
    }

    ; Hoặc có thể sử dụng for ... in (Cái này mình không rành lắm, toàn loop thôi)
    For index, value in aArray1
        MsgBox % "Giá trị thứ " index " của array là " value
     
    OK, đợi mình rảnh viết thêm về mảng liên hợp nhé, dạo này đi làm đêm bận quá... Cơ mà thường nếu không cần nâng cao thì mảng này đủ dùng rồi...
     
  2. PACMan

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

    Tham gia ngày:
    25/6/18
    Bài viết:
    14
    Đã được thích:
    0
    mình gà quá đọc ko hiểu nhiều lắm
     
  3. DuyMinh

    DuyMinh Thành viên năng động
    • 28/34

    Tham gia ngày:
    14/3/17
    Bài viết:
    177
    Đã được thích:
    92
    Nói sao nhỉ? Bạn có hay sử dụng array không? Ví dụ nhé, giả sử bạn cần lưu tên của 99 người... Không lẽ bạn phải tạo 99 biến đúng không? Chỉ với 1 mảng t có thể lưu được nhiều giá trị... Kiểu kiểu vậy đó... Còn ở trên chỉ là cách sử dụng mảng thôi. Hồi mình sẽ thêm vài ví dụ vào...
     
    Huân Hoàng thích bài này.
  4. Milli Master

    Milli Master ??
    • 93/113

    Tham gia ngày:
    9/7/16
    Bài viết:
    106
    Đã được thích:
    2,309
    Nơi ở:
    Thủ Đức, TP Hồ Chí Minh
    Cảm ơn bác @DuyMinh rất hay và chi tiết. Tiện thể, e đem cho mấy anh em đọc bài một câu hỏi hại não :rolleyes:
    Mình code ahk cũng một thời gian rồi và bây giờ mới thấy sự vi diệu của nó . Hoặc có thể là mình sai sót :D
    Code mẫu trong file doc của ahk về lệnh If...in
    Mã (Autohotkey):
    MyItemList:="1,2"
    var :="1"
    if var in %MyItemList%
        MsgBox %var% is in the list.
     
    Bạn để ý cái phần if var in %MyItemList%, cái MyItemList nó có ở trong dấu %, nhưng qua cái này thi khác :confused:
    Mã (Autohotkey):
    String:="Một,Hai,Ba,Bốn"
    Array:=["Hai","Bốn"]
    Loop % Array.Length()
        if Array[A_Index] in String
            MsgBox % Array[A_Index]
    Cái biến string không cần đặt trong dấu %, đặt vô thì báo lỗi ngay
    Ngoài ra còn có cái mình khó hiểu nữa
    Mã (Autohotkey):
    String:="Một,Hai,Ba,Bốn"
    Array:=["Hai,Bốn"]
    Loop % Array.Length()
        if Array[A_Index] in String
            MsgBox % Array[A_Index]
    Biến mảng Array bây giờ chỉ còn một phần tử theo mình hiểu thì chắc chắn nó sẽ không hiện Msgbox, nhưng không nó vẫn hiện như bình thường o_O. Mình sẽ cho các bạn xem khi cái biến Array không phải là mảng
    Mã (Autohotkey):
    String:="Một,Hai,Ba,Bốn"
    Array:="Hai,Bốn"
        if Array in String
            MsgBox % Array
    Wow bây giờ nó chạy đúng rồi nè @@. Như các bạn đã thấy, mấy cái vấn đề khó hiểu ở như trên xuất hiện khi mình dùng biến mảng.
    À một cái nữa là mình đăng comment này là để các bạn lưu ý khi code ahk, đôi khi sẽ có một số cái khó hiểu nhưng đừng lo, đây là một ngôn ngữ rất dễ học nên các bạn đừng có quan tâm ba cái tiểu tiết bé tẹo này làm chi. Bác @kakanet nếu thấy được thì chuyển cái vấn đề này sang phần: Những lưu ý khi code AutoHotKey
     
    Chỉnh sửa cuối: 22/7/18
    kakanet thích bài này.
  5. DuyMinh

    DuyMinh Thành viên năng động
    • 28/34

    Tham gia ngày:
    14/3/17
    Bài viết:
    177
    Đã được thích:
    92
    Mình sẽ giải thích theo cách hiểu của mình nhé, đầu tiên, vì sao phải có % ở MyItemList, vì ở đây AHK sẽ hiểu If đó là ở dạng thường mà không phải dạng biểu thức, vì var đứng riêng lẻ...
    Mã (AutoIt):

    MyItemList:="1,2"
    var :="1"
    if var in %MyItemList%
       MsgBox %var% is in the list.
     
    Dạng thường: If <Biến> In %<Biến>%
    => Nếu chuyển nó thành biểu thức thì sẽ không sử dụng % ở biến sau nữa...
    Mã (Text):
    If (<Biến>) In Biến
    => Code theo kiểu chuẩn của AHK sẽ đỡ bị nhầm lẫn nhiều thứ.
    Mã (AutoIt):

    MyItemList:="1,2"
    var :="1"
    if (var) in MyItemList
       MsgBox % var . "is in the list."
     
    > Như giải thích ở trên nên cái dưới String không cần % vì Array bản chất của nó đã là một biểu thức...


    Còn cái vấn đề này thì do bác hiểu sai về cái hàm if này của AHK thôi. Như em vừa đọc docs thì nó ra msgbox là chuẩn rồi...
    For example, if
    MatchList is set to ABC,XYZ then Var must contain either ABC or XYZ to cause a match.
    => Ở vấn đề trên nó bảo là chỉ cần Array[1] chứa "Hai" hoặc "Bốn" là nó sẽ đúng.

    Mã (AutoIt):
    String:="Một,Hai,Ba,Bốn"
    Array:=["Hai,Bốn"]
    Loop % Array.Length()
       if Array[A_Index] in String
           MsgBox % Array[A_Index]

    Thực ra là nó chạy sai là vì, như trên em đã nói, bác quên bọc % trong String hoặc là đóng ngoặc tròn cái (Array) lại nó mới đúng cú pháp của AHK :p
    Mã (AutoIt):
    String:="Một,Hai,Ba,Bốn"
    Array:="Hai,Bốn"
       if Array in %String%
           MsgBox % Array
    Mã (AutoIt):
    String:="Một,Hai,Ba,Bốn"
    Array:="Hai,Bốn"
       if (Array) in String
           MsgBox % Array
    Chốt lại toàn bộ vấn đề ở trên thì hầu hết là do sai cú pháp giữa kiểu truyền thống và kiểu biểu thức của AutoHotkey, vì vậy KHÔNG KHUYẾN KHÍCH sử dụng kiểu truyền thống trừ khi bắt buộc... như khi sử dụng lệnh chẳng hạn.
     
    Chỉnh sửa cuối: 22/7/18
    kakanet and Milli Master like this.
  6. Milli Master

    Milli Master ??
    • 93/113

    Tham gia ngày:
    9/7/16
    Bài viết:
    106
    Đã được thích:
    2,309
    Nơi ở:
    Thủ Đức, TP Hồ Chí Minh
    Cảm ơn bác đã giải thích. Giờ em sẽ chú ý hơn. À mà em đọc kĩ file help rồi mấy cái "between", "is", "in" và "contains" không hỗ trợ biểu thức nên không ra kết quả đúng
     
    Chỉnh sửa cuối: 27/7/18

Chia sẻ trang này

Đang tải...