Đôi lời
Cái macro này (#Macro.dll) em tạo từ hồi khá lâu rồi. Lúc đó đang tìm hiểu về các khái niệm delegate, event, dynamic... của C# cộng thêm
kí pháp Ba Lan em nảy ra ý tưởng viết một cái thư viện dùng để thông dịch một số đoạn lệnh cơ bản. Sau một thời gian tìm tòi nghiên cứu trên
https://stackoverflow.com/,
google.com, ... thì cũng xong. Một thời gian sau thì em biết tới thằng Geckofx lúc đó em mới kết hợp thêm nó vào để tạo ra được cái này
#v1. Sau đó thì làm lại, chỉnh sửa một số thứ để được cái như giờ #v2. Do lúc đó mới chập chững học c# nên code khá là rối nên bác nào có xem mã nguồn thì thông cảm
.
Mục đích ban đầu của em khi làm cái này là để sử dụng cá nhân nên hơi khó sử dụng. Hiện tại thì em không có dự định cải tiến hay nâng cấp gì thêm nếu ko cần thiết (chỉ fix lỗi). Và một điều nữa là văn viết em hơi kém nên câu cú có phần lủng củng nên các bác bỏ qua cho.
Bắt đầu thôi
I. Tổng quan
Macro là một thư viện dùng để thông dịch và chạy một số lệnh cơ bản theo dòng từ trên xuống dưới. Bao gồm một số khái niệm: vùng, chỉ lệnh, biến, hằng, hàm dựng sẵn và thủ tục (mấy cái tên khái niệm này do em thấy tương tự với một số nnlt nên gọi vậy cho tiện).
Về cơ bản, khi chạy chương trình thì trước tiên nó sẽ duyệt qua toàn bộ lệnh xóa hết các *
comment* sau đó tạo một bảng đánh dấu vị trí các nhãn, các thủ tục được khai báo. Rồi bắt đầu thực hiện chạy từng dòng code trừ trên xuống dưới. Vì phần kiểm tra lỗi với cú pháp em không làm kĩ nên đôi khi viết sai cú pháp thì có thể chương trình tắt luôn
không hiện lỗi.
Chạy thử và kiểm lỗi.
Để chạy thử và kiểm lỗi thì các bác bật cái Warg.exe lên phía bên tay phải góc trên có một cái khung ghi
Code Editor hãy viết các lệnh vào đó. Sau đó nhấn vào biểu tượng hình người bên dưới để chạy thử. Khi chạy thử thì nó sẽ bật sang Tab
Console ở đây sẽ hiện các dòng lệnh đang chạy nếu có lỗi nó sẽ báo luôn ở đây. Góc trên cùng cuối thanh địa chỉ có một cái khung
00:00 đó là thời gian thực hiện lệnh. Bên dưới có một bảng
Variable hiện thị tên biến và giá trị của biến trong chương trình. Ngoài ra có một khung (textbox)
Code để chạy thử từng lệnh.
Trước khi đi vào chi tiết cần xem qua một số khái niệm:
1. Vùng:
Có 2 vùng cơ bản là vùng khái báo thủ tục và vùng thân chương trình. Cấu trúc cơ bản của 1 chương trình macro sẽ như thế này:
Code:
#proc
;vùng khai báo thủ tục
#code
;vùng thân ct
Khi chạy thì macro sẽ đọc qua một lượt các câu lệnh và xử lý phần #proc trước tiên. Nó sẽ lưu các thủ tục được khai báo vào bảng để dùng sau này.
2. Biến
Biến là một giá trị dữ liệu có thể thay đổi. Xem thêm
#biến_là_gì
3. Hàm dựng sẵn
Là một số đoạn lệnh đã được định nghĩa sẵn chỉ việc sử dụng và có thể gọi lồng vào nhau. Thường viết hoa chữ cái đầu mỗi từ tên hàm.
ví dụ:
sử dụng 2 hàm Sleep và RandL
4. Chỉ lệnh
Tương tự hàm dựng sẵn nhưng cách sử dụng hơi khác và không lồng vào nhau được. Chỉ lệnh thường được viết thường.
ví dụ:
sleep 1000
5. Thủ tục
Tập hợp nhiều dòng lệnh được khai báo tại vùng #proc nhằm mục đích sử dụng lại những đoạn mã viết nhiều lần
Note:
- Mỗi lệnh phải viết trên 1 dòng
- Sử dụng dấu chấm phẩy ; để thể hiện một comment. Tất cả lệnh nằm sau dấu ; đều bị bỏ qua.
- Dấu nháy đơn ' được sử dụng để xác định chuỗi.
- Phân biệt chữ hoa thường
- File macro có phần mở rộng là .brg
II. Khái niệm căn bản
1. Hằng
Một số giá trị không đổi được định nghĩa sẵn trong macro là:
- TRUE
- FALSE
- NULL
2. Toán tử
#toán_tử_là_gì
Toán tử số học gồm +, - , * , /
Toán tử điều kiện <, >, !=, <=, >=, ==
Toán tử quan hệ ||, &&
Note: Toán tử ! để đảo ngược giá trị luân lí được thay bằng hàm Not()
3. Biến và kiểu dữ liệu
Biến là giá trị có thể thay đổi trong macro ta có thể khai báo và gán giá trị ban đầu cho biến sau đó có thể thay đổi giá trị này.
Để khai báo biến dùng từ khóa
(nên gán giá trị cho biến khi khai báo).
Code:
;khai báo biến a
var a
;khai báo và gán giá trị cho biến b, c
var b = 12
var c = 'chuc mot ngay tot lanh'
;gan gia trị mới cho biến b
b=16
Macro có các kiểu dữ liệu chính: số, chuỗi (nằm trong dấu nháy đơn '), đối tượng (object)
Mặc định khi khai báo biến thì nó sẽ là kiểu dữ liệu object khi chạy (thông dịch) thì nó tự động xác định kiểu phù hợp với giá trị được gán.
4. Lệnh rẽ nhánh (if else)
Nếu muốn mô tả một đoạn chương trình kiểu như "Nếu gặp điều kiện C thì thực hiện hành động A, ngược lại, thực hiện hành động B" thì sử dụng cấu trúc rẽ nhánh.
Cú pháp rẽ nhánh đơn giản:
Code:
if(dieu_kien)
;doan lenh neu thỏa điều kiện
endif
Rẽ nhánh với if else
Code:
if(dieu_kien)
;doan lenh neu thoa dieu_kien
else
;lenh neu khong thoa dieu kien
endif
Hoặc
Code:
if(dieu_kien1)
;doan lenh neu thoa dieu_kien1
elseif(dieu_kien2)
;lenh neu thoa dieu kien 2
else
;lenh neu khọng thoa dk 1 va dk 2
endif
ví dụ:
Code:
var a = 13
if(a < 10)
a = 15
else
a=5
endif
5. Nhãn và lệnh lặp
Nhãn là một chuỗi để đánh dấu vị trí của dòng lệnh trong chương trình.
Để tạo một nhãn dùng cú pháp
ví dụ: tạo 1 nhãn tên danh_dau
Code:
var a = 6
danh_dau:NOP
var b =5
Lệnh lặp để lặp đi lặp lại một số đoạn lệnh nhiều lần ta sử dụng lệnh jmp hoặc jmpif kết hợp với nhãn tạo sẵn.
- jmp:ten_nhan - nhảy về nhãn được chỉ định
- jmpif(dieu_kien):ten_nhan - nhảy về nhãn được chỉ định nếu thỏa điều kiện
ví dụ: tạo một vòng lặp và tính tổng từ 1->10
Code:
var i =1
var sum = 0
;tạo 1 nhãn ở đây để nhảy về
loop:NOP
sum = sum + i
i = i + 1
;nhay neu i con be hon 10
jmpif(i < 10):loop
WritelnToConsole(sum + '')
Note: không được nhảy từ bên trong đoạn if ra ngoài if như ví dụ dưới (macro vẫn chạy nhưng không đúng).
Code:
var s = 0
loop:NOP
if(s < 10)
;loi vi nhảy ra khỏi vùng if
jmp:loop
endif
6. Thủ tục
Để tránh viết nhiều lần những đoạn lệnh thường xuyên sử dụng ta có thể khai báo đoạn lệnh đó thành một thủ tục để sử dụng nhiều lần sau này.
Cú pháp khai báo thủ tục như sau:
Code:
proc ten_thu_tuc
; lenh o day
ret
endp
Để sử dụng thủ tục ta dùng chỉ lệnh
call ten_thu_tuc
Note:
- thủ tục được khai báo ở vùng #proc
- 3 từ khóa chình không thể thiếu khi khai báo thủ tục proc, ret và endp
- chỉ lệnh `call ten_thu_tuc` khi thông dịch thì macro copy tất cả các lệnh trong ten_thu_tuc chèn vào. Vì vậy tất cả biến trong thủ tục cũng như trong chương trình chính đều như nhau (có thể truy xuất).
ví dụ: tạo 1 thủ tục tính tổng
Code:
#proc
proc tinh_tong
a = b + c
ret
endp
#code
var a
var b= 8
var c=9
;goi thủ tục tính tổng
call tinh_tong
WritelnToConsole(a + '')
III. Một số chỉ lệnh
Note: chữ in
nghiêng đậm là tên chỉ lệnh,
chữ nằm nghiêng như này là cú pháp sử dụng.
errorignore - cài đặt có bỏ qua lỗi hay không (nếu FALSE thì gặp lỗi nó sẽ dừng chạy)
errorignore TRUE hoặc
errorignore FALSE
timeoutignore - cặt đặt bỏ qua timeout của trình duyệt
timeoutignore TRUE hoặc
timeoutignore FALSE
NOP - không làm gì cả, gặp lệnh này thì nó bỏ qua chạy lệnh tiếp theo.
NOP
call - chạy một thủ tục(nt)
execif - lệnh rút gọn của if.. endif. Chạy đoạn lệnh đằng sau nếu thỏa điều kiện if
Code:
;dừng ct 1 giây nếu a = 2
execif(a == 2):sleep 1000
include - copy nội dung của 1 file macro (đuôi .brg) vào vị trí hiện hành
include 'duong_dan_toi_file.brg'
Nếu file đó nằm trong thư mục Nazgul/Macro thì đường dẫn sẽ là Macro\ten_file
include 'Macro\ten_file.brg'
sleep - tạm dừng trong một khoảng milli giây
sleep 1000 - tạm ngừng 1 giây
sleep cũng có thể dùng với biến
tab - chọn tab theo số thứ tự. Mỗi khi mở một tab mới thì nó sẽ gán môt số thứ tự cho tab bắt đầu từ 1. Luôn có một tab chính mặc định khi chạy(maintab) nó có số thứ tự là 0.
tab 1
findtab- tìm kiếm tab trong đống tab đang mở theo đường dẫn
closetab - đóng tab
closetab 1
maintab - chọn lại tab chính ban đầu
maintab tương đương với lệnh
tab 0
closeallothers - đóng tất cả các tab trừ tab chính
closeallothers
enabledmessageevent - bật tắt messageevent
Còn tiếp...