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 Những lưu ý khi code AutoHotKey - Cập nhật đều đặn

Thảo luận trong 'AutoHotkey' bắt đầu bởi kakanet, 24/7/17.

  1. kakanet

    kakanet Thành viên năng động
    • 43/45

    Tham gia ngày:
    24/2/16
    Bài viết:
    203
    Đã được thích:
    211
    Mình sẽ cập nhật đều đặn những lưu ý mới từ kinh nghiệm của mình cũng như của các bạn đóng góp trong Topic này hen. Từ đó sẽ giúp mọi người tránh những lỗi thường gặp khi code AHK ^^


    1 - Khi định nghĩa một hàm: khi gán giá trị mặc định cho một tham số của hàm đó, ta lưu ý: both = and := are supported. The latter is recommended for consistency with expression assignments ( := ) and compatibility with future versions of AutoHotkey.

    2 - Lệnh và Hàm: Trong AutoIt thì không có Lệnh mà chỉ có Hàm. Còn AutoHotKey thì ngoài Hàm còn có lệnh, ví dụ Xuất ký tự ở vị trí từ 3 đến 5 của chuỗi sau:
    Mã (AutoIt):
    InputVar := "abcdefgh"
    ;Lệnh:
    StringMid, OutputVar, InputVar, 5, 3
    MsgBox 0, Lệnh, % OutputVar              
    ;Hàm:
    OutputVar := SubStr(InputVar, 5, 3)
    MsgBox 0, Hàm, % OutputVar                  
    Ta sẽ được vài lưu ý sau:
    + Lệnh KHÔNG TRẢ VỀ GIÁ TRỊ, mà giá trị trả về sẽ được gán ở biến nằm sau lệnh:​
    StringMid, OutputVar, InputVar, 5, 3 ---> Giá trị trả về OutputVar nằm sau StringMid (do AutHotKey quy định) chứ không phải là OutputVar := StringMid....

    + Lệnh trong AutoHotKey thường KHÔNG TUÂN THEO QUY LUẬT của Hàm tương ứng với nó, ví dụ:​
    Lệnh StringMid bắt buộc InputVar PHẢI LÀ một biến, chứ không đặt thẳng Chuỗi vào được:
    InputVar := "13456"
    StringMid, OutputVar, InputVar, 5, 3
    chứ không thể là: StringMid, OutputVar, "123456", 5, 3 ---> sẽ báo lỗi.
    Vì vậy cần đọc kỹ file Help để tránh những lỗi này.​

    3 - Khi khai báo String cho một Lệnh, lấy ví dụ Msgbox ở dạng truyền thống, nếu String có chứa dấu phẩy (,) thì ta phải làm sao ? Dấu phẩy đó sẽ gây cho AutoHotKey nhầm lẫn giữa String và dấu phân cách giữa các tham số của Lệnh:
    MsgBox 0, Lệnh,, 123
    Mình muốn hiện MsgBox có Title là Lệnh, (string gồm Lệnh và dấu phẩy) và giá trị là 123 nhưng nó chỉ hiện Title là Lệnh và giá trị là rỗng, đó là do AHK hiểu nhầm dấu phẩy của Lệnh, là dấu phân cách tham số, ta sẽ có 2 cách để sửa vấn đề này:
    + Thêm một dấu ` đằng trước dấu , để AHK hiểu rằng đó là String: MsgBox 0, Lệnh`,, 123
    + Dùng dấu % để chuyển đổi sang dạng biểu thức: MsgBox 0, % "Lệnh,", 123

    4 - Mảng bắt đầu từ phần tử 1 chứ không phải từ phần tử 0 như AutoIt, một số Biến Built-in cũng vậy, ví dụ:
    Loop {
    MsgBox % A_Index
    }
    thì A_Index cũng bắt đầu từ 1

    5 - Mệnh đề If: Biến bên vế trái KHÔNG được khai báo nằm giữa 2 dấu % (kiểu truyền thống), ví dụ:

    var1 := 10
    var2 := 5

    If %var1% > %var2% => SAI cấu trúc
    If var1 > %var2% => Đúng cấu trúc
    If var1 > var2 => Đúng cấu trúc nhưng sai Logic vì var2 ở đây là chuỗi var2 chứ không phải là 5
    If (var1 > var2) => Đúng cấu trúc và Logic (2 dấu ngoặc đơn biến khai báo If thành dạng biểu thức)

    6 - Không cần khai báo trước một biến: biến chưa từng khai báo nhưng lại sử dụng thì AHK tự hiểu biến đó mặc định ban đầu là rỗng. Điều này khá tiện nhưng đôi lúc sẽ gây hiệu ứng ngược làm sai logic nên cần chú ý chút khi code.
    Ví dụ AutoIt:
    For $i = 0 to 10
    $String &= $i
    Next
    => Báo lỗi ngay vì $String chưa từng khai báo trước đó. Còn AutoHotKey code vẫn chạy bình thường với biến String ban đầu tự nó khai báo là rỗng.

    7 - Các ký hiệu xuống dòng tương ứng giữa 2 ngôn ngữ: @LF <=> `n , @CR <=> `r , @CRLF <=> `r`n

    8 - Variadic Functions: Cái này khá hay, AutoIt phải xách dép cho nó ^^
    Ví dụ trong AutoIt phải viết hàm khai báo mệt bở hơi tai:
    Func A(v1, v2, v3, v4, v5, v6, v7)
    Return (v1 + v2 + v3 + v4 + v5 + v6 + v7)
    EndFunc
    MsgBox(0, '', A(1,2,3,4,5,6,7))
    Còn AHK thì chỉ cần viết 1 Variadic Function như sau:

    A(v*) {
    Return (v[1] + v[2] + v[3] + v[4] + v[5] + v[6] + v[7])
    }
    MsgBox % A(1,2,3,4,5,6,7)
    Dấu * biến tham số v thành một mảng tham số không giới hạn và bên trong Hàm ta sử dụng bao nhiêu phần tử của v cũng được. Nhắc lại là mảng trong AHK bắt đầu từ phần tử 1 nha.
    https://www.autohotkey.com/docs/Functions.htm#Variadic
     
    Chỉnh sửa cuối: 24/7/17
    Milli Master and DuyMinh like this.
  2. kakanet

    kakanet Thành viên năng động
    • 43/45

    Tham gia ngày:
    24/2/16
    Bài viết:
    203
    Đã được thích:
    211
    @DuyMinh Trong quá trình học code AHK cậu rút ra được bất cứ kinh nghiệm nào, dù nhỏ đi nữa, thì cmt vào đây nha ^^ Thanks
     
    Chỉnh sửa cuối: 24/7/17
  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
    #Maxmem (Megabyte)
    Ví dụ:
    #Maxmem 256 ; 256mb cho 1 biến
    - Bạn có thể set giới hạn tối đa của 1 biến bằng MaxMem, mặc định của AHK là 64mb, có thể set lên max là 4095 và min là 1.
    - Mình quyết định qua AHK cũng vì nó, vì mình muốn làm soft get text, tầm 1k chương cũng hơn mặc định của AU3 là 32mb rồi... AHK là 1 lựa chọn tốt cho vấn đề này. :)) Mặc dù cũng có nhiều cách để giải quyết vụ giới hạn biến ở AU3.
     
  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
    anh @kakanet cho em hỏi trong nền soạn thảo SciTE4AutoHotkey có cái hotkey nào làm căng hàng cho ngay lại không
     
  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
    Không có bạn ợ... Mình cũng kiếm rồi mà không thấy...
    Bạn search keyword là: Tidy for AHK xem sao nhé.
     

Chia sẻ trang này

Đang tải...