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 Hướng đối tượng trong AutoIt

Thảo luận trong 'Hướng dẫn - bài tập nâng cao' bắt đầu bởi wuuyi123, 22/1/18.

  1. wuuyi123

    wuuyi123 Thành viên
    • 13/23

    Tham gia ngày:
    18/6/16
    Bài viết:
    12
    Đã được thích:
    38
    - Nếu đã biết qua các ngôn ngữ lớn như C++, C#, Java, Python, PHP,... thì chắc chắn cũng biết gì gì đó (hoặc nghe sơ qua) về lập trình hướng đối tượng (Object-Oriented Programming - OOP). Nói thật thì bản thân tôi cũng chẳng biết lập trình hướng đối tượng là như thế nào :finger:, code C++ cứ toàn dùng hàm truyền thống mà làm tới. À mà sao tôi lại viết bài này, đúng là không hiểu được :D. Về tổng quan thì OOP giúp code đơn giản, dễ nhìn hơn, trừu tượng hóa mọi thứ, một khi đã code ra thì sẽ dễ tái sử dụng lại,... (tra thêm Google nhé).

    - Như tiêu đề, tôi sẽ hướng dẫn về OOP trong AutoIt. Chắc bạn sẽ nghĩ là AutoIt sẽ không có chức năng này, mà có cũng chả làm được gì... bla...bla. Ở đây sẽ là thư viện phụ trợ, nếu bạn đã từng sử dụng qua thì chắc cũng biết tới:
    + AutoItObject UDF: cái này thì mạnh nhưng nặng và kèm thêm dll (không có cũng được, nó sẽ load vào mem).
    + OOP Extender: cái này thì thực hơn, nhưng nó là mô phỏng và chỉ sử dụng được cho một file source đơn.
    + AutoItObject Internal: cái này tuy không đa năng nhưng nhanh, gọn nhẹ mà hiệu quả nên tôi chọn cái này.


    AutoItObject Internal
    Link: https://www.autoitscript.com/forum/topic/185720-autoitobject-pure-autoit
    Github: https://github.com/genius257/AutoIt-projects/tree/master/AutoItObject%20Internal
    Download: https://secufiles.com/5hn4/AutoItObjectPure.zip (có hướng dẫn tiếng Việt trong example)

    • Hàm chính:
    IDispatch()
    - Tạo ra một object, cho phép bạn tự do thêm vào các property và method.

    • Các method:
    __defineGetter(<"tên property">, <hàm>)
    - Định nghĩa method mới hoặc cho một property đã có kiểu Get-Accessor (dạng x(param)).

    __defineSetter(<"tên property">, <hàm>)
    - Định nghĩa method mới hoặc cho một property đã có kiểu Set-Accessor (dạng x = gì đó).

    __unset(<"tên property">)
    - Xóa một property đã khai báo trước đó.

    __lock()
    - Khóa object, các property chưa khai báo khi gọi sẽ bị lỗi.

    __keys()
    - Lấy tên tất cả các property đã định nghĩa.
    ..........


    Mã (AutoIt):
    #include "AutoItObject_Internal.au3"

    ; Khởi tạo object $Dog. Các tham số trong hàm IDispatch() đừng nên động tới.
    Global $Dog = IDispatch()

    ; Khởi tạo và gán giá trị cho property. Lưu ý, các property và method đều bắt buộc phân biệt chữ in hoa và chữ thường.
    $Dog.Name = "The Super Dog"
    $Dog.Weight = 30
    $Dog.Height = 60
    ; Khai báo method Get-Accessors Speak để thực thi hàm Dog_Speak. Nhớ hàm không được cho vào dấu nháy, không được phép là string (chỉ tên hàm).
    $Dog.__defineGetter('Speak', Dog_Speak)
    ; Khai báo method Speak2 để thực thi hàm Dog_Speak2.
    $Dog.__defineGetter('Speak2', Dog_Speak2)

    $Dog.Speak() ; Như vầy cũng được luôn: $Dog.Speak
    $Dog.Speak2("Tao méo phải con chó."); Nếu $Dog.Speak2() cũng không gặp vấn đề gì, vì đã set debug rồi.

    $Dog.Weight = 69 ; Gán giá trị khác cho property Weight.
    $Dog.Speak.Speak2("Tao đã chết!") ; Để như này sẽ gọn hơn nếu giá trị trả về của method là object (chính nó).
    ; Speak xong, nó trả về object, Speak2 lấy object dó để tiếp tục, từ trái sang phải cho đến hết.

    $Dog.__unset("Weight") ; Xóa property Weight.

    ; Đặt method Set-Accessors vào property Name để lọc giá trị khi gán vào property.
    $Dog.__defineSetter('Name', Dog_SetName)
    $Dog.Name = 123 ; Thất bại.

    MsgBox(0, 'Property Name', $Dog.Name) ; Hiện lên giá trị Name ban đầu.

    $Dog.__lock ; __lock để khóa oject.
    ; Thử bỏ comment ở dòng dưới vàn chạy xem.
    ;$Dog.Run ; Khi đã lock object, thêm các property và method mới sẽ sinh ra lỗi, Run ở đây chưa được khai báo trước đó.

    ;-----------------------------------------------------------------------

    ; Func <Tên hàm>(<param object>)
    Func Dog_Speak($oSelf) ; $oSelf đặt cho dễ hiểu, muốn tên nào cũng được hết.
        MsgBox(0, 'Method Dog_Speak', "Chào tụi gay lọ. Tao là "& $oSelf.parent.Name & ", nặng " & $oSelf.parent.Weight & " kí lô & cao " & $oSelf.parent.Height & " xen ti.")
        ; Chào mấy đứa gay lọ. Tao là một con chó, cân nặng XX kí lô và cao XX xen ti.

        ; Không được sử dụng trực tiếp $oSelf.Weight, phải thông qua parent mới lấy được property.

        ; Dòng này sẽ trả về object và để sử dụng cho các method liền sau.
        Return $oSelf.parent
    EndFunc

    Func Dog_Speak2($oSelf)
        ; Debug. Nếu method không có param nào thì return.
        If Not ($oSelf.arguments.length == 1) Then Return $oSelf.parent
        ; Do có sử dụng mảng nên phải debug, tránh trường hợp Null Argument.
        ; Nếu không có param, arguments.values sẽ khộng phải là array.
        MsgBox(0, 'Method Dog_Speak2', $oSelf.arguments.values[0])
        ; array[0] = param 1
        ; array[1] = param 2
        ; ..................
        ; array[n] = param n

        Return $oSelf.parent
    EndFunc

    Func Dog_SetName($oSelf)
        If IsString($oSelf.ret) Then ; Đặt điều kiện giá trị gán vào phải bắt buộc là string.
            $oSelf.val = $oSelf.ret ; ret là cái đưa vào, val là giá trị của property.
            Return 1
        EndIf

        ; Else
        MsgBox(0, 'Lỗi!', 'Chỉ chấp nhận giá trị là string.') ; Thong báo lỗi.
        Return SetError(1, 1, 0) ; Set error.
    EndFunc
    Mã (AutoIt):
    #include "AutoItObject_Internal.au3"

    Global $GUI = GUI("Test")
    $GUI.Show ; Hiện GUI.

    Sleep(2000) ; Chờ 2s.
    $GUI.Hide ; Ẩn GUI.

    Sleep(1000) ; Chờ 1s.

    ;      tiêu đề            màu nền              sự kiện thoát   hiện.
    $GUI.Title("New Title").bkColor(0x2D2D2D).onExit(OnExit).Show
    ; Tất cả trong một, không cần dài dòng.

    #cs
    WinSetTitle(HWnd($GUI.hWnd), '', "New Title")
    GUISetBkColor(0x2D2D2D)
    GUISetState(@SW_SHOW)
    GUISetOnEvent(-3, OnExit)
    #ce


    Do
    Until Not Sleep(10)

    Func OnExit()
        GUIDelete()
        Exit
    EndFunc

    Func GUI($Title, $Width = Default, $Height = Default, $Left = Default, $Top = Default, $Style = Default, $ExStyle = Default, $Parent = Default)
        Local $oGUI = IDispatch()
        $oGUI.hWnd = GUICreate($Title, $Width, $Height, $Left, $Top, $Style, $ExStyle, $Parent)
        $oGUI.__defineGetter('Show', GUI_Show)
        $oGUI.__defineGetter('Hide', GUI_Hide)
        $oGUI.__defineGetter('Title', GUI_Title)
        $oGUI.__defineGetter('bkColor', GUI_bkColor)
        $oGUI.__defineGetter('onExit', GUI_onExit)

        $oGUI.__lock
        Return $oGUI
    EndFunc

    Func GUI_Show($oSelf)
        GUISetState(@SW_SHOW, HWnd($oSelf.parent.hWnd))

        Return $oSelf.parent
    EndFunc

    Func GUI_Hide($oSelf)
        GUISetState(@SW_HIDE, HWnd($oSelf.parent.hWnd))

        Return $oSelf.parent
    EndFunc

    Func GUI_Title($oSelf)
        If Not ($oSelf.arguments.length == 1) Then Return SetError(1, 1, $oSelf.parent)
        WinSetTitle(HWnd($oSelf.parent.hWnd), '', $oSelf.arguments.values[0])

        Return $oSelf.parent
    EndFunc

    Func GUI_bkColor($oSelf)
        If Not ($oSelf.arguments.length == 1) Then Return SetError(1, 1, $oSelf.parent)
        GUISetBkColor( $oSelf.arguments.values[0], HWnd($oSelf.parent.hWnd))

        Return $oSelf.parent
    EndFunc

    Func GUI_onExit($oSelf)
        If Not ($oSelf.arguments.length == 1) Then Return SetError(1, 1, $oSelf.parent)
        Opt("GuiOnEventMode", 1)
        GUISetOnEvent(-3, $oSelf.arguments.values[0], HWnd($oSelf.parent.hWnd))
        Return $oSelf.parent
    EndFunc
     
    Chỉnh sửa cuối: 22/1/18
  2. truonghieuhust

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

    Tham gia ngày:
    5/4/18
    Bài viết:
    4
    Đã được thích:
    0
    Cám ơn bạn đã chia sẻ!
     

Chia sẻ trang này

Đang tải...