Upload
hoangnhi
View
258
Download
0
Embed Size (px)
Citation preview
GIỚI THIỆU VỀ AUTOIT
AutoIt v3 là một ngôn ngữ lập trình được cung cấp miễn phí, có dạng kịch bản
giống như BASIC được thiết kế để tự động hóa các GUI (Graphic User Interface :
giao diện người dùng) và các thao tác thường dùng. Nó là sự phối hợp của việc giả
lập nhấn phím , di chuyển chuột và thao tác trên cửa sổ/control (control là các đối
tượng tương tác được trên cửa sổ, ví dụ như là button - nút bấm) để thực hiện tự
động các tác vụ theo cách thức mà các ngôn ngữ khác không thể làm hoặc làm
không chuẩn xác. AutoIt có dung lượng rất nhỏ gọn, có thể chạy độc lập trên tất cả
các phiên bản của Windows mà không cần các runtime để làm nền. Tuy nhiên, kể
từ phiên bản v3.3, AutoIt đã không còn hỗ trợ cho Windows 9x và Win NT 4.0.
Ban đầu AutoIt được thiết kế để tự động cấu hình cho hàng ngàn máy PC. Theo
thời gian, AutoIt trở thành một ngôn ngữ đầy sức mạnh với sự hỗ trợ các biểu thức
phức tạp, hàm do người dùng tự định nghĩa, các vòng lặp và mọi thứ mà một người
lập trình kịch bản dày dặn mong đợi.
Ở đây là các tính năng chính :
Dễ học vì các cú pháp đơn giản
Giả lập được việc nhấn phím và di chuyển chuột
Thao tác được với các tiến trình và cửa sổ
Tương tác được với các control trên cửa sổ
File mã có thể được biên dịch thành một file thi hành duy nhất
Cho phép tạo GUI - giao diện người dùng
Hỗ trợ COM (Component Object Model)
Hỗ trợ biểu thức thông thường
Gọi một cách có định hướng các DLL mở rộng và các hàm API
Tài liệu chi tiết và cộng đồng rộng hỗ trợ lớn
Tương thích với tất cả phân hệ của Windows
Hỗ trợ Unicode và x64
Làm việc với User Account Control (UAC) trên Vista
AutoIt được thiết kế sao cho nhỏ nhất có thể và không cần dùng đến các file DLL
mở rộng hoặc Registry để nó có thể an toàn khi chạy trên các Server. Các file
script (mã, kịch bản) có thể được biên dịch thành file exe với công cụ Aut2Exe.
Sự kết hợp các COM và DLL từ việc gọi AutoItX cho phép bạn thêm các tính năng
độc nhất vào các đoạn script hay ngôn ngữ lập trình yêu thích.
CẤU TRÚC THƯ MỤC CÀI ĐẶT AUTOIT
Các file và thư mục Miêu tả
(Thư mục cấp trên)
AutoIt3.exe Chương trình chính của AutoIt để chạy các file script
AutoIt3_x64.exe Phiên bản x64 của AutoIt (nếu có cài đặt).
AU3Info.exe AutoIt Window Info Tool – cung cấp thông tin từ cửa
sổ.
AU3Info_x64.exe Phiên bản x64 của AutoIt (nếu có cài đặt).
AU3Check.exe Trình kiểm tra cú pháp.
AutoIt.chm File trợ giúp, sử dụng AutoIt3.chm và UDFs3.chm
Uninstall.exe Trình gỡ bỏ AutoIt
AutoIt v3 Website.url Shortcut để truy cập vào website
: http://www.autoitscript.com/autoit3/
Aut2Exe
Icons\ Chứa các icon (*.ico) để dùng cho file au3.
Aut2Exe.exe Trình biên dịch file nguồn thành file exe
Aut2Exe_x64.exe Phiên bản x64 của AutoIt (nếu có cài đặt).
AutoItSC.bin Mẫu có thể thực thi cho mã đã được biên dịch
AutoItSC_x64.bin Mẫu có thể thực thi x64 cho mã đã được biên dịch.
UPX.exe Trình nén UPX để nén kích thước của file mã khi dịch
sang file exe
Examples
GUI\ Các ví dụ về GUI được viết trong AutoIt.
Helpfile\ Chứa các file script ví dụ được dùng trong file help
Extras
AutoUpdateIt\ Chứa một script giúp cho việc cập nhật phiên bản mới
của AutoIt3.
Editors\ Chứa các định nghĩa màu cú pháp cho vài trình soạn
thảo phổ biến.
Exe2Aut\ Chứa các công cụ chuyển file exe sang file script
nguồn.
SQLite\ Chứa tiện ích dòng lệnh SQLite và file trợ giúp
v2_to_v3_Converter\ Chứa công cụ giúp chuyển đổi cú pháp AutoIt từ
v2.64 sang AutoIt v3.
Icons
Chứa icon được dùng cho file au3
Include
Chứa các file thư viện với các hàm được định nghĩa sẵn
AutoItX
Chứa một phiên bản DLL của AutoIt v3 để cung cấp một tập hợp con các tính
năng của giao diện ActiveX/COM và DLL.
SciTe
Chứa trình biên soạn văn bản SciTe để viết script
Xin nhắc lại là để chạy được các đoạn script của AutoIt, chỉ yêu cầu có file
AutoIt3.exe. Nếu bạn biên dịch một file script sang file có thể thực thi thì người
dùng khác không cần phải cài đặt AutoIt mà vẫn có thể chạy được file script đã
biên dịch.
(Ngoại lệ : dưới Windows NT4, file PSAPI.dll thì cần thiết trong đường dẫn hoặc
trong thư mục cài đặt AutoIt cho các hàm Process…() làm việc.)
VIẾT SCRIPT
Trong AutoIt đã được tích hợp sẵn trình soạn thảo SciTe cho phép ta viết và chạy
các đoạn script một cách tự động. Tuy nhiên đây là bản rút gọn cho nên đã được
lượt bỏ vài tính năng và công cụ bổ sung. Phiên bản đầy đủ các bạn có thể tải về từ
http://www.autoitscript.com/autoit3/scite/.
Ở đây tôi xin nói thêm vài điểm lưu ý trong việc soạn mã.
Khi viết script trong SciTe, bạn cần phải lưu lại trước khi nhấn
phím F5 để chạy. File nguồn có đuôi là au3.
Để viết và hiển thị được tiếng Việt, bạn vào "File > Encoding" sau
đó chọn UCS -2 Little Endian hoặc UCS-2 Big Endian.
SciTe sẽ hiển thị các dòng lệnh của bạn với nhiều màu sắc khác
nhau, tùy theo thành phần cú pháp. Nếu bạn cảm thấy các màu sắc hiển thị
không vừa ý thì có thể sử dụng công cụ SciTeConfig để chỉnh lại. Công cụ
này có sắn trong phiên bản full của SciTe hoặc tải riêng lẻ từ
www.autoitscript.com.
Nếu bạn không thích dùng SciTe để soạn script thì có thể dùng các
công cụ biên soạn miễn phí khác như Crimson Editor
(http://www.crimsoneditor.com/) hoặc Source Edit
(http://www.sourceedit.com/) nhưng sẽ phải thực hiện cấu hình việc khai
báo chương trình chạy file au3 và trình biên dịch.Các file cú pháp được viết
sẵn do AutoIt cung cấp có thể dùng cho nhiều trình soạn thảo và chúng được
chứa trong trong thư mục Extra (...\AutoIt v3\Extra)
BIÊN DỊCH FILE SCRIPT THÀNH FILE EXE
Khi biên dịch một file script thành file exe, bạn có thể yên tâm rằng nó sẽ chạy
được trên mọi máy tính cài hệ điều hành Windows mà không cần bất cứ một
runtime nào để làm nền. Bởi vì tất cả các #include cũng sẽ được nén, mã hóa và
kết hợp vào trong một file duy nhất. Nhưng bạn cần phải chắc chắn một điều rằng
file script của bạn không có lỗi cú pháp, bởi vì compiler không thực hiện kiểm tra
cú pháp khi biên dịch sang file *.exe.
Muốn thực hiện việc biên dịch file script, có 3 cách :
Cách 1 : Bạn cần gọi công cụ Aut2Exe. Vào menu "Start > All programs >
AutoIt v3 > Compile scritpt to exe" và làm theo hướng dẫn của mẫu form. Error!
Cách 2 : Từ trình soạn thảo SciTe bạn vào Tool > Compile hoặc nhấn Ctrl +
F7
Cách 3 : Nhấp phải chuột vào file nguồn (au3) và chọn Compile Script. Error!
Ở cách 2 và 3, file thi hành sẽ được tạo ra ngay tại thư mục chứa file nguồn. Ngoài
ra còn có thêm một cách biên dịch khác là dùng command promt để gọi aut2exe
với các tham số chỉ định. Cách này khá dài dòng và phức tạp nên không đề cập ở
đây.
CÁC TOÁN TỬ
AutoIt hỗ trợ các toán tử gán, tính số học, so sánh, và logic.
Toán tử Miêu tả
= Phép gán. Vd : $var = 5 (gán 5 vào biến $var)
+= Tăng. Vd : $var += 2 (tăng biến $var lên 2 đơn vị, tương đương với
$var = $var+2)
-= Giảm. Vd : $var -= 1 (giảm biến $var xuống 1 đơn vị, tương đương
$var = $var -1)
*= Nhân.
/= Chia
&= Nối thêm chuỗi. Vd : $var = "one", và sau đó $var &= 10 ($var sẽ
bằng "one10" )
+ Cộng hai số. Vd : 10 + 20 (bằng 30)
- Trừ hai số. Vd : 20 - 10 (bằng 10)
* Nhân hai số. Vd : 20 * 10 (bằng 200)
/ Chia hai số. Vd : 20 / 10 (bằng 2)
& Ghép hai chuỗi với nhau. Vd : "one" & 10 (bằng "one10" )
^ Lũy thừa. Vd : 2 ^ 4 (bằng 16)
=
So sánh bằng (không phân biệt chữ hoa và chữ thường khi so sánh
chuỗi). Vd : If $var= 5 Then (trả về true nếu biến $var mang giá trị
5)
== So sánh bằng (có phân biệt chữ hoa, chữ thường khi so sánh chuỗi.
<> Khác hoặc Không bằng.
> Lớn hơn.
>= Lớn hơn hoặc bằng
< Nhỏ hơn
<= Nhỏ hơn hoặc bằng
AND Logic Và (cả hai). Vd : If $var = 5 AND $var2 > 6 Then (Điều kiện
trả về True nếu $var bằng 5 Và $var2 lớn hơn 6 )
OR Logic Hoặc. Vd : If $var = 5 OR $var2 > 6 Then (Trả về True nếu
$var bằng 5 Hoặc $var2 lớn hơn 6)
NOT Logic Phủ định. Vd : NOT 1 (trả về False)
Nếu trong biểu thức cần xử lý có sử dụng nhiều toán tử thì chúng sẽ được thực
hiện theo thứ tự trước sau. Việc tính toán thường được thực hiện từ trái qua phải và
tuân theo các qui tắc chung của đại số. Bên dưới là thứ tự ưu tiên của các toán tử :
NOT
^
* /
+ -
&
< > <= >= = <> ==
AND OR
Ví dụ : 2 + 4 * 10 sẽ có kết quả là 42:
Bởi vì phép nhân * có ưu tiên cao hơn phép cộng + , nên 4 * 10 (bằng 40) và 2 + 40 (bằng 42).
Để có kết quả tính toán chính xác bạn nên sử dụng cặp dấu ngoặc đơn ( ) để nhóm
các biểu thức con một cách thích hợp.. Mặc dù không được đề cập, song, dấu
ngoặc đơn là toán tử có độ ưu tiên cao nhất trong tất cả các toán tử.
Vd : (2 + 4) * 10 bằng 60. NOT (12+3)/5 sẽ bằng 0
Đối với toán tử logic AND, OR, ta có ví dụ sau :
Vd 1 : If MyFunc1() OR MyFunc2() Then
(MyFunc2() sẽ không được gọi nếu như MyFunc1() trả về True)
Vd 2 : If MyFunc1() AND MyFunc2() Then
(MyFunc2() sẽ không được gọi nếu MyFunc1() trả về False)
KIỂU DỮ LIỆU
Trong AutoIt chỉ có một loại dữ liệu gọi là Variant (tạm dịch là biến). Một biến có
thể chứa dữ liệu theo kiểu chuỗi (string) hoặc là kiểu số (number) tùy vào tình
huống sử dụng. Ví dụ như nếu bạn nhân hai biến với nhau thì lúc này biến có kiểu
number, còn nếu bạn sử dụng phép toán ghép chuỗi với hai biến thì chúng sẽ được
đối xử như các chuỗi ký tự.
Ví dụ :
10 * 20 sẽ bằng số 200 (* là nhân hai biến với nhau)
10* "20" cũng sẽ bằng số 200
hoặc "10" * "20" cũng bằng số 200
10 & 20 sẽ trả về một chuỗi là "1020" (& là phép toán ghép chuỗi)
Nếu một chuỗi được sử dụng như một số, một phép gọi hàm Number()nên được
thực hiện. Và nếu như ký tự đầu tiên của chuỗi không phải là một ký số thì sẽ trả
về một số 0. Ví dụ :
10 * "abc" sẽ trả về số 0
10* number("abc") cũng trả về 0
10* number("25ghj") sẽ trả về 250
Nếu một chuỗi được sử dụng trong kiểu boolean (True/False) và nó là một chuỗi
rỗng "" thì sẽ được xem như bằng 0 (False).
KIỂU SỐ - NUMBER
Number có thể là số thập phân như : 3, 5.642 và -8
cũng có thể là số thập phân theo dạng khoa học, ví dụ như 1.5e3 sẽ thay cho 1500
(vì 1.5*10^3)
hay hệ thập lục phân (hexa) : 0x409 hoặc 0xff4a.
Chú ý :
Hệ hexa trong AutoIt phải bắt đầu với 0x và theo sau là các ký số từ 0 đến
9 hoặc/và các ký tự a, b, c, d, e, f.
Khi tính toán các biểu thức số, bạn không cần quan tâm đến việc giới hạn
của kiểu dữ liệu. Nếu kết quả là số nguyên, AutoIt sẽ trả về cho bạn số
nguyên. Nếu kết quả là số thập phân, AutoIt sẽ trả về giá trị thập phân. Ở dạng
thập phân, giá trị lớn nhất có thể chứa là (264 - 1)/2.
Một số hàm trong AutoIt chỉ làm việc với số nguyên 32 bit (mang giá trị
từ 0 đến 232 -1) và các số này sẽ được chuyển đổi tự động, tùy vào hàm sử
dụng. Ví dụ như BitAnd.
KIỂU CHUỖI - STRING
Chuỗi ký tự được rào trong cặp dấu ngoặc kép " " hoặc cặp dấu nháy đơn ' '. Ví
dụ :
"this is a string"
' Welcome to AutoIt ! '
Mặc dù AutoIt hỗ trợ hai phương thức biểu diễn chuỗi nhưng khi sử dụng bạn phải
sử dụng thống nhất có trật tự, không thể bắt đầu rào chuỗi với dấu ngoặc kép, kết
thúc chuỗi với dấu nháy đơn và ngược lại. Ví dụ sau cho thấy chuỗi không hợp lệ :
" doctor for pc '(sẽ báo lỗi khi chạy)
Tuy nhiên, trong trường hợp bạn muốn nhấn mạnh một nội dung nào đó trong
chuỗi bằng dấu ngoặc kép hoặc dấu nháy đơn thì AutoIt cũng hỗ trợ việc trộn hai
dạng ký tự này. Và bạn phải nhớ tính trật tự và đầy đủ trong khi sử dụng. Ví dụ :
' It is a "black" web '
"This "sentence" contains "lots" of "double-quotes". "
" It 's a dog "
nhưng ' it 's a dog ' (là một chuỗi bị lỗi)
Một biến kiểu chuỗi có thể chứa đến 2,147,483,647 ký tự (tương đương với 1651
quyển sách dày 500 trang, mỗi trang có 40 dòng, mỗi dòng có 65 ký tự)
KIỂU BOOLEAN
Kiểu boolean chỉ mang hai giá trị đúng hoặc sai (True/False). Trong nhiều trường
hợp sử dụng thì một kiểu boolean trả về False khi giá trị của biến đó là 0 hoặc là
chuỗi rỗng "". Tất cả các trường hợp khác 0 đều được xem như True, theo mặc
định thì True bằng 1. Thông thường, các phép toán logic AND, OR hoặc NOT
thường được dùng với kiểu boolean trong việc thẩm định điều kiện.
Ví dụ :
$b1 = true
$b2 = false
$b3 = $b1 And $b2--> ($b3 sẽ bằng False)
$b2 = 5
$b3 = $b1 And $b2--> ($b3 sẽ bằng True)
$b3 = $b1 + $b2 --> ($b3 sẽ bằng 6)
$b3 = NOT $b3 --> ($b3 sẽ bằng 0)
Trong trường hợp bạn xử lý một biến boolean như một chuỗi thì :
một boolean là true sẽ chứa chuỗi "True"
một boolean là false sẽ chứa chuỗi "False"
ví dụ :
$b1 = true
$str = "test is : "
$string = $str & $b1 ($string sẽ chứa chuỗi "Test is : True")
KIỂU NHỊ PHÂN - BINARY
Kiểu binary có thể lưu giữ mọi byte giá trị, chúng được chuyển đổi sang dạng hexa
khi lưu trong một biến chuỗi. Ví dụ :
$bin = Binary("abc")
$str = string($bin) --> "0x616263"
KIỂU CON TRỎ - POINTER
Kiểu con trỏ dùng để lưu trữ địa chỉ bộ nhớ 32 bit hoặc 64 bit tùy vào phiên bản
AutoIt được sử dụng. Thực chất con trỏ là một số nguyên chỉ định vị trí của thành
phần dữ liệu nào đó trong bộ nhớ. Tuy nhiên, khi truy xuất trong AutoIt thì con trỏ
sẽ được lưu ở dạng hexa trong một biến kiểu chuỗi. Handle (tạm dịch là kênh hay
địa chỉ trong bộ nhớ) của cửa sổ được trả về bởi hàm WinGetHandle là một kiểu
con trỏ, mang giá trị ở dạng hexa. Nếu muốn xem ở dạng thập phân bình thường ta
dùng hàm Number .
-------------------------------- Mặc dù phần này trình bày nhiều kiểu dữ liệu mà AutoIt hỗ trợ nhưng trên thực
tế, bạn chỉ cần quan tâm đến hai kiểu chính đó là number và string. Đây chính là
hai kiểu dữ liệu thường dùng nhất khi viết script. Các kiểu khác dùng để tham khảo
cho biết chứ thực chất chúng cũng được tạo nên từ hai kiểu trên và thường chúng ít
khi được dùng đến. Nếu bạn đã là một người sành sỏi về lập trình thì việc này
không cần phải bàn.
DẠNG CHUNG
Một chương trình AutoIt do nhiều thành phần cấu thành, trong đó, biến, biểu thức,
hàm, macro,... đóng vai trò quan trọng. Tuy nhiên chúng chỉ là những "cá thể" độc
lập mang một chức năng nhất định. Tất cả chúng phải được kết hợp với nhau theo
một cách thức hợp lý thì ta sẽ có được một chương trình hoàn chỉnh. Các cách thức
đó do chính AutoIt qui định và một đoạn mã chạy được có dạng tổng quát như sau
:
<chỉ định thư viện>
<khai báo các biến>
<các câu lệnh, biểu thức>
<các dòng miêu tả, ghi chú>
<gọi hàm hoặc định nghĩa hàm>
. . . .
Ví dụ :
; chương trình đơn giản hiện thông điệp hello world
; và welcome to autoit
Global $m
$m = "Hello world"
MsgBox(0, "My Msg", $m)
MsgBox(0, "Msg", "Welcome to AutoIt")
Tùy vào mục đích của người dùng mà các thành phần có thể có hoặc không trong
chương trình. Như ví dụ trên, ta thấy không có phần chỉ định thư viện bởi vì ta chỉ
sử dụng các hàm được thiết kế sẵn, luôn có trong chương trình chính (như hàm
MsgBox ). Thư viện chỉ cần thiết khi ta gọi các hàm mở rộng, thông thường là
trong việc thiết kế GUI (Graphic User Interface - giao diện người dùng) hoặc các
hàm tiện ích. Khai báo và sử dụng biến là cần thiết nếu như ta muốn lưu các dữ
liệu, giá trị để chương trình hoạt động. Và hàm, tất nhiên là không thể thiếu nếu
như bạn viết các chương trình phức tạp và có tần suất sử dụng lại nhiều lần một tác
vụ nào đó.
Ví dụ nêu trên chỉ là một đoạn mã đơn giản, nó không thể thể hiện hết tất cả các
chức năng trong AutoIt. Nhưng ta cũng phân tích sơ bộ để hiểu vấn đề. Hai dòng
lệnh đầu tiên là dòng ghi chú, thường dùng để miêu tả giải thích chức năng của
một đoạn mã hay câu lệnh nào đấy. Dòng thứ ba là khai báo biến. Dòng thứ tư là
gán giá trị cho biến. Hai dòng còn lại là gọi và sử dụng hàm hiển thị thông điệp.
THƯ VIỆN
Nói theo kiểu kỹ thuật, nếu rành về lập trình bạn có thể tự tạo ra một chương trình
hữu ích, có tác dụng chỉ chứa toàn những mệnh đề của chính bạn. Tuy nhiên điều
này là hiếm hoi vì nó đòi hỏi rất nhiều công sức và thời gian. Với bất kỳ một ngôn
ngữ lập trình nào, không riêng gì AutoIt, những người tạo ra chúng đều cung cấp
cho chúng những chương trình con, mỗi chương trình con thực hiện một chức năng
nhất định mà ta thường gọi là hàm. Tập hợp tất cả các hàm này sẽ được chứa trong
một file thư viện, tùy vào lĩnh vực xử lý của hàm mà chúng được lưu trong các file
thư viện tương ứng. Ví dụ như thư viện Array chứa các hàm về quản lý mảng, thư
viện Sound chứa các hàm dùng để điều khiển âm thanh, thư viện Math cho các
hàm toán học....
Với AutoIt thì những người cài đặt trình biên dịch đã viết sẵn đa số các hàm chung
mà bạn sẽ dùng. Cho nên sẽ có rất nhiều hàm mà bạn có thể sử dụng, không cần
khai báo thư viện vì theo mặc định chúng là hàm chuẩn luôn được đưa vào chương
trình của bạn. Chỉ những hàm mà người ta liệt kê nó vào UDF (User Defined
Function - hàm do người sử dụng tạo sẵn, không phải hàm chuẩn) hoặc những hàm
nào có ghi chú thư viện thì bạn mới chỉ định thư viện khi viết chương trình. Nếu
thích bạn cũng có thể tạo một thư viện để chứa các hàm của riêng mình sau khi bạn
hiểu được AutoIt.
CÁC CHÚ Ý
Đây là những chú ý quan trọng mà bạn nên ghi nhớ để có thể sử dụng AutoIT một
cách hiệu quả.
AutoIt là một ngôn ngữ kịch bản hoạt động theo cách thông dịch, các lệnh
được đọc và thực hiện một cách tuần tự. Có nghĩa là đọc đến đâu thì thực
hiện đến đó, không đọc hết một lượt như các ngôn ngữ C hay Pascal.
AutoIt không có ký hiệu ngăn cách các câu lệnh với nhau, cho nên mỗi câu
lệnh phải được viết trên một dòng, câu lệnh thứ hai phải được viết ở dòng kế
tiếp (trong c và pascal thì sử dụng dấu chấm phẩy ; để ngăn cách các câu
lệnh)
AutoIt không phân biệt chữ hoa và chữ thường đối với các lệnh được viết
(ngoại trừ Title của cửa sổ, xem phần Window Title). Ví dụ, biến $var,
$VAR và $VaR chỉ là một biến.
Tất cả các thành phần liên quan đến việc tạo và xử lý cửa sổ được AutoIt hỗ
trợ rất mạnh, chúng là các hàm chức năng tương ứng. Tuy nhiên, trong giới
hạn của ebook, tôi không thể hướng dẫn tất cả các hàm. Tham khảo và tự
dịch trong file help là một cách tự học hiệu quả.
Comment hay chú thích là thành phần rất hay dùng khi lập trình, đối với hầu
hết các ngôn ngữ chúng dùng để diễn đạt chức năng của một đoạn lệnh hay
đánh dấu nhằm dễ đọc, dễ quan sát đối với việc trình bày. Chúng không hề
có chức năng thi hành và sẽ được trình điều khiển bỏ qua khi đọc đến. Và
AutoIt hỗ trợ hai dạng chú thích. Chú thích theo dòng (sử dụng dấu chấm
phẩy để báo hiệu) và chú thích theo đoạn (sử dụng cặp #cs.. #ce) để rào các
dòng chú thích bên trong. Ví dụ :
; this is a first comment line
; this is a second comment
#cs
.......comment start
Comment 1
Comment 2
........
comment end
#ce
MsgBox(0, "msg", "Welcome to AutoIT")
KHAI BÁO BIẾN
Biến là một đại diện cho vùng địa chỉ nào đó trong bộ nhớ, mà ở đó dữ liệu được
lưu trữ. Tuy nhiên ở đây ta không đề cập đến vấn đề dữ liệu được chứa trong bộ
nhớ như thế nào. Ta chỉ cần biết, biến là một đại diện mang giá trị ta cần tính toán.
Trong AutoIt, một biến hợp lệ phải có tên được bắt đầu với ký tự $ và sau đó là các
ký tự alpha(a-z, A-Z), ký số (0-9) và dấu gạch dưới _. Ví dụ :
$var1 $my_variable $123 $String_temp
$abc@ $love.baby --> đây là hai biến không hợp lệ
Để khai báo một biến, biến đó phải được tạo với một trong các từ khóa Global,
Local hay Dim. Các từ khóa này có chức năng giới hạn phạm vi tồn tại và sử dụng
của biến. Ví dụ :
Global $var1, $title
Dim $m, $name
Global: chỉ định khai báo một biến có phạm vi toàn cục. Nghĩa là mọi nơi
trong chương trình đều có thể truy xuất, chỉnh sửa nội dung của biến
này. Và biến này sẽ tồn tại cho đến khi chương trình thoát ra. Ví dụ :
Global $m = "Hello world"
MsgBox(0, "MSG", $m)
_RepText()
MsgBox(0, "MSG", $m)
; định nghĩa hàm
Func _RepText()
$m &= ", " &$m
EndFunc
Đầu tiên ta tạo ra một biến $m và cho hiển thị nội dung của nó là " Hello world".
Sau đó hàm _RepText() được gọi để lặp lại nội dung của biến $m. Hàm MsgBox
thứ hai sẽ hiển thị "Hello world, Hello world". Do $m là biến toàn cục nên ta có
thể sửa đổi tùy ý giá trị của nó.
Local: chỉ định khai báo một biến có phạm vi cục bộ. Tức là nó chỉ được
phép sử dụng, thao tác ở phạm vi giới hạn trong chương trình, thường là
ở bên trong các hàm. Nó sẽ được khởi tạo khi hàm được gọi và sẽ bị
hủy khi hàm kết thúc. Những nơi khác trong chương trình không hề biết
sự tồn tại của biến Local này. Ví dụ :
; chương trình sau sẽ chạy command line
_ExeProg() ; sẽ thực thi cmd
Run($prog) ; dòng này sẽ báo lỗi
Func _ExeProg()
Local $prog = "cmd"
Run($prog)
EndFunc
Trong chương trình trên, sau khi hàm _ExeProg() được gọi và thực hiện xong thì
biến cục bộ $prog bị hủy, cho nên lệnh Run($prog) không được thực thi vì $prog
bên ngoài không mang một giá trị nào. Nói cách khác $prog bên trong hàm
_ExeProg và $prog bên ngoài hoàn toàn khác nhau.
Bạn chú ý một điều là, nếu bên trong một hàm, bạn khai báo một biến cục bộ cùng
tên với một biến toàn cục thì biến cục bộ sẽ được ưu tiên sử dụng thay vì biến toàn
cục. Khi nào tìm hiểu đến phần định nghĩa hàm, bạn sẽ hiểu rõ hơn về biến cục bộ.
Vì trong hàm rất thường sử dụng biến local để tính toán, lưu trữ giá trị.
Dim : Tạo ra một biến có phạm vi cục bộ (local) nếu như biến này chưa
được khai báo trước đó ở dạng toàn cục (global). Có nghĩa là :
Nếu khai báo biến bên ngoài hàm thì nó có phạm vi toàn cục.
Ví dụ :
; đoạn mã sau sẽ cho gọi calculator thay vì notepad
Dim $p = "notepad"
_modify()
Run($p)
Func _modify()
$p = "calc"
EndFunc
Nếu khai báo bên trong hàm thì phạm vi là cục bộ. Tuy nhiên, nếu biến Dim này
cùng tên với một biến Global, thì nội dung của biến Global sẽ bị viết đè. Điều
này bạn nên chú ý.
Ví dụ :
; đoạn mã này sẽ duyệt thư mục Temp thay vì thư mục Windows
Global $explore = "Explorer " & @WindowsDir
function()
Run($explore)
Func function()
Dim $explore = "Explorer " & @TempDir
EndFunc
Trong các ví dụ trên, ta thấy rằng việc khai báo một biến có thể kết hợp với việc
khởi tạo giá trị ban đầu cho biến đó. Theo mặc định, nếu bạn không gán giá trị khi
khai báo thì biến đó mang giá trị 0 (nếu sử dụng như một kiểu number) hoặc ""
(nếu sử dụng như một kiểu string).
Dù rằng AutoIt cho phép bạn sử dụng một biến không cần khai báo, nhưng sẽ thật
không hay khi chương trình của bạn có nhiều biến được tạo rải-rác ở nhiều nơi.
Tính trật tự và thống nhất sẽ không đạt hiệu quả vì bạn khó kiểm soát được các đối
tượng của mình trong hàng tá dòng lệnh đan xen nhau. Cũng xin nói thêm, nếu bạn
sử dụng một biến không có khai báo trước đó, tùy trường hợp vận dụng, thì hoặc là
chương trình sẽ báo lỗi, hoặc là biến đó sẽ được tạo tự động với phạm vi cục bộ
(Local). Nếu bạn khai báo một biến Local bên ngoài hàm thì nó vẫn có phạm vi
như Global.
Khi khai báo một biến, bạn nên chỉ định rõ phạm vi là Local hoặc Global, nên hạn
chế dùng Dim. Trừ khi bạn nắm rõ được tất cả các biến trong chương trình của
mình, nhằm tránh các lỗi về việc chỉnh sửa dữ liệu không mong muốn có thể xảy
ra.
KHAI BÁO HẰNG SỐ
Hằng số là một biến mang giá trị cố định và giá trị này chỉ được gán một lần khi
khởi tạo. Bất kỳ thao tác nào cố gắng thay đổi nội dung của hằng số đều là thao tác
không hợp lệ.
Việc khai báo hằng số cũng giống như việc khai báo biến, nhưng bạn cần đặt thêm
từ khóa Const. sau Dim, Global hoặc Local. Có dạng như sau :
Const $pi = 3.14 ; hằng số cục bộ
Local $text = "Hello" ; hằng số cục bộ
Global Const $e = exp(1) ; hằng số toàn cục
Chú ý : bạn không thể khai báo một hằng số trùng tên với một biến đang tồn tại.
KHAI BÁO MỘT MẢNG
Mảng thực chất là một tập hợp các biến có cùng kiểu dữ liệu được gọi chung
bằng một tên. Các biến trong một mảng thường được gọi là "phần tử" và được
truy cập đến bởi chỉ mục. Các mảng có thể có một hay nhiều chiều, thông
dụng nhất là mảng một chiều (danh sách) và mảng hai chiều (ma trận gồm
hàng và cột).
MẢNG MỘT CHIỀU (DANH SÁCH)
Mảng một chiều là dãy gồm nhiều mục liên tiếp nhau. Bạn cứ hình dung nó như
là một cái danh sách. Cũng có số thứ tự, cũng có thông tin (dữ liệu) ứng với thứ tự
đó.
Hình thức cơ bản cho việc khai báo mảng một chiều là :
<scope> <var_name>[<size>]
<scope> : cho biết đây là biến Local, Global hay Dim
<var_name> : là tên biến đại diện cho tất cả các phần tử trong mảng.
Tuân thủ theo các qui tắc đặt tên như khai báo biến.
<size> : cho biết có tối đa bao nhiêu phần tử sẽ chứa trong mảng.
Ví dụ như, để khai báo một mảng toàn cục có 100 phần tử gọi tên là List và sau đó
gán các giá trị cho mảng, ta sử dụng câu lệnh : Error! Global List[100]
List[0] = "Ant"
List[1] = "Bird"
List[2] = "Cat"
.....
List[99] = "Zebra"
Trong AutoIt, chỉ mục đầu tiên của mảng phải bắt đầu từ 0. Với ví dụ trên, nếu ta
dùng List[0], List[1] là ta đang truy cập đến phần tử thứ nhất, thứ hai. Dùng
List[99] là ta đang truy cập đến phần tử thứ 100. Việc sử dụng chỉ mục vượt quá
chỉ mục tối đa cho phép khi khai báo là không hợp lệ.
Muốn lấy một giá trị từ một phần tử trong mảng, ta phải biết được chỉ mục của
phần tử chứa giá trị đó. Ví dụ :
$animal = $List[2] ; $animal sẽ chứa chuỗi "Cat"
MẢNG HAI CHIỀU (MA TRẬN)
Một mảng hai chiều chính là một ma trận được tạo thành bởi hàng và cột. Nếu bạn
đã biết qua Excel thì bảng tính trong Excel chính là một ma trận. Hình thức chung
cho việc khai báo mảng hai chiều cũng tương tự như mảng một chiều, nhưng có
thêm việc khai báo chỉ mục thứ hai. Trong mảng hai chiều, chỉ mục thứ nhất cho
biết hàng và chỉ mục thứ hai là cột.. Cụ thể là :
<scope> <var_name> [<size_row>][<size_column>]
Trong đó :
<scope> cũng dùng để chỉ định phạm vi
<var_name> chỉ định tên mảng
<size_row> chỉ định số dòng tối đa
<size_column> chỉ định số cột tối đa
Ví dụ : Error! Dim $matrix[2][3] ; tạo một ma trận có 2 dòng và 3 cột
$matrix[0][0] = 2
$matrix[0][1] = 4
$matrix[0][2] = 6
$matrix[1][0] = 1
$matrix[1][1] = 3
$matrix[1][2] = 5
Để truy cập đến một phần tử trong mảng ta cũng sử dụng chỉ mục cho dòng và cột.
Ví dụ :
; đang truy cập đến phần tử ở dòng thứ nhất, cột thứ hai.
$n = $matrix[0][1] ; $n sẽ bằng 4
CÁC VẤN ĐỀ LIÊN QUAN
Vấn đề 1 : Khởi tạo giá trị cho mảng
Khi khai báo một mảng bạn cũng có thể khởi tạo giá trị cho các phần tử bên trong
mảng. Các giá trị khi khởi tạo cho mảng phải được nằm trong cặp dấu ngoặc vuông
[ ], và mỗi giá trị phải được ngăn cách bởi dấu phẩy. Đối với mảng hai chiều thì
cần thêm một cặp dấu ngoặc vuông khác để rào các giá trị có cùng chỉ mục dòng.
Ví dụ :
Dim $array[5] = [10, 20, 30, 40, 50]
Local $test[4] = ["a", "Hello", 500, 4.55]
Global $Grid[2][3] = [["sun", "moon", "earth"], [1000, cos(0), sqrt(900)]]
Vấn đề 2 : Lấy tổng số phần tử hiện có trong mảng
Sẽ có không ít tình huống bạn tiếp nhận và xử lý một mảng có nhiều phần tử bên
trong. Tuy nhiên có một rắc rối là bạn không biết mảng này hiện đang có bao nhiêu
phần tử, vì nó thay đổi theo chu kỳ hay một lý do nào đó. Với trường hợp này, sử
dụng hàm UBound là một lời giải vì nó sẽ cho biết một mảng được chỉ định có bao
nhiêu phần tử. Cú pháp như sau :
UBound( $array, $dimension)
Trong đó,
$array : là tên của một biến mảng
$dimension : cho biết cần lấy ở chiều thứ mấy. Mặc định là 1, tức mảng một
chiều. Nếu gán bằng 0, thì UBound không trả về tổng số phần tử hiện có, mà sẽ trả
về một số tương ứng với số chiều của mảng.
Ví dụ :
Dim $myArray[10][20] ;element 0,0 to 9,19
$rows = UBound($myArray) ; lấy chiều thứ nhất
$cols = UBound($myArray, 2) ; lấy chiều thứ hai
$dims = UBound($myArray, 0) ; lấy số chiều của mảng
$info = "This Array has " & $dims &" dimension(s) : " &@CRLF & _
$rows & " rows, " & $cols & " columns"
MsgBox(0, "Msg of Array", $info)
Dấu _ đặt ở cuối dòng lệnh $info = ... cho biết, phần tiếp theo của dòng lệnh hiện
hành được viết ở dòng kế tiếp. Thông thường việc này xảy ra do một lệnh quá dài,
khi viết trên một dòng thì vượt quá trang màn hình, rất khó quan sát. Cho nên cách
này được dùng như một giải pháp.
Vấn đề 3 : Thiết lập lại kích thước của một mảng
Theo qui định, nếu muốn sử dụng một biến mảng thì trước đó phải khai báo tên, số
chiều và kích thước tối đa để chứa các phần tử. Trong trường hợp bạn muốn định
lại kích thước cho mảng đó (tăng hoặc giảm kích thước) thì việc bạn cần làm là sử
dụng từ khóa ReDim . Cú pháp chung :
ReDim $array [new index 1] ... [new index n]
$array : là tên của mảng cần định lại kích thước
New index : kích thước mới cho tổng số phần tử đối đa sẽ có trong mảng. [new
index n] áp dụng cho chiều thứ n của mảng.
Bạn xem ví dụ sau để hiểu rõ hơn cách thức làm việc. Đoạn mã bên dưới sẽ minh
họa việc thiết lập lại kích thước tối đa cho mảng một chiều.
; khai báo kích thước ban đầu
Dim $a[5] = [2, 4, 6, 8, 10]
ConsoleWrite("Before : ")
For $i=0 to UBound($a)-1
ConsoleWrite($a[$i] & " ")
Next
; Định lại kích thước mảng
ReDim $a[3]
ConsoleWrite(@crlf & "After rediming : " )
For $i=0 To 2
ConsoleWrite($a[$i] & " ")
Next
Đầu tiên ta khai báo mảng $a có năm phần tử, sau đó dùng vòng lặp For thứ nhất
để in nội dung ra console. Đến dòng lệnh ReDim $a[3] sẽ định lại kích thước của
mảng từ ban đầu là năm phần tử xuống còn ba phần tử. Khi kích thước mới nhỏ
hơn kích thước cũ, thì phần nội dung phía sau sẽ bị cắt bỏ. Cho nên vòng lặp For
thứ hai sẽ chỉ in các giá trị 2, 4 và 6.
Chú ý : Khi thiết lập lại kích thước cho một biến mảng, nếu bạn thay đổi số chiều
của mảng từ mảng một chiều thành hai chiều, hoặc ngược lại, thì tất cả dữ liệu
đang có trong mảng sẽ bị xóa hoàn toàn.
Vấn đề 4 : Các chú ý
+ Chỉ mục của mảng có thể là một biến hoặc một biểu thức, sao cho nó trả về một
chỉ mục hợp lệ. Vì thế bạn có thể làm nhiều cách khác nhau để truy xuất đến các
phần tử bên trong mảng. Cũng xin nhắc lại rằng, tất cả các mảng đều có 0 làm chỉ
mục cho phần tử thứ nhất.
Ví dụ sau minh họa cho việc khởi tạo các giá trị ngẫu nhiên cho mảng một và hai
chiều.
; khởi tạo và in giá trị cho mảng một chiều
Dim $a[10]
ConsoleWrite("---- A list : "& @crlf)
For $i=0 To 9
$a[$i] = Int(Random(0, 100))
ConsoleWrite($a[$i] & " ")
Next
; khởi tạo và in giá trị cho mảng hai chiều
Dim $m [4] [5]
ConsoleWrite(@crlf & "---- A matrix : " & @crlf)
For $i=0 To 3
For $j=0 to 4
$m[$i][$j] = Int(Random(0,10))
ConsoleWrite($m[$i][$j] & " ")
Next
ConsoleWrite(@crlf)
Next
+ Theo lý thuyết, các phần tử trong mảng phải có cùng kiểu dữ liệu, hoặc là số,
hoặc là chuỗi. Nhưng trong AutoIt, một mảng có thể chứa mọi thứ, từ một số cho
đến một boolean. Nói đơn giản là có thể chứa các phần tử có kiểu dữ liệu khác
nhau. Tuy nhiên, điều này không được khuyến khích. Ví dụ :
$arr[0] = 1
$arr[1] = true
$arr[2] = "my text"
$arr[3] = $another_array
+ Một mảng trong AutoIt chỉ cho phép chứa tối đa 224 (16 777 216) phần tử.
MACRO
Macro hiểu đơn giản là các lệnh ngắn gọn được thiết kế sẵn để lấy các thông tin từ
hệ thống hoặc ứng dụng. Giá trị của chúng có thể không cố định vì phụ thuộc vào
vào hệ thống. Trong AutoIt, các macro được bắt đầu với ký tự @ và theo sau tên
của macro. Bên dưới là các Macro thường được dùng .
Macro thời gian
@MSEC Mili giây hiện tại của đồng hồ hệ thống. Vùng giá trị từ 00 đến 999
@SEC Giây hiện tại. Vùng giá trị từ 00 đến 59
@MIN Phút hiện tại. Vùng giá trị từ 00 đến 59
@HOUR Giờ hiện tại, theo dạng 24 giờ. Vùng giá trị từ 00 đến 23
@MDAY Ngày hiện tại trong tháng. Vùng giá trị từ 01 đến 31
@MON Tháng hiện tại. Vùng giá trị từ 01 đến 12
@YEAR Bốn ký số của năm hiện hành
@WDAY Thứ trong tuần. Vùng giá trị từ 01 đến 7, tương ứng : 1=CN, 2=
Thứ 2,...
@YDAY Ngày hiện tại là ngày thứ bao nhiêu trong năm. Vùng giá trị từ 01
đến 366 (hoặc 365 nếu không phải năm nhuận)
Macro thư mục
Áp dụng cho tất cả người dùng (All User). Các giá trị đọc từ :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
@AppDataCommonDir đường dẫn đến thư mục Application Data
@DesktopCommonDir đường dẫn đến thư mục Desktop
@DocumentsCommonDir đường dẫn đến thư mục Documents
@FavoritesCommonDir đường dẫn đến thư mục Favorites
@ProgramsCommonDir đường dẫn đến thư mục Start Menu's Programs
@StartMenuCommonDir đường dẫn đến thư mục Start Menu
@StartupCommonDir đường dẫn đến thư mục Startup
Phần này áp dụng cho người dùng hiện hành. Các giá trị đọc từ :
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion
@AppDataDir đường dẫn đến thư mục Application Data của người dùng.
@DesktopDir đường dẫn đến thư mục Desktop của người dùng
@MyDocumentsDir đường dẫn đến thư mục My Document
@FavoritesDir đường dẫn đến thư mục Favorites
@ProgramsDir đường dẫn đến thư mục Programs (thư mục trên Start
Menu)
@StartMenuDir đường dẫn đến thư mục Start Menu
@StartupDir đường dẫn đến thư mục Startup
@UserProfileDir đường dẫn đến thư mục Profile
Phần này lấy các thông tin liên quan đến hệ thống máy tính
@HomeDrive Ký tự của ổ đĩa chứa thư mục home của user
@HomePath Một phần đường dẫn đến thư mục home. Sử dụng thêm
@HomeDrive&"\" để có đường dẫn đầy đủ
@HomeShare Thư mục home chứa tên Server và tên chia sẻ.
@LogonDNSDomain DNS Domain đã đăng nhập
@LogonDomain Domain đã đăng nhập.
@LogonServer Server đã đăng nhập
@ProgramFilesDir Đường dẫn đến thư mục Program Files
@CommonFilesDir Đường dẫn đến thư mục Common Files
@WindowsDir Đường dẫn đến thư mục Windows
@SystemDir Đường dẫn đến thư mục System của Windows (hoặc
System32)
@TempDir Đường dẫn đến thư mục chứa các file tạm
@ComSpec
Giá trị của %comspec%, (SPECified secondary
COMmand interpreter) dùng cho command line, ví dụ
: Run(@ComSpec & " /k help | more")
Macro hệ thống
@CPUArch Trả về "x86" cho CPU 32 bit và "x64" cho CPU 64 bit
@KBLayout Trả về mã hiển thị của bàn phím. Xem trong Appendix để
biết giá trị
@OSArch Trả về một trong các giá trị sau : "X86", "IA64", "X64" - cho
biết kiến trúc của hệ điều hành đang chạy.
@OSLang Trả về mã hiển thị của hệ điều hành. Xem trong Appendix
@OSType Trả về "WIN32_NT" cho Windows
NT/2000/XP/2003/Vista/2008.
@OSVersion Trả về một trong các giá trị sau : "WIN_2008",
"WIN_VISTA", "WIN_2003", "WIN_XP", "WIN_2000".
@OSBuild Trả về số xây dựng của Hệ điều hành. Ví dụ, Windows 2003
Server trả về 3790
@OSServicePack Gói dịch vụ của hệ điều hành dạng như "Service Pack 3"
hoặc, đối với Windows 95, nó có thể trả về "B"
@ComputerName Tên mạng của máy tính.
@UserName ID của người dùng đã đăng nhập hiện hành .
@IPAddress1 Địa chỉ IP của card mạng thứ nhất. Có thể trả về 127.0.0.1
trên vài máy tính
@IPAddress2 Địa chỉ IP của card mạng thứ hai. Returns 0.0.0.0 nếu không
dùng được
@IPAddress3 Địa chỉ IP của card mạng thứ ba. Returns 0.0.0.0 nếu không
dùng được
@IPAddress4 Địa chỉ IP của card mạng thứ tư. Returns 0.0.0.0 nếu không
dùng được
@DesktopHeight Chiều cao của màn hình desktop (pixel)
@DesktopWidth Chiều rộng của màn hình desktop (pixel)
@DesktopDepth Độ sâu của màn hình desktop (tính theo bit)
@DesktopRefresh Tần số làm tươi của màn hình, tính theo hezt (hz)
Macro liên quan đến AutoIt
Phần này chỉ trình bày một số Macro thông dụng. Các macro còn lại các bạn tự
xem.
@compiled Trả về 1 nếu mã đã được biên dịch, ngược lại trả về 0
@error Cờ biểu thị trạng thái lỗi. Xem hàm SetError
@exitCode Mã thoát được thiết lập bởi lệnh Exit
@exitMethod Xem Func OnAutoItExit()
@extended Một giá trị mở rộng được trả về từ một hàm. Xem hàm
StringReplace
@NumParams Tổng số thông số đã sử dụng trong việc gọi hàm của người
dùng..
@ScriptName Tên của file script đang chạy
@ScriptDir Đường dẫn đến thư mục chứa file script đang chạy. (không
chứa dấu "\" ở cuối )
@ScriptFullPath Bằng với @ScriptDir & "\" & @ScriptName
@ScriptLineNumber Số thứ tự của dòng lệnh đang được thi hành. Thích hợp
cho việc debug.
@WorkingDir Thư mục làm việc hiện tại (không chứa dấu "\" ở cuối)
@AutoItExe
Đường dẫn và tên của file AutoIt đang chạy. Nếu là mã đã
biên dịch thì trả về đường dẫn và tên của file exe đang
chạy
@AutoItPID ID của đoạn chương trình script đang chạy trong bộ nhớ
@AutoItVersion Số phiên bản của AutoIt như 3.0.102.0
@AutoItX64 Trả về 1 nếu đang chạy dưới AutoIT phiên bản x64
@InetGetActive Là 1 nếu một InetGet download đã được kích hoạt, ngược
lại là 0.
@InetGetBytesRead Suốt quá trình InetGet download, macro này cho số byte đã
đọc. Cho -1 nếu có một lỗi download.
@CR Phím xuống dòng, Chr(13); đôi lúc hữu dụng cho các ngắt
dòng
@LF Tín hiệu xuống dòng, Chr(10); đặc trưng cho việc ngắt
dòng
@CRLF = @CR & @LF ; đôi lúc hữu dụng cho các ngắt dòng
@TAB Phím Tab, Chr(9)
CÂU LỆNH ĐIỀU KIỆN IF
Câu lệnh if là một câu lệnh điều kiện phổ biến nhất trong các ngôn ngữ lập trình
bậc cao. Nó được dùng để kiểm tra một điều kiện nào đó, nếu dúng thì thực hiện
công việc tương ứng, ngược lại thì làm một việc khác. Nếu bạn đã học qua Excel
thì chắc chắn phải biết hàm If bên đó. Với AutoIt, câu lệnh điều kiện if được thành
lập thành một khối. Để đơn giản, ta chia thành các phần nhỏ để dễ trình bày.
Dạng chung của If :
If <điều kiện> Then
<các câu lệnh>
............
Else
<các câu lệnh>
.........
EndIf
Như trình bày ở trên ta thấy rằng, một khối lệnh If phải được bắt đầu với If... Then
và kết thúc với EndIf.
<điều kiện> là một biểu thức so sánh (có sử dụng các toán tử so sánh, logic như :
<, >, <> , =,...And, Or, Not) hoặc một biểu thức thường có trả về giá trị. Nếu điều
kiện trả về True thì <các câu lệnh> sau Then được thực hiện. Nếu ngược lại thì
<các câu lệnh> sau Else được thực hiện, không bao giờ xảy ra hai trường hợp cùng
một lúc. Cũng xin nhắc lại, nếu <điều kiện> trả về một giá khác 0 thì có nghĩa
True, bằng 0 là False.
<các câu lệnh> có thể là một hay nhiều dòng lệnh, hoặc cũng có thể là lệnh rỗng.
Hoặc cũng có thể là một khối điều kiện If khác.
Mệnh đề Else thì tự chọn, có thể có hoặc không. Nếu Else không tồn tại thì khi
<điều kiện> là False thì chương trình sẽ thực hiện tiếp các lệnh nằm sau EndIf.
Ví dụ đơn giản sau xét xem số chỉ định là chẵn hay lẻ.
$n = 101
If Mod($n, 2)=0 Then
MsgBox(0, "Ket qua", $n & " là số chẵn")
Else
MsgBox(0, "Ket qua", $n & " là số lẻ")
EndIf
Hàm Mod có chức năng tìm số dư của phép chia giữa $n và 2. Cú pháp chung là
Mod( a, b). Trong đó a là số bị chia và b là số chia.
Các If lồng nhau :
If được lồng nhau là một If nằm bên trong một khối If...EndIf khác. Các If lồng
nhau được dùng rất phổ biến trong lập trình, thông thường là trong trường hợp
thẩm định một <điều kiện> với nhiều giả thiết xảy ra khác nhau. Trong các If lồng
nhau thì lệnh Else luôn có mối quan hệ liên kết với khối If (chưa có EndIf ) nằm
gần nó nhất.
Ví dụ sau là một bổ sung của ví dụ phía trên, xét xem thêm điều kiện để biết số đó
có phải là số có 3 chữ số hay không.
$n = 1010
If Mod($n, 2)=0 Then
If 100<=$n And $n<=999 Then
MsgBox(0, "Ket qua", $n & " là số chẵn có 3 chữ số")
Else
MsgBox(0, "Ket qua", $n & " là số chẵn không phải 3 chữ số")
EndIf
Else
If 100<=$n And $n<=999 Then
MsgBox(0, "Ket qua", $n & " là số lẻ có 3 chữ số")
Else
MsgBox(0, "Ket qua", $n & " là số lẻ không phải 3 chữ số")
EndIf
EndIf
Bước thang If... ElseIf... Else... EndIf
Với hai phần vừa được trình bày ở trên thì có lẻ bạn đã hiểu được phần nào khối
lệnh If và có thể sử dụng nó để giải quyết nhiều bài toán có yêu cầu điều kiện.
Trong phần các khối If lồng nhau, chỗ lồi lõm là một kỹ thuật đúng. Tuy nhiên, khi
có quá nhiều If được lồng vào nhau thì đoạn mã của bạn sẽ bị lõm vào rất sâu. Vì
lý do này mà bước thang If..ElseIf... được dùng. ElseIf là một từ khóa của AutoIt,
báo hiệu việc thẩm định điều kiện If tiếp theo. Cú pháp :
If <điều kiện 1> Then
<các câu lệnh 1>
.........
ElseIf <điều kiện 2> Then
<các câu lệnh 2>
..........
ElseIf <điều kiện n> Then
<các câu lệnh n>
...........
Else
<các câu lệnh>
........
EndIf
Xin nói luôn với các bạn một điều, cú pháp này mới chính là cú pháp tổng quát
nhất của khối lệnh If. Hai phần : “Dạng chung của If” và “Các if lồng nhau” thực
chất được tách từ đây mà ra. Cho nên từ đây trở đi, khi sử dụng If bạn chỉ cần quan
tâm đến phần này. Đến đây cũng xin giải thích lại để bạn hiểu và ghi nhớ.
Các <điều kiện> được thẩm định từ trên xuống. Nếu <điều kiện 1> là True, thì
<các câu lệnh 1> được thi hành. Ngược lại thì kiểm tra <điều kiện 2> , nếu đúng
thì thi hành <các câu lệnh 2>. Việc ước lượng được xét dần đến <điều kiện n>.
Nếu sau tất cả các lần thẩm định, không một điều kiện nào thỏa mãn và Else có tồn
tại, thì các lệnh sau Else được thi hành. Ví dụ sau minh họa rõ việc dùng khối If
tổng quát .
Dim $var = '-5'
If $var > 0 Then
MsgBox(4096,"", "Value is positive.")
ElseIf $var < 0 Then
MsgBox(4096,"", "Value is negative.")
Else
If StringIsXDigit ($var) Then
MsgBox(4096,"", "Value might be hexadecimal!")
Else
MsgBox(4096,"", "Value is either a string or is zero.")
EndIf
EndIf
Chú ý
Trong trường hợp câu lệnh If bạn sử dụng, chỉ có một lệnh sau Then và
không có phần Else thì có thể viết gọn như sau :
If <điều kiện> Then <câu lệnh>
Ví dụ :
$v='05'
if StringIsDigit($v) Then MsgBox(0,'msg','It is a number')
; các lệnh không thuộc If có thể viết tiếp ở đây
Trong các câu lệnh điều kiện (như If) thì việc dùng dấu ngoặc đơn ( ) là
không thể thiếu nếu như bạn muốn thẩm định các điều kiện một cách chính
xác, vài bài toán yêu cầu được kiểm tra với nhiều điều kiện lồng vào nhau,
một kết quả không mong muốn có thể được đưa ra nếu như bạn không gom
nhóm các điều kiện hoặc gom nhóm không đúng. Bạn xem ví dụ sau cho
thấy cách thức xét điều kiện của khối If thứ nhất và khối If thứ hai là hoàn
toàn khác nhau :
Dim $a=0, $b =2, $c=0
if ($a>0 And $b>0) Or $c=0 Then MsgBox(0,"msg", " Thông
điệp 1")
if $a>0 And ($b>0 Or $c=0) Then MsgBox(0,"msg", " Thông
điệp 2")
CÂU LỆNH ĐIỀU KIỆN SELECT
Khối lệnh Select thực chất là một dạng khác của If lồng nhau, được dùng như một
dạng trình bày có hiệu quả hơn trong việc thẩm định nhiều điều kiện liên tiếp.
Dạng tổng quát của Select như sau :
Select
Case <điều kiện 1>
<các câu lệnh>
......
Case <điều kiện 2>
<các câu lệnh>
........
Case Else
<các câu lệnh>
........
EndSelect
Giải thích
<điều kiện> : cũng tương tự như khối lệnh If, cũng sử dụng các toán tử so sánh
và logic.
<các câu lệnh> : có thể là bất cứ lệnh gì, kể cả các khối Select , Switch hay If
khác đều được.
Case Else : có thể có hoặc không.
Hình thức xét điều kiện cũng bắt đầu từ trên xuống. Kiểm tra <điều kiện 1> nếu
thỏa thì thực hiện <các câu lệnh> sau nó. Ngược lại, thì xét <điều kiện 2>,
<điều kiện 3>, cho đến <điều kiện thứ n>. Nếu không có <điều kiện> nào thỏa
thì <các câu lệnh> sau Case Else sẽ được thực thi, nếu như Case Else được thiết
lập. Trong trường hợp có nhiều <điều kiện> đúng, thì chỉ <điều kiện> đúng đầu
tiên được tìm thấy mới được thi hành.
Ví dụ 1 :
$s = 3
$n = 5
Select
case IsString($s)
MsgBox(0,"msg", "$s là chuỗi")
Case $n<>0
MsgBox(0,"msg", "$n là số khác 0")
Case Else
MsgBox(0,"msg", "$s không là chuỗi. $n không là số")
EndSelect
Hàm IsString xét xem một giá trị nào đó có phải là chuỗi hay không. Nếu đúng trả
về 1, ngược lại trả về 0.
Ví dụ 2 :
; đoạn mã này cho biết hệ điều hành đang sử dụng
$ver = @OSVersion
Select
Case $ver = "WIN_2008"
MsgBox(0,"Version", "Your OS is Win 2008")
case $ver = "WIN_VISTA"
MsgBox(0,"Version", "Your OS is Win Vista")
Case $ver = "WIN_2003"
MsgBox(0,"Version", "Your OS is Win 2003")
Case $ver = "WIN_XP"
MsgBox(0,"Version", "Your OS is Win XP")
Case $ver ="WIN_2000"
MsgBox(0,"Version", "Your OS is Win 2000")
case Else
MsgBox(0,"Version", "Your OS is Win 9x")
EndSelect
CÂU LỆNH SWITCH
Không giống như khối lệnh If hay Select thực hiện thẩm định nhiều điều kiện của
bài toán. Trong khối lệnh Switch, ứng với một biến cho phép bạn lựa chọn nhiều
giá trị hoặc là miền giá trị để làm điều kiện xử lý. Vì vậy mà Switch còn được gọi
là lệnh lựa chọn đa nhánh. Thực chất việc xét từng giá trị cho một biến vẫn có thể
làm được với hai khối lệnh If hay Select , nhưng ở Switch cách thức làm việc đã
được đơn giản để có thể thực hiện nhanh chóng và dễ hiểu hơn.
Cú pháp tổng quát :
Switch <biến hoặc biểu thức>
Case <value1> To <Value2> , < value3> To <value4> , ....., <value
n-1> To <value n>
<các câu lệnh>
.......
Case <value1> To <Value2> , < value3> To <value4> , ....., <value
n-1> To <value n>
<các câu lệnh>
........
Case Else
<các câu lệnh>
.......
EndSwitch
Giải thích
Giá trị của <biến hoặc biểu thức> sẽ được lấy và kiểm tra lần lượt theo thứ tự
các Case. Khi một giá trị trong Case phù hợp giá trị của <biến hoặc biểu thức>
thì các dãy lệnh liên hợp với Case đó được thi hành. Các Case lần lượt được
duyệt cho đến khi gặp một Case thỏa điều kiện hoặc từ khóa EndSwitch cùng
cấp. Nếu Case Else được chỉ định, thì khi tất cả các Case đều không thỏa, khối
lệnh liên kết với Case Else sẽ được thực thi.
Chú ý
<value1> To <value2> hoặc <value n-1> To <value n> là một miền giá
trị. Nếu bạn không muốn chỉ định các miền giá trị cho Case thì có thể chỉ
định những giá trị cụ thể, mỗi giá trị cách nhau bởi dấu phẩy. Từ khóa To và
các phần sau nó thì tùy, có thể có hoặc không.
<các câu lệnh> có thể là bất cứ một lệnh gì, thậm chí là nhiều khối
Switch lồng nhau.
Ví dụ :
Đoạn mã sau sẽ lấy giờ của hệ thống và suy ra thời điểm hiện tại trong ngày
Switch @HOUR
Case 6 To 11
$msg = "Good Morning"
Case 12 To 17
$msg = "Good Afternoon"
Case 18 To 21
$msg = "Good Evening"
Case Else
$msg = "What are you doing now ?"
EndSwitch
MsgBox(0, Default, $msg)
CONTINUECASE
Theo như mặc định, thì trong khối lệnh Switch và Select sẽ dừng việc kiểm tra
điều kiện và kết thúc nếu gặp được một Case trả về giá trị True. Tuy nhiên trong
một vài tình huống, bạn lại không muốn kết thúc khối lệnh Select hay Switch khi
gặp một trường hợp đúng, bạn muốn nó vẫn thực hiện kiểm tra các Case phía sau
để làm một công việc nào đấy. Thông thường, đối với một Case thỏa điều kiện và
đang thi hành các lệnh liên kết với nó, thì việc thi hành chỉ dừng lại khi gặp một
lệnh Case tiếp theo hoặc lệnh EndSwitch hay EndSelect.
Thì ở đây, AutoIt hỗ trợ cho bạn từ khóa ContinueCase để dừng việc thực hiện một
Case hiện tại và duyệt đến các lệnh nằm trong Case tiếp theo.
Cú pháp : ContinueCase
Ví dụ sau sử dụng hàm InputBox và cờ lỗi @error của nó để minh họa việc dùng
ContinueCase.
$msg = ""
$w = InputBox(Default, "Please enter a word.", "", " M", Default,
Default, Default, Default, 5)
Switch @error
Case 2
$msg = "Timeout "
ContinueCase
Case 1 ; Continuing previous case
$msg &= "Cancellation"
Case 0
Switch $w
Case "a", "e", "i", "o", "u"
$msg = "Vowel"
Case "QP"
$msg = "Mathematics"
Case "Q" to "QZ"
$msg = "Science"
Case Else
$msg = "Others"
EndSwitch
Case Else
$msg = "Something went horribly wrong."
EndSwitch
MsgBox(0, Default, $msg)
Hàm InputBox sẽ hiện ra trong vòng 5 giây để chờ bạn gõ một ký tự. Sau 5 giây,
nếu bạn không thao tác gì, hộp thoại sẽ tự đóng và hiện thông báo “Timeout
Cancellation”. Nếu bạn nhấn nút Cancel thì hiện thông báo “Cancellation”. Nếu
bạn gõ một từ hay ký tự và nhấn OK thì các khối lệnh bắt đầu từ Case 0 sẽ thực thi
để hiện thông báo tương ứng với từ bạn vừa gõ. Cờ lỗi @error cho biết trạng thái
tác động của người dùng đối với hàm InputBox. Bạn xem cú pháp của hàm
InputBox trong file Help hoặc trong mục Hàm của ebook này để hiểu rõ thêm.
VÒNG LẶP FOR
Trong AutoIt và tất cả các ngôn ngữ lập trình hiện đại khác, các lệnh lặp (cũng còn
được gọi là vòng lặp) cho phép thực hiện lặp đi lặp lại cho đến khi một điều kiện
nào đó xảy ra. Tùy theo ngôn ngữ và tùy loại vòng lặp mà cách diễn đạt điều kiện
sẽ khác nhau. Thông thường vòng lặp For là vòng lặp cơ bản, cho phép thực hiện
lặp lại với số lần định trước.
AutoIt hỗ trợ vòng lặp For với dạng tổng quát sau :
For <var> = <start_value> To <stop_value> Step <step_value>
<các câu lệnh>
.........
Next
Giải thích
<var> : biến dùng để thực hiện việc đếm
<start_value> : giá trị bắt đầu cho biến đếm
<stop_value > : giá trị cuối cùng cho biến đếm
<step_value> : giá trị cộng vào cho biến đếm sau mỗi lần lặp. Mặc định là 1.
<các câu lệnh> : công việc cần xử lý. Vẫn có thể là For hay những vòng lặp
khác đều được.
Vòng lặp For được bắt đầu bởi từ khóa For và kết thúc bởi từ khóa Next. Đầu tiên,
<start_value> sẽ được gán vào biến đếm <var> , sau đó so sánh với <stop_value>.
Nếu <var> nhỏ hơn hoặc bằng <stop_value> thì thực hiện <các câu lệnh> , sau đó
biến đếm <var> sẽ được tăng lên <step_value> đơn vị. Tiếp tục so sánh với
<stop_value> , thực hiện <các câu lệnh> rồi sau đó tăng biến đếm lên
<step_value> . Quá trình lặp lại cho đến khi biến đếm <var> lớn hơn
<stop_value>, vòng lặp kết thúc.
Miêu tả cụ thể đối với vòng lặp For như trình bày ở trên xem ra có vẻ dài dòng.
Bạn chỉ cần hiểu đơn giản là, vòng lặp For sẽ cho biến đếm <var> chạy từ
<start_value> đến <stop_value>, mỗi lần lặp thì cộng <step_value> vào <var>.
Chú ý
Phần Step <step_value> có thể có hoặc không. Nếu không có, thì giá trị
mặc định cho <step_value> sẽ bằng 1. Trường hợp <step_value> là một số
âm và <start_value> lớn hơn <stop_value> thì ta có một vòng lặp đếm
ngược.
Nếu như <stop_value> và <step_value> là các biến, thì giá trị của các
biến này chỉ được đọc một lần ở lần lặp đầu tiên. Ở các lần lặp sau, cho dù
bạn thay đổi giá trị cho <stop_value> hay <step_value> thì chu kỳ lặp vẫn
không thay đổi.
Bên trong vòng lặp, nếu bạn sử dụng một biến không có khai báo, thì
mặc định nó sẽ được tạo với phạm vi cục bộ (Local).
Vòng lặp For sẽ không thực hiện bất kỳ lần lặp nào nếu như :
start_value >stop_value và step_value >= 0
Hoặc start_value < stop_value và step_value là một số âm.
Ví dụ
Đoạn mã sau được dùng để in các con số từ 1 đến 100 lên màn hình console
của sciTe.
For $i=1 to 100
ConsoleWrite($i & " ")
Next
MsgBox(0, "Thong bao", " Vòng lặp kết thúc ")
Đoạn mã sau thực hiện việc đếm ngược và chỉ in các con số chẵn từ 100 về
0
For $i=100 to 0 step -2
ConsoleWrite($i & " ")
Next
MsgBox(0, "Thong bao", " Vòng lặp kết thúc ")
VÒNG LẶP WHILE ... WEND
Nếu như vòng lặp For thực hiện việc lặp với một biến chạy thì vòng lặp While thực
hiện việc lặp bằng việc kiểm tra điều kiện.
Cú pháp chung :
While <điều kiện>
<các câu lệnh>
......
WEnd
Giải thích
<điều kiện> có thể là một một biểu thức điều kiện và True là giá trị khác 0
<các câu lệnh > có thể là rỗng, lệnh đơn, khối lệnh hoặc là các vòng lặp khác.
Trước khi các lệnh bên trong vòng lặp được thực thi, thì <điều kiện> được kiểm
tra. Nếu trả về giá trị True, thì <các câu lệnh> được duyệt và thi hành cho đến khi
gặp WEnd. Khi đó vòng lặp quay lại thẩm định <điều kiện>. Quá trình lặp kết
thúc khi <điều kiện> trả về False (tức không còn đúng nữa).
Chú ý
Số lần thực hiện của vòng lặp sẽ là 0, nếu như ngay bước kiểm tra <điều
kiện> lần đầu tiên, <điều kiện> cho một giá trị False.
Muốn tạo nên một vòng lặp vô tận, bạn chỉ cần thay thế <điều kiện> bằng
một giá trị khác 0.
Ví dụ
Đoạn mã này sẽ hiện 5 lần thông báo cho biết giá trị của biến $i
$i = 0
While $i <= 10
MsgBox(0, "Value of $i is:", $i)
$i = $i + 1
WEnd
MsgBox(0, "Thong bao", "While loop stoped. Script is exiting")
VÒNG LẶP DO... UNTIL
Tương tự như While... WEnd, khối lệnh Do ... Until cũng thực hiện việc lặp dựa
trên việc kiểm tra biểu thức điều kiện.
Cú pháp :
Do
<các câu lệnh>
........
Until <điều kiện>
Giải thích
Vòng lặp Do.. Until thực hiện việc lặp lại các lệnh bên trong nó khi <điều kiện> trả
về giá trị False. Có nghĩa là vòng lặp sẽ kết thúc nếu như <điều kiện> là đúng
(True).
Chú ý
Không giống như For và While, cả hai vòng lặp này đều thực hiện việc kiểm tra
điều kiện ở phần đầu của vòng lặp. Vòng lặp Do.. Until thực hiện việc kiểm tra
điều kiện sau khi <các câu lệnh> được thi hành. Điều này có nghĩa là Do...Until
luôn thực hiện việc lặp ít nhất một lần.
Ví dụ
Đoạn chương trình sau tính giá trị trung bình một dãy số (không biết trước có bao
nhiêu số) do người dùng nhập vào. Quá trình nhập số kết thúc khi người dùng nhập
vào số 0. Biến $sum sẽ cộng dồn các giá trị được nhập vào, $count sẽ đếm xem đã
qua bao nhiêu lần nhập số (tương ứng với số lần lặp lại).
Global $n, $count=0, $sum=0
Do
$n = InputBox("Get Data", "Please enter a number." &@crlf & "If
number is zero, stop entering data")
$sum += $n
$count += 1
Until $n=0
$count -= 1 ; bỏ qua lần nhập số 0
MsgBox(0,"Result", "Average of sum : " & $sum/$count)
FOR ... IN... NEXT
Chức năng của câu lệnh này là liệt kê các phần tử bên trong một mảng hoặc một
tập hợp object (đối tượng) COM (component object model)
Cú pháp
For <var> In <expression>
<các câu lệnh>
........
Next
Giải thích
<var> : biến sẽ được gán giá trị của từng phần tử trong <expression>
<expression> : một đối tượng COM hoặc một mảng có ít nhất một phần tử.
Chú ý
Nếu <expression> là một tập hợp object không có phần tử, thì đoạn script
sẽ bỏ qua việc lặp và <var> sẽ chứa một chuỗi rỗng.
Nếu <expression> không phải là object, cũng không phải là mảng, thì
đoạn script sẽ dừng với một lỗi được thông báo, trừ khi bạn có sử dụng trình
điều khiển COM Error.
Giả sử trường hợp <expression> bạn dùng là một mảng và bạn có thay
đổi giá trị của các phần tử trong mảng khi For...In đang chạy, thì giá trị đó sẽ
không được ánh xạ ngay vào trong mảng. Chỉ khi For... In kết thúc thì thay
đổi đó mới có hiệu lực.
Vòng lặp For...In cho phép lồng vào nhau.
Ví dụ 1
Global $array[4]
$array[0]="w"
$array[1]="x"
$array[2]="y"
$array[3]="z"
For $element In $array
MsgBox(0,"Current $array item",$element)
Next
Ví dụ 2
Đoạn mã sau sẽ thông báo cho bạn biết các cửa sổ Explorer nào đang mở
$oShell = ObjCreate("shell.application")
$oShellWindows=$oShell.windows
if Isobj($oShellWindows) then
$string=""
for $Window in $oShellWindows
$String = $String & $Window.LocationName & @CRLF
next
msgbox(0,"","You have the following windows open:" & @CRLF &
$String)
else
msgbox(0,"","you have no open shell windows.")
endif
WITH... ENDWITH
Trên thực tế câu lệnh With..EndWith không hề có chức năng của một vòng lặp,
nhưng do file Help của AutoIt xếp nó vào phạm trù của một vòng lặp nên ở đây ta
vẫn xem xét nó. Chức năng chính của câu lệnh này là đơn giản hóa việc tham chiếu
đến các biến kiểu Object có tên dài.
Cú pháp :
With <biểu thức>
<các câu lệnh>
.......
EndWith
Giải thích
<biểu thức> : là một biểu thức có kiểu Object
<các câu lệnh> : thao tác trên các biến được tham chiếu đến
Chú ý
Khối lệnh With không cho phép lồng vào nhau.
Ví dụ
Đoạn mã sau sẽ gọi trình duyệt web Internet Explorer với kích thước cửa sổ là
1024 và 768. Đồng thời truy cập vào trang Google.com
; đoạn mã này sử dụng object theo kiểu thông thường
$object = ObjCreate("InternetExplorer.Application.1")
$object.Visible = 1
$object.Height = 768
$object.Width = 1024
$object.Navigate("http://www.google.com/")
; đoạn mã này sử dụng object với With.. EndWith để đơn giản mã
lệnh
$object = ObjCreate("InternetExplorer.Application.1")
With $object
.Visible = 1
.Height = 768
.Width = 1024
.Navigate("http://www.google.com/")
EndWith
VÒNG LẶP VÔ TẬN
Trong lập trình, sẽ có không ít tình huống bạn cần xử lý một bài toán, mà giải thuật
bạn cần dùng là một vòng lặp không biết trước số lần lặp. Vì vậy, cách giải quyết
là dùng một vòng lặp vô tận. Thông thường trên windows, cách sử dụng phổ biến
nhất của vòng lặp vô tận là dùng để xử lý giao diện người dùng GUI và các tương
tác trên GUI, phần này được đề cập rõ trong phần tạo giao diện bằng AutoIt (Tham
chiếu GUI) của ebook này.
Để tạo một vòng lặp vô tận cho For, While hay Do thì nguyên tắc chung là làm cho
<điều kiện> của vòng lặp đó luôn luôn thỏa. Cụ thể là :
For $i = 0 To 0 Step
0
<lệnh>
.....
Next
While 1
<lệnh>
.....
WEnd
Do
<lệnh>
....
Until 0
Chú ý
Khi bạn muốn sử dụng một vòng lặp vô tận thì nên dùng While... WEnd
hoặc Do.. Until vì chúng ngắn gọn hơn For.
Vòng lặp While chỉ thực hiện lặp khi <điều kiện> trả về True (một giá trị
khác 0), cho nên ở đây ta sử dụng một giá trị đại diện là 1
Vòng lặp Do thực hiện lặp khi <điều kiện> trả về là False (giá trị 0 -
zero), cho nên phần <điều kiện> ta sẽ thay bằng số 0 để nó không bao giờ là
True.
Trong quá trình cho chạy vòng lặp vô tận và xử lý các lệnh một cách liên
tục như vậy sẽ làm cho hiệu suất của CPU bị chiếm dụng rất cao, khoảng vài
chục % (xem ở thẻ Performance trong Task Manager). Vì vậy, khi sử dụng
vòng lặp vô tận bạn phải cẩn thận, và ở vài trường hợp ta cần tạo ra khoảng
dừng giữa hai lần lặp liên tiếp để tránh quá tải cho CPU. Muốn tạo khoảng
dừng, ta sử dụng câu lệnh Sleep <mili giây> , trong đó 1000 mili giây = 1
giây. Tuy nhiên sẽ làm cho quá trình lặp bị chậm lại, thời gian xử lý sẽ dài
hơn.
Đọc đến đây có lẽ bạn sẽ thắc mắc một điều, làm sao dừng lại vòng lặp vô tận ?
Câu trả lời nằm ngay sau đây.
EXITLOOP
ExitLoop cho phép bạn kết thúc (ngắt) vòng lặp ngay lập tức mà không cần quan
tâm đến điều kiện của vòng lặp. Dạng đầy đủ :
ExitLoop [which loop]
Giải thích
Tham số [which loop] là tùy chọn, có thể có hoặc không. Nếu không được chỉ định
thì mặc định là 1. Chức năng của tham số này cho phép chỉ định vòng lặp nào cần
phải ngắt trong trường hợp có nhiều vòng lặp lồng nhau. Nếu có nhiều vòng lặp
lồng nhau, thì vòng lặp chứa lệnh ExitLoop là vòng lặp cấp 1 (vòng lặp hiện hành),
vòng lặp bao bên ngoài vòng lặp cấp 1 là vòng lặp cấp 2, bao bên ngoài vòng lặp
cấp 2 là vòng lặp cấp 3,... Vì vậy nếu [which loop]
= 1 tương ứng với vòng lặp cấp 1 (vòng lặp hiện hành)
= 2 tương ứng với vòng lặp cấp 2
= n tương ứng với vòng lặp cấp n
= 0 hoặc một số âm thì ExitLoop không có tác dụng ngắt.
Chú ý
Sử dụng ExitLoop bên ngoài vòng lặp là không được phép. Cũng tương tự như
vậy, nếu bạn chỉ định cho tham số [which loop] một cấp vòng lặp không có (hiểu
đơn giản là… giả sử như bạn chỉ có vòng lặp cấp 1, nhưng lại dùng ExitLoop 2
hoặc ExitLoop 3 thì tất nhiên sẽ bị báo lỗi)
Ví dụ
Đoạn mã sau minh họa việc dùng ExitLoop cho vòng lặp hiện hành. Vòng lặp vô
tận sẽ cho xuất hiện hộp thoại Running sum =... , yêu cầu bạn nhập vào một số
dương để tính tổng, quá trình lặp lại cho đến khi nào bạn nhập một số âm. Kết quả
được thông báo ra màn hình .
$sum = 0
While 1 ;use infinite loop since ExitLoop will get called
$ans = InputBox("Running sum =" & $sum, _
" Enter a positive number. (A negative number exits)")
If $ans < 0 Then ExitLoop
$sum = $sum + $ans
WEnd
MsgBox(0,"The sum was", $sum)
Ví dụ bên dưới minh họa việc dùng ExitLoop để ngắt vòng lặp cấp 2 (cụ thể là
While). Sau khi chạy sẽ có hai lần xuất hiện thông báo trên màn hình. Bạn chú ý
các giá trị $i và $j được thông báo để hiểu cách làm việc.
$i = 1
While $i<=2 ;đây là vòng lặp cấp 2
For $j=1 To 5 ;đây là vòng lặp cấp 1
If $j=3 Then ExitLoop
MsgBox(0,"msg", "$i = " & $i &" $j = " & $j)
Next
$i += 1
WEnd
CONTINUELOOP
Không như ExitLoop, lệnh ContinueLoop thực hiện ngay lần lặp kế tiếp của vòng
lặp, bỏ qua tất cả các lệnh đứng sau nó. Có dạng đầy đủ
ContinueLoop [which loop]
Giải thích
Tham số [which loop] của ContinueLoop hoàn toàn như ExitLoop. Cũng có thể có
hoặc không (mặc định là 1 - tức vòng lặp hiện hành). [which loop] bằng n, thì áp
dụng cho vòng lặp cấp n. [which loop] bằng 0 hoặc số âm thì ContinueLoop cũng
mất tác dụng.
Đối với vòng lăp For, ContinueLoop gây ra việc tăng giá trị của biến đếm, thực
hiện so sánh với giá trị dừng và chạy các lệnh như bình thường.
Đối với vòng lặp While và Do, ContinueLoop cũng bỏ qua các lệnh phía sau nó và
quay trở ra xét điều kiện của vòng lặp.
Chú ý
Cũng như ExitLoop, nếu bạn sử dụng ContinueLoop bên ngoài vòng lặp hoặc chỉ
định cho tham số [which loop] một vòng lặp không có thì sẽ bị báo lỗi.
Ví dụ
Đoạn mã sau minh họa việc dùng ContinueLoop cho vòng lặp cấp 1. Bảng thông
báo giá trị $i=2 sẽ không xuất hiện.
For $i=1 To 4
If $i=2 Then ContinueLoop
MsgBox(0, "message", "$i = " & $i)
Next
VÒNG LẶP VÔ TẬN
Trong lập trình, sẽ có không ít tình huống bạn cần xử lý một bài toán, mà giải thuật
bạn cần dùng là một vòng lặp không biết trước số lần lặp. Vì vậy, cách giải quyết
là dùng một vòng lặp vô tận. Thông thường trên windows, cách sử dụng phổ biến
nhất của vòng lặp vô tận là dùng để xử lý giao diện người dùng GUI và các tương
tác trên GUI, phần này được đề cập rõ trong phần tạo giao diện bằng AutoIt (Tham
chiếu GUI) của ebook này.
Để tạo một vòng lặp vô tận cho For, While hay Do thì nguyên tắc chung là làm cho
<điều kiện> của vòng lặp đó luôn luôn thỏa. Cụ thể là :
For $i = 0 To 0 Step
0
<lệnh>
.....
Next
While 1
<lệnh>
.....
WEnd
Do
<lệnh>
....
Until 0
Chú ý
Khi bạn muốn sử dụng một vòng lặp vô tận thì nên dùng While... WEnd
hoặc Do.. Until vì chúng ngắn gọn hơn For.
Vòng lặp While chỉ thực hiện lặp khi <điều kiện> trả về True (một giá trị
khác 0), cho nên ở đây ta sử dụng một giá trị đại diện là 1
Vòng lặp Do thực hiện lặp khi <điều kiện> trả về là False (giá trị 0 -
zero), cho nên phần <điều kiện> ta sẽ thay bằng số 0 để nó không bao giờ là
True.
Trong quá trình cho chạy vòng lặp vô tận và xử lý các lệnh một cách liên
tục như vậy sẽ làm cho hiệu suất của CPU bị chiếm dụng rất cao, khoảng vài
chục % (xem ở thẻ Performance trong Task Manager). Vì vậy, khi sử dụng
vòng lặp vô tận bạn phải cẩn thận, và ở vài trường hợp ta cần tạo ra khoảng
dừng giữa hai lần lặp liên tiếp để tránh quá tải cho CPU. Muốn tạo khoảng
dừng, ta sử dụng câu lệnh Sleep <mili giây> , trong đó 1000 mili giây = 1
giây. Tuy nhiên sẽ làm cho quá trình lặp bị chậm lại, thời gian xử lý sẽ dài
hơn.
Đọc đến đây có lẽ bạn sẽ thắc mắc một điều, làm sao dừng lại vòng lặp vô tận ?
Câu trả lời nằm ngay sau đây.
EXITLOOP
ExitLoop cho phép bạn kết thúc (ngắt) vòng lặp ngay lập tức mà không cần quan
tâm đến điều kiện của vòng lặp. Dạng đầy đủ :
ExitLoop [which loop]
Giải thích
Tham số [which loop] là tùy chọn, có thể có hoặc không. Nếu không được chỉ định
thì mặc định là 1. Chức năng của tham số này cho phép chỉ định vòng lặp nào cần
phải ngắt trong trường hợp có nhiều vòng lặp lồng nhau. Nếu có nhiều vòng lặp
lồng nhau, thì vòng lặp chứa lệnh ExitLoop là vòng lặp cấp 1 (vòng lặp hiện hành),
vòng lặp bao bên ngoài vòng lặp cấp 1 là vòng lặp cấp 2, bao bên ngoài vòng lặp
cấp 2 là vòng lặp cấp 3,... Vì vậy nếu [which loop]
= 1 tương ứng với vòng lặp cấp 1 (vòng lặp hiện hành)
= 2 tương ứng với vòng lặp cấp 2
= n tương ứng với vòng lặp cấp n
= 0 hoặc một số âm thì ExitLoop không có tác dụng ngắt.
Chú ý
Sử dụng ExitLoop bên ngoài vòng lặp là không được phép. Cũng tương tự như
vậy, nếu bạn chỉ định cho tham số [which loop] một cấp vòng lặp không có (hiểu
đơn giản là… giả sử như bạn chỉ có vòng lặp cấp 1, nhưng lại dùng ExitLoop 2
hoặc ExitLoop 3 thì tất nhiên sẽ bị báo lỗi)
Ví dụ
Đoạn mã sau minh họa việc dùng ExitLoop cho vòng lặp hiện hành. Vòng lặp vô
tận sẽ cho xuất hiện hộp thoại Running sum =... , yêu cầu bạn nhập vào một số
dương để tính tổng, quá trình lặp lại cho đến khi nào bạn nhập một số âm. Kết quả
được thông báo ra màn hình .
$sum = 0
While 1 ;use infinite loop since ExitLoop will get called
$ans = InputBox("Running sum =" & $sum, _
" Enter a positive number. (A negative number exits)")
If $ans < 0 Then ExitLoop
$sum = $sum + $ans
WEnd
MsgBox(0,"The sum was", $sum)
Ví dụ bên dưới minh họa việc dùng ExitLoop để ngắt vòng lặp cấp 2 (cụ thể là
While). Sau khi chạy sẽ có hai lần xuất hiện thông báo trên màn hình. Bạn chú ý
các giá trị $i và $j được thông báo để hiểu cách làm việc.
$i = 1
While $i<=2 ;đây là vòng lặp cấp 2
For $j=1 To 5 ;đây là vòng lặp cấp 1
If $j=3 Then ExitLoop
MsgBox(0,"msg", "$i = " & $i &" $j = " & $j)
Next
$i += 1
WEnd
CONTINUELOOP
Không như ExitLoop, lệnh ContinueLoop thực hiện ngay lần lặp kế tiếp của vòng
lặp, bỏ qua tất cả các lệnh đứng sau nó. Có dạng đầy đủ
ContinueLoop [which loop]
Giải thích
Tham số [which loop] của ContinueLoop hoàn toàn như ExitLoop. Cũng có thể có hoặc không (mặc định là 1 - tức vòng lặp hiện hành). [which loop] bằng n, thì áp
dụng cho vòng lặp cấp n. [which loop] bằng 0 hoặc số âm thì ContinueLoop cũng
mất tác dụng.
Đối với vòng lăp For, ContinueLoop gây ra việc tăng giá trị của biến đếm, thực
hiện so sánh với giá trị dừng và chạy các lệnh như bình thường.
Đối với vòng lặp While và Do, ContinueLoop cũng bỏ qua các lệnh phía sau nó và
quay trở ra xét điều kiện của vòng lặp.
Chú ý
Cũng như ExitLoop, nếu bạn sử dụng ContinueLoop bên ngoài vòng lặp hoặc chỉ
định cho tham số [which loop] một vòng lặp không có thì sẽ bị báo lỗi.
Ví dụ
Đoạn mã sau minh họa việc dùng ContinueLoop cho vòng lặp cấp 1. Bảng thông
báo giá trị $i=2 sẽ không xuất hiện.
For $i=1 To 4
If $i=2 Then ContinueLoop
MsgBox(0, "message", "$i = " & $i)
Next
Hàm là gì ?
Nói đơn giản, hàm là một chương trình con thực hiện một chức năng cụ thể nào đó
trong chương trình chính.
Tại sao lại gọi là chương trình con ? Bởi vì trong quá trình viết một ứng dụng, tất
nhiên sẽ có một vài đoạn chương trình được dùng đi dùng lại nhiều lần. Ví dụ như
bạn cần hiển thị một hộp thoại chứa thông báo ra màn hình chẳng hạn. Bạn viết nó
ở đầu chương trình để hiện thông báo bắt đầu chạy chương trình, đến cuối chương
trình thì viết lại để hiện thông báo kết thúc chương trình. Bạn thử hình dung nếu có
rất nhiều nơi trong chương trình chính của bạn muốn hiển thị thông báo ra màn
hình thì cảm giác của bạn sẽ như thế nào !? Thật chán ngấy và phí thời gian khi
phải ngồi gõ lại từng dòng lệnh cho một công việc là hiển thị thông báo ra màn
hình, trong khi ta đã viết nó ở rất nhiều nơi trong chương trình rồi. Điều này làm
cho công việc của bạn không hiệu quả, chương trình thì dài thêm và càng rối mắt.
Để giải quyết vấn đề này, các nhà tin học đã đưa ra một giải pháp. Đó là, chỉ viết
đoạn mã xử lý công việc ở một nơi nào đó trong chương trình chính. Sau đó, đặt
cho nó một cái tên, đưa cho nó các biến đại diện để tiếp nhận các dữ kiện cần xử lý
và chỉ cho nó cách thức để trả về kết quả. Do đoạn mã này nằm bên trong chương
trình chính, cho nên ta gọi nó là chương trình con (theo đúng nghĩa đen) hay còn
gọi là hàm.
Và cuối cùng, khi muốn sử dụng một hàm bạn chỉ cần quan tâm đến cách thức để
truyền dữ kiện cần xử lý cho nó và cách nó trả về một kết quả. Bạn không cần phải
bận tâm là bên trong nó làm việc như thế nào, các dòng lệnh được viết ra sao. Bạn
chỉ muốn có kết quả cuối cùng, hàm sẽ làm việc đó cho bạn.
Đối với AutoIt, thì để hiển thị một hộp thoại thông báo ra màn hình, AutoIt hỗ trợ
cho bạn hàm MsgBox mà bạn đã từng thấy ở các ví dụ. Cũng xin nhắc lại với bạn
một điều, sức mạnh của AutoIt nằm ở việc sử dụng các hàm được định nghĩa sẵn,
cho nên nếu bạn muốn tạo một ứng dụng hiệu quả thì việc định nghĩa và gọi hàm là
không thể thiếu.
Thông thường trong các ngôn ngữ khác (như Pascal) thì một hàm có trả về giá trị
cụ thể thì vẫn gọi là hàm. Nhưng nếu hàm đó không trả về một giá trị nào cả, các
lệnh bên trong chỉ xử lý những tác vụ mang tính “thủ tục” nên còn được gọi là thủ
tục. Tuy nhiên, AutoIt không có khái niệm thủ tục, nên dù hàm có hay không trả ra
giá trị thì ta vẫn gọi chung là hàm.
Phạm vi của một hàm
Trong AutoIt, mỗi hàm là một khối mã riêng biệt. Mã của một hàm chỉ thuộc riêng
hàm đó và các câu lệnh trong bất cứ một hàm nào khác đều không thể truy cập đến
nó được. Nói theo cách khác, các mã và dữ liệu được định nghĩa bên trong một
hàm thì không thể tác động, ảnh hưởng đến các mã hay dữ liệu được định nghĩa
bên trong một hàm khác, vì hai hàm có hai phạm vi khác nhau.
Các biến được định nghĩa bên trong một hàm thì được gọi là biến cục bộ (Local).
Chúng được tạo ra khi hàm được nạp vào , và sẽ mất khi thoát hàm. Như vậy, một
biến cục bộ không thể lưu trữ giá trị của nó giữa hai lần gọi hàm. Trong trường hợp
bạn sử dụng một biến toàn cục (Global) bên trong hàm thì nội dung của biến toàn
cục sẽ thay đổi, và giá trị của nó vẫn giữ nguyên sau khi hàm kết thúc.
Tất cả các hàm trong AutoIt đều có cùng tầm vực, cho nên bạn không thể định
nghĩa một hàm bên trong một hàm khác.
ĐỊNH NGHĨA HÀM
Để định nghĩa một hàm, bạn phải tuân thủ các qui tắc mà ngôn ngữ lập trình đó hỗ
trợ. Với AutoIt, dạng tổng quát để khai báo và định nghĩa một hàm như sau :
Func <tên_hàm>( <các tham biến> )
<các lệnh nội bộ>
. . . . .
Return <giá trị>
EndFunc
Giải thích
Func. . . EndFunc : là hai từ khóa bắt buộc, có nhiệm vụ chỉ ra điểm bắt đầu
và kết thúc của một hàm
<tên_hàm> : tên đại diện miêu tả ngắn gọn chức năng của hàm
<các tham biến> : khai báo một danh sách tên các biến, mỗi biến được ngăn
cách với nhau bằng dấu phẩy. Danh sách này sẽ nhận các dữ kiện được truyền vào
để hàm xử lý. Một hàm có thể không có <các tham biến>, tức danh sách tham biến
sẽ rỗng. Tuy thế, ngay cả khi không có tham biến nào thì bạn vẫn phải đặt dấu
ngoặc đơn vào.
<các lệnh nội bộ> : ở đây bạn chính là thân của hàm. Bạn có thể thực hiện
việc khai báo các biến cục bộ (Local), viết các biểu thức , . . . .
Return <giá trị> : tùy chọn, có thể có hoặc không. Nếu như bạn tạo một hàm
có trả về một giá trị thì phần này được thêm vào, ngược lại thì không cần. Ví dụ
như bạn định nghĩa hàm Sin(x) để tính sin của x, thì khi thực hiện các tính toán
xong. Bạn dùng lệnh Return <giá trị> để trả về kết quả vừa tính được cho Sin(x).
Chú ý
Khi khai báo <các tham biến>, bạn không cần đặt vào từ khóa chỉ phạm
vi của biến. Theo mặc định, chúng luôn là cục bộ (local). Thậm chí nếu bạn
có chỉ định Dim, Local hay Global thì cũng sẽ bị báo lỗi. Tuy nhiên, hai từ
khóa Const, ByRef lại được phép đặt vào phía trước mỗi biến trong danh
sách các tham biến để mở rộng chức năng của hàm (xem phần “Truyền dữ
kiện cho hàm”).
Lệnh Return có chức năng chính là chấm dứt ngay quá trình xử lý bên
trong hàm và trả về <giá trị> cho hàm (nếu có). Theo mặc định, AutoIt luôn
trả về giá trị cho một hàm. Nếu lệnh Return <giá trị> được dùng thì hàm sẽ
trả về <giá trị>. Hàm trả về 0 (hoặc “ “ nếu dùng ở string) nếu Return không
tồn tại hoặc Return được gọi mà không có phần <giá trị> theo sau.
Ví dụ
Đoạn mã sau thực hiện việc định nghĩa hàm _RepeatText để lặp lại n lần một chuỗi
$str = "abc"
$new_str = _RepeatText($str, 10, "")
MsgBox(0,"_RepeatText 1", "Source : " & $str & @CRLF & "New string : "
& $new_str)
$str = "Love"
$new_str = _RepeatText($str, 5, " - ") ; ngăn cách chuỗi bằng " - "
MsgBox(0,"_RepeatText 2", "Source : " & $str & @CRLF & "New string : "
& $new_str)
Func _RepeatText($string, $how_many, $delim)
; $string sẽ chứa chuỗi dữ kiện được truyền từ ngoài vào
; $how_many cho biết sẽ lặp lại bao nhiêu lần
; $delim chỉ định ký tự nào dùng để ngăn cách giữa hai chuỗi được lặp lại
Local $Rep_str =""
For $i=1 To $how_many
$Rep_str &= $string & $delim
Next
Return $Rep_str
EndFunc
TRUYỀN DỮ KIỆN CHO HÀM
Đầu tiên ta có vài khái niệm cần nhắc lại :
Tham biến : là các biến cục bộ, đại diện cho chương trình con để tiếp
nhận dữ kiện
Đối số : thực chất là các dữ-kiện-cụ-thể mà ta truyền cho tham biến của
hàm. Tuy nhiên, các dữ kiện ta truyền cho tham biến không phải lúc nào
cũng là một giá trị cụ thể. Thông thường nó là một biến bên ngoài. Biến bên
ngoài này cũng chính là đối số của hàm.
Nói chung, để truyền dữ kiện cho chương trình con ta có hai cách.
- Cách thứ nhất là “truyền bằng trị”, phương pháp này sao chép giá trị của một đối
số vào tham biến, và các thao tác trên tham biến không làm ảnh hưởng đến đối số.
Ví dụ :
Hi("Mary")
$nick = "Lovely Cat"
Hi($nick)
Func Hi($name)
$greeting = "Hello, "& $name& ". Have a nice day!"
MsgBox(0,"Hi", $greeting)
EndFunc
- Cách thứ hai là “truyền bằng tham chiếu”, tức là dùng tham biến để thao tác trực
tiếp trên đối số được truyền vào. Mọi thay đổi trên tham biến đều ảnh hưởng đến
đối số. Để làm được đều này ta sử dụng từ khóa ByRef
BYREF
Như đã nói ở trên, khi muốn tham biến liên kết với đối số truyền vào, ta đặt ByRef
vào trước tham biến lúc khai báo.
Ví dụ, đoạn mã này thực hiện việc tráo đổi giá trị giữa hai biến $var1 và $var2 :
$var1 = 100
$var2 = 50
MsgBox(0,"Orginal", "Orginal value : $var1 = " & $var1 & ", $var2
= " & $var2)
_Swap($var1, $var2)
MsgBox(0,"Modified", "Modified value : $var1 = " & $var1 &
", $var2 = " & $var2)
Func _Swap(ByRef $a, ByRef $b)
$temp = $a
$a = $b
$b = $temp
EndFunc
Ban đầu ta truyền vào hàm _Swap hai đối số là $var1 và $var2. Do hai tham số $a,
$b có sử dụng ByRef nên khi ta tráo đổi giá trị giữa $a và $b thì cũng làm cho giá
trị của $var1 và $var2 tráo đổi theo.
CONST
Bạn từng biết rằng, Const là từ khóa dùng để khai báo hằng số. Thì khi sử dụng
trong hàm cũng vậy, việc đặt Const phía trước tham biến, sẽ làm cho giá trị của
tham biến không thể thay đổi trong suốt quá trình thực thi hàm. Giá trị này được
truyền chỉ một lần từ phía đối số.
DEFAULT
Từ khóa này không được dùng trong các biểu thức tính toán. Nó được dùng như
một cờ thông báo rằng sẽ sử dụng giá trị mặc định của tham biến đó bên trong
hàm. Các tham số sử dụng giá trị mặc định và các tham số sử dụng giá trị bắt buộc
có thể được khai báo xen kẽ nhau, không cần phải theo trật tự. (xem thêm chú ý số
3 bên dưới)
Ví dụ :
WinMove("[active]","",default, default, 200,300) ; just resize the
active window (no move)
MyFunc2(Default,Default)
Func MyFunc2($Param1 = Default, $Param2 = 'Two', $Param3 =
Default)
If $Param1 = Default Then $Param1 = 'One'
If $Param3 = Default Then $Param3 = 'Three'
MsgBox(0, 'Params', '1 = ' & $Param1 & @LF & _
'2 = ' & $Param2 & @LF & _
'3 = ' & $Param3)
EndFunc
CÁC CHÚ Ý
Việc sử dụng cách truyền bằng trị, bằng tham chiếu hay tất cả những gì
được nêu trong phần này thì tùy vào trường hợp mà ta dùng. Không nhất
thiết là phải viết hết khi định nghĩa một hàm
Để truyền một mảng vào hàm, thì ta chỉ cần nêu ra tên của mảng đó,
không cần dùng cặp dấu ngoặc vuông. Khi xử lý, nếu bạn xác định chiều
dài của mảng được truyền vào, ta cần gọi hàm UBound.
Lúc khai báo tham biến, bạn có thể gán cho tham biến những giá trị mặc
định. Trong quá trình gọi hàm, nếu người dùng không truyền dữ kiện cho
tham biến đó thì giá trị mặc định sẽ được dùng. Có một lưu ý quan trọng là
các tham biến có dùng giá trị mặc định, thì tất cả phải được đặt ở phía sau
các tham biến không dùng giá trị mặc định. Ngoài ra còn có cách dùng từ
khóa Default như đã nêu ở trên.
CÁC THƯ VIỆN TRONG AUTOIT v3
Include Description
Array.au3 Functions that assist with array management
AVIConstants.au3 AVI Constants
ButtonConstants.au3 Button Constants
Color.au3 Functions that assist with color management
ComboConstants.au3 ComboBox Constants
Constants.au3 Various AutoIt Constants
Date.au3 Functions that assist with dates and times
DateTimeConstants.au3 DateTime Control Constants
EditConstants.au3 Edit Constants
File.au3 Functions that assist with files and directories
GuiCombo.au3 Functions that assist with ComboBox
GUIConstants.au3 Includes all GUI related constants
GUIConstantsEx.au3 Constants to be used in GUI applications
GUIDefaultConstants.au3 GUI default control styles
GuiEdit.au3 Functions that assist with Edit control
GuiIPAddress.au3 Used to create a GUI IP Address Control
GuiList.au3 Functions that assist with Listbox
GuiListView.au3 Functions that assist with ListView
GuiMonthCal.au3 Functions that assist with MonthCal
GuiSlider.au3 Functions that assist with Slider Control “Trackbar”
GuiStatusBar.au3 Functions that assist with the Statusbar control
GuiTab.au3 Functions that assist with the Tab Control
GuiTreeView.au3 Functions that assist with TreeView
IE.au3 Internet Explorer Automation UDF Library for
AutoIt3
Inet.au3 Functions that assist with the Internet
ListBoxConstants.au3 ListBox Constants
ListViewConstants.au3 ListView Constants
Math.au3 Functions that assist with mathematical calculations
Memory.au3 Memory management routines
Misc.au3 Functions that assist with Common Dialogs
Process.au3 Functions that assist with process management
ProgressConstants.au3 Progress Constants
SliderConstants.au3 Slider Constants
Sound.au3 Functions that assist with Sound files
SQLite.au3 Functions that assist access to an SQLite database
SQLite.dll.au3 Inline SQLite3.dll
StaticConstants.au3 Static Constants
StatusBarConstants.au3 StatusBar Constants
String.au3 Functions that assist with String manipulation
TabConstants.au3 Tab Constants
TreeViewConstants.au3 TreeView Constants
UpDownConstants.au3 UpDown Constants
Visa.au3 VISA (GPIB & TCP) library
WindowsConstants.au3 Windows Constants
CÁC HÀM MÔI TRƯỜNG THÔNG DỤNG
Do số lượng các hàm trong AutoIt hiện nay rất lớn (trên 2200 hàm), nên phần này
không trình bày tất cả các hàm mà chỉ nói sơ bộ chức năng của một số hàm thông
dụng liên quan đến môi trường Windows. Còn các hàm liên quan đến chuỗi, toán
học, chuyển đổi,...thì các bạn tra cứu trong file help của AutoIt. Các chủ đề ở đây
bao gồm :
Quản lý môi trường
Quản lý thư mục
Quản lý tập tin
Quản lý ổ đĩa.
1. ClipGet( )
2. ClipPut(“<value>”)
3. MemGetStats( )
4. DirCopy( “nguồn”, “đích” [, flag])
5. DirMove( “nguồn”, “đích” [,flag])
6. DirCreate( “path”)
7. DirRemove( “path” [, DelAll])
8. DirGetSize( “path” [,flag])
9. FileCopy( “nguồn”, “đích” [,flag])
10. FileMove( “file_nguồn” , “nơi đến” [, flag])
11. FileDelete( “path”)
12. FileRecycle( “nguồn”)
13. FileRecycleEmpty( [“ổ đĩa”])
14. FileGetSize( “file_name”)
15. FileExist( “path”)
16. FileInstall( “source”, “dest” [, flag])
17. FileOpenDialog ( "title", "init dir", "filter" [, options [, "def
name" [, hwnd]]] )
18. FileSaveDialog ( "title", "init dir", "filter" [, options [, "def
name" [, hwnd]]] )
19. FileSelectFolder ( "dialog text", "root dir" [, flag [, "initial dir"
[, hwnd]]] )
20. DriveGetDrive( "type")
21. DriveGetLabel( "path")
22. DriveGetSerial( "path")
23. DriveSetLabel( "path", "label")
24. DriveSpaceFree( "path")
25. DriveSpaceTotal( "path")
26. DriveStatus( "path")
Quản lý môi trường
1. ClipGet( )
Lấy văn bản từ clipboard
Th. Công : trả về một chuỗi chứa đoạn text trong clipboard
Hỏng : gán @error = 1 nếu clipboard rỗng
= 2 nếu chứa mục nhập không phải là text
= 3 hoặc 4 nếu không thể truy cập clipboard
Chú ý : nếu có nhiều file/thư mục được lưu trong clipboard, thì đường dẫn
và tên file/thư mục được trả về, mỗi tên được ngăn cách bởi ký tự @LF
2. ClipPut(“<value>”)
Ghi một đoạn text vào clipboard
<value> : là một chuỗi muốn ghi vào clipboard
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : nội dung đã có trước đó trong clipboard sẽ bị viết đè. Một chuỗi
rỗng “ “ sẽ xóa sạch clipboard
3. MemGetStats( )
Lấy các thông tin liên quan đến bộ nhớ và trả về một mảng gồm bảy phần tử với
nội dung :
$array[0] = Memory Load (Percentage of memory in use)
$array[1] = Total physical RAM
$array[2] = Available physical RAM
$array[3] = Total Pagefile
$array[4] = Available Pagefile
$array[5] = Total virtual
$array[6] = Available virtual
Đơn vị tính là Kilobyte (Kb)
Quản lý thư mục
1. DirCopy( “nguồn”, “đích” [, flag])
Copy một thư mục và tất cả các file, các thư mục con bên trong thư mục nguồn
đến thư mục đích
“nguồn” : chỉ định thư mục cần copy (không có dấu \ ở cuối)
“đích” : thư mục sẽ chứa các phần được sao chép đến (không chứa dấu \ ở
cuối)
flag : (tùy chọn) nếu flag = 0 thì không viết đè các file đã có ở thư mục
đích (mặc định)
= 1 sẽ viết đè các file đã có
2. DirMove( “nguồn”, “đích” [,flag])
Dời một thư mục được chỉ định trong “nguồn” sang thư mục được chỉ định trong
“đích”
3. DirCreate( “path”)
Tạo một thư mục
Path : đường dẫn đầy đủ và tên của thư mục cần tạo. Ví dụ
: “c:\test\folder1”
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : hàm này sẽ tự tạo các thư mục cha (cấp trên) được chỉ định bởi
path, nếu như chúng chưa có trên đĩa
4. DirRemove( “path” [, DelAll])
Xóa một thư mục
Path : đường dẫn của thư mục cần xóa
DelAll : = 0 (mặc định) không xóa các file và thư mục con bên trong
= 1 sẽ xóa tất cả các file và thư mục con bên trong (giống như lệnh DelTree trong
DOS)
5. DirGetSize( “path” [,flag])
Trả về kích thước (tính theo byte) của thư mục chỉ định
Path : thư mục cần lấy kích thước. ví dụ : “c:\windows”
Flag : [tùy chọn] trả về kết quả mở rộng hay không
= 0 (mặc định) không trả về kết quả mở rộng
= 1 trả về một mảng có nội dung sau :
$array[0] = Size
$array[1] = Tổng số file tìm thấy
$array[2] = Tổng số thư mục tìm thấy
= 2 không lấy kích thước của các file trong thư mục con
Th. Công : trả về kích thước của thư mục (>=0)
Hỏng : trả về -1 và gán @error =1 nếu đường dẫn không tồn tại
Quản lý tập tin
1. FileCopy( “nguồn”, “đích” [,flag])
Sao chép một hoặc nhiều file từ thư mục “nguồn” sang thư mục “đích”
“nguồn” : đường dẫn chứa các file cần copy
“đích” : thư mục sẽ chứa các file được sao chép đến
Flag : [tùy chọn] nếu flag
= 0 (mặc định) không viết đè các file trùng tên
= 1 viết đè các file trùng tên trong thư mục “đích”
= 8 tự tạo cấu trúc thư mục “đích” nếu như đích đến không tồn tại.
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : nếu bạn gán flag = 9, thì tương đương (1+8). Giá trị này báo cho
biết rằng sẽ viết đè nếu có file trùng tên và tự tạo cấu trúc thư mục đích đến. Muốn
sao chép nhiều file, ta sử dụng ký tự * để làm giá trị tùy ý. Ví dụ : *.mp3 để chọn
tất cả file mp3.
2. FileMove( “file_nguồn” , “nơi đến” [, flag])
Di chuyển một hoặc nhiều file sang thư mục khác
File_nguồn : đường dẫn và tên tập tin cần dời đi
Nơi đến : đường dẫn để chứa các file cần dời đi. Nếu tham số này nêu ra
một tên tập tin khác, thì file_nguồn sau khi dời đến thư mục chỉ định
sẽ bị đổi tên.
Flag : giống như lệnh FileCopy
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : nếu đường dẫn chứa file nguồn và nơi đến không cùng phân
vùng, thì một tác vụ copy và một tác vụ xóa được thực hiện.
3. FileDelete( “path”)
Xóa một hoặc nhiều file được chỉ định trong “path”
Path : đường dẫn của các file cần xóa
Th. Công : trả về 1
Hỏng : trả về 0 nếu file không tồn tại hoặc không thể xóa
Chú ý : nếu muốn xóa tất cả file trong một thư mục, sử dụng mặt nạ * .
* để đại diện cho tất cả các file. Để ý rằng, một vài file có thiết lập
thuộc tính sẽ không thể xóa được.
4. FileRecycle( “nguồn”)
Đưa một file hoặc thư mục vào thùng rác
Nguồn : đường dẫn và tên file hoặc thư mục cần chuyển vào thùng rác.
Sử dụng * để đại diện nhiều file.
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : để xóa một thư mục thì không sử dụng ký tự “ \” ở cuối đường
dẫn chỉ định trong “nguồn”
5. FileRecycleEmpty( [“ổ đĩa”])
Làm rỗng thùng rác
[ổ đĩa] : tham số này tùy chọn, cho biết cần đổ thùng rác ở ổ đĩa nào. Nếu
bỏ qua sẽ đổ bỏ ở tất cả ổ đĩa.
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : để hàm này làm việc máy bạn phải IE từ phiên bản 4 trở lên.
6. FileGetSize( “file_name”)
Trả về kích thước của tập tin (tính theo byte)
File_name : đường dẫn và tên của file cần lấy
Th. Công : trả về kích thước của file (byte)
Hỏng : trả về 0 và gán @error = 1
Chú ý : lệnh này không làm việc với thư mục. Lấy kết quả chia cho
1024 để có được đơn vị tính theo kilobyte, chia cho 1048576 để có
được kích thước ở megabyte.
7. FileExist( “path”)
Kiểm tra xem file hoặc thư mục được nêu trong path có tồn tại hay không
Path : file hoặc thư mục cần kiểm tra
Th. Công : trả về 1
Hỏng : trả về 0 nếu đường dẫn chứa trong path không tồn tại
Chú ý : hàm này cũng sẽ trả về 0 nếu bạn chỉ định một ổ đĩa mềm mà lại
không có chứa đĩa
8. FileInstall( “source”, “dest” [, flag])
Bao gồm và cài đặt một file với đoạn mã đã biên dịch
Source : đường dẫn nguồn của những file cần dịch. Đường dẫn này phải là
một chuỗi rõ ràng, không được phép là một biến. Có thể sử dụng
đường dẫn liên quan như .\ hoặc ..\
Dest : đường dẫn đích đến của các file cần extract. Nếu muốn chỉ định
một thư mục thì dùng dấu \ ở cuỗi. Cho phép dest là biến số
Flag : cho biết có chép đè khi gặp file trùng tên hay không.
= 0 (mặc định) : không viết đè
= 1 : viết đè
Chú ý : hàm này được thiế kế là để gom các file vào trong một đoạn mã đã
biên dịch. Những file được gom vào có thể được extract (xả nén)
trong quá trình chạy của file script đã biên dịch và lệnh này được thực
thi. Bạn có thể hình dung là nếu bạn đưa một file ảnh vào trong file
script thì kích thước của file script sau khi biên dịch sẽ tăng lên. Một
điều nữa là các thông tin gốc về thời gian tạo, chỉnh sửa cũng sẽ được
giữ lại khi cài đặt
9. FileOpenDialog ( "title", "init dir", "filter" [, options [, "def name" [, hwnd]]] )
Gọi hộp thoại Open File (hộp thoại xuất hiện khi bạn chọn lệnh File>Open.. trong
các ứng dụng)
Title : tiêu đề của hộp thoại khi xuất hiện
Init dir : thư mục mặc định để mở khi hộp thoại vừa xuất hiện
Filter : chỉ định một hay nhiều loại tập tin cần mở. ví dụ như : “All
(*.*)” hoặc “Text files (*.txt)” hoặc “All (*.*) | Text files (*.txt)”
Options : [tùy chọn] cho phép mở rộng một vài điều kiện, sử dụng giá trị
sau :
1 = file phải tồn tại (nếu người dùng gõ tên file)
2 = đường dẫn phải tồn tại (nếu gõ đường dẫn)
4 = cho phép chọn nhiều file
8 = nhắc nhở tạo file mới nếu file không tồn tại
Def name : tên đề nghị cho người dùng. Mặc định là rỗng (“”)
Hwnd : handle của cửa sổ được xem như là cửa sổ mẹ của hộp thoại
Open File
Th. Công : trả về đường dẫn đầy đủ và tên của tập tin được chọn. Nếu có
nhiều file được chọn thì trả về chuỗi có dạng như sau : “thư mục |
file1 | file2 |…”
Hỏng : gán @error = 1
Chú ý : bộ lọc phần mở rộng và kết quả trả về cho nhiều file được chọn,
đều được ngăn cách mỗi phần bởi dấu gạch đứng “|”.
Bạn cũng có thể kết hợp các giá trị của Options lại với nhau để có nhiều lựa
chọn. ví dụ : 1+4 để vừa có lựa chọn là “file phải tồn tại” và “ cho
phép chọn nhiều file”
10. FileSaveDialog ( "title", "init dir", "filter" [, options [, "def name" [, hwnd]]] )
Gọi hộp thoại save file (hộp thoại xuất hiện khi bạn gọi File > Save)
Title : tiêu đề của hộp thoại
Init dir : thư mục mặc định để mở khi hộp thoại vừa xuất hiện
Filter : chỉ định một hay nhiều loại tập tin cần mở
Options : [tùy chọn] 2 = đường dẫn phải tồn tại (nếu người dùng gõ
đường dẫn kết thúc vơi dấu \ )
16 = nhắc nhở việc ghi đè file trùng tên
Def name : tên đề nghj cho ng dùng. Mặc định là rỗng “ “
Hwnd : handle của cửa sổ được xem như là cửa sổ mẹ của hộp thoại
Save File
Th. Công : trả về đường dẫn đầy đủ và tên của tập tin được chọn. Nếu có
nhiều file được chọn thì trả về chuỗi có dạng như sau : “thư mục |
file1 | file2 |…”
Hỏng : gán @error = 1
Chú ý : bộ lọc phần mở rộng và kết quả trả về cho nhiều file được chọn,
đều được ngăn cách mỗi phần bởi dấu gạch đứng “|”.
11. FileSelectFolder ( "dialog text", "root dir" [, flag [, "initial dir" [, hwnd]]] )
Gọi hộp thoại Browse For Folder (hộp thoại chỉ hiện cây thư mục để chọn)
Dialog text : văn bản sẽ hiển thị trên hộp thoại, cho phép bạn nhắc nhở chức
năng
Root dir : thư mục gốc của cây tập tin trong GUI. Sử dụng “ “ để chọn
Desktop.
Flag : [tùy chọn] cho phép thêm một vài một lựa chọn :
1 = hiển thị nút Create Folder (đòi hỏi có IE6 trở lên)
2 = sử dụng Kiểu hộp thoại mới (New Dialog style, đòi hỏi IE6 trở lên)
4 = hiển thị một control Edit để gõ tên thư mục mới
Initial dir : Thư mục mặc định sẽ chọn khi hộp thoại xuất hiện. Sử dụng “ “
để chọn Desktop
Th. Công : trả về đường dẫn đầy đủ của thư mục được chọn
Hỏng : trả về chuỗi rỗng “ “ và gán @error = 1 nếu người dùng đóng
(cancel) cửa sổ.
Quản lý ổ đĩa
1. DriveGetDrive( "type")
Liệt kê tất cả các ổ đĩa có trên hệ thống
Type : loại ổ đĩa cần tìm :
"ALL", "CDROM", "REMOVABLE", "FIXED", "NETWORK", "
RAMDISK" hoặc "UNKNOWN"
Th. Công : trả về một mảng, mỗi phần tử là một chuỗi chứa ký tự ổ đĩa được
tìm thấy (ví dụ như C: ). Phần tử đầu tiên trong mảng (có chỉ mục 0)
sẽ cho biết tổng số ổ đĩa được tìm thấy.
Hỏng : trả về chuỗi rỗng và gán @error = 1
2. DriveGetLabel( "path")
Cho biết tên của ổ đĩa
Path : ổ đĩa cần lấy tên. Ví dụ : "C:\", "e:\"
Th. Công : trả về chuỗi là tên của ổ đĩa
Hỏng : gán @error = 1
3. DriveGetSerial( "path")
Cho biết số serial của ổ đĩa
Path : ổ đĩa cần lấy số serial
Th. Công : trả về một chuỗi là số serial
Hỏng : gán @error = 1
4. DriveSetLabel( "path", "label")
Gán nhãn (tên) cho ổ đĩa
Path : ổ đĩa cần gán nhãn (như "c:\")
Label : nhãn mới để gán cho ổ đĩa (tối đa 11 ký tự)
Th. Công : trả về 1
Hỏng : trả về 0
5. DriveSpaceFree( "path")
Lấy kích thước còn trống của ổ đĩa
Path : ổ đĩa cần lấy. ví dụ : "C:\"
Th. Công : trả về kích thước còn trống của ổ đĩa (tính theo megabyte)
Hỏng : trả về 0 và gán @error = 1
6. DriveSpaceTotal( "path")
Cho biết tổng dung lượng của ổ đĩa
Path : ổ đĩa cần lấy. ví dụ : "C:\"
Th. Công : trả về tổng dung lượng của ổ đĩa (tính theo megabyte)
Hỏng : gán @error = 1
7. DriveStatus( "path")
Trả về trạng thái của ổ đĩa
Path : ổ đĩa cần lấy trạng thái
Trả về một trong các giá trị sau :
"UNKNOWN" : ổ đĩa có thể không được định dạng
"READY" : ổ đĩa đang sẵn sàng làm việc
"NOTREADY" : ổ đĩa mềm hoặc CD không có đĩa
"INVALID" : ổ đĩa có thể không tồn tại
GIỚI THIỆU VỀ GUI
GUI là từ viết tắt của Graphic User Interface – giao diện người dùng bằng đồ họa.
Điều này có lẽ không cần phải nóii nhiều vì bạn đã thấy nó ngay từ khi tiếp xúc với
máy tính, chúng là các biểu tượng, cửa sổ, nút bấm, ... . Cách đây vài chục năm,
cái thời mà DOS còn ngự trị trên máy PC thì có lẽ bạn sẽ gặp rắc rối khi phải nhớ
và thao tác một cách chậm chạp với các câu lệnh dài dòng, lắm cú pháp. Còn đến
cái thời mà Windows bành trướng sức mạnh của mình bằng giao diện đồ họa và
các tính năng mới mẻ, thì việc bạn cần làm khi sử dụng máy tính là nhớ các thao
tác. Tất cả các lệnh và hướng dẫn đều có trên màn hình, bạn chỉ cần chọn và nhấn
chuột hoặc phím. Thật là tuyệt cho người sử dụng.
Còn đối với người lập trình thì sao ? Khi mới bắt đầu tiếp xúc với việc lập trình
ứng dụng trong windows , sẽ không ít người trong chúng ta ngán ngẫm . Tại sao?
Đơn giản là vì nó có quá nhiều hàm và cách tổ chức cấu trúc thì chẳng dễ nhớ tí
nào. Nếu bạn đã từng học qua C/C++ thì bạn sẽ hiểu cái cảm giác đó. Thế AutoIt
sẽ giúp cho công việc của ta dễ dàng hơn à ? Xin thưa là đúng như vậy. Mặc dù
bên trong Windows đã được xây dựng sẵn một thư viện đồ sộ cho việc lập trình
các ứng dụng có giao diện , nhưng cú pháp của nó quả là rắc rối . Và chúng ta –
những người sử dụng AutoIt có thể khai thác thư viện này theo một cách đơn giản
nhất mà AutoIt đã hỗ trợ. Sự hỗ trợ mà AutoIt mang đến cho tôi và bạn chính là
các hàm để tạo nên cửa sổ , các thành phần con trên nó (ta gọi là các control ) và
những thứ liên quan đã được thay thế với cú pháp ngắn gọn, đơn giản và sáng sủa
hơn.
Đến đây bạn có thể yên tâm rằng , học AutoIt sẽ không hề vô dụng. Tuy nhiên mọi
thứ sẽ không phải là màu hồng như bạn nghĩ vì bạn sẽ tốn khá nhiều thời gian để
tìm hiểu về những gì AutoIt đang có. Trước khi soạn tài liệu này , tôi đã phải tốn
đến mấy tháng tìm hiểu một cách "lười biếng" về ngôn ngữ này. Hy vọng rằng các
bạn sẽ không phải tốn quá nhiều thời gian như tôi. Nói vòng vo như thế cũng đủ rồi
, bây giờ là nói vào nội dung chính.
Các control mà AutoIt hỗ trợ cho ta bao gồm :
Label Một mẫu văn bản đơn giản Button Nút bấm Input Vùng soạn thảo văn bản chỉ có một dòng Edit Vùng soạn thảo văn bản có nhiều dòng
Checkbox Một ô vuông cho phép bạn đánh dấu hoặc không đánh dấu
Radio Một nút tròn cho phép bạn chỉ được chọn một nút trong số nhiều nút
Combo Một danh sách có nút bấm để sổ xuống List Một danh sách Date Một hộp chọn ngày Pic Vùng để hiển thị ảnh Icon Vùng để hiển thị Icon Progress Thanh tiến trình Tab Một nhóm các control sẽ được chứa trong tab
UpDown Một control cho phép đính kèm cạnh bên control input
Avi Hiển thị đoạn clip AVI Menu Menu chức năng trên cửa sổ
ContextMenu Một menu ngữ cảnh sẽ xuất hiện khi bạn nhấn chuột phải (hoặc trái, tùy vị trí)
TreeView Một cây phân nhánh như trong Windows Explorer Slider Một thanh trượt như thanh điều khiển âm lượng ListView Control hiển thị thông tin của cột trong listview ListViewItem Control hiển thị các mục trong listview
Graphic Control để hiển thị đồ họa được vẽ với hàm GUICtrlSetGraphic.
Dummy Control dummny (bù nhìn)
Đây là hình ảnh về các control mà ta có thể tạo lập được Error!
Trước khi tìm hiểu về cách thức tạo một GUI , ở đây xin giới thiệu sơ lược với các
bạn các hàm cơ bản mà ta sẽ thường sử dụng để thao tác với một ứng dụng có cửa
sổ.
Hàm Giải thích
GUICreate Tạo một cửa sổ
GUICtrlCreate...
Tạo ra các control khác nhau trên cửa sổ (dấu …. sẽ được thay
bằng tên cụ thể)
GUISetState Hiển thị hoặc ẩn cửa sổ
GUIGetMsg Lấy các thông tin về các sự kiện diễn ra trên gui
GUICtrlRead Đọc dữ liệu từ control
GUICtrlSetData Gán/Thay đổi dữ liệu trên control
GUICtrlSet... Thay đổi các lựa chọn trên control (ví dụ như màu sắc , style,…)
TẠO GIAO DIỆN NGƯỜI DÙNG
Phần này sẽ hướng dẫn bạn cách thức để tạo nên một ứng dụng có giao diện hẳn
hoi. Một điều quan trọng mà bạn cần nhớ là một ứng dụng trên windows không
nhất thiết phải có giao diện (ví dụ như các dịch vụ của win) và các thao tác xử lý
đối với một ứng dụng trên Windows là tập trung vào xử lý sự kiện xảy ra trên cửa
sổ của ứng dụng đó. Ở đây, các bạn cần nắm được vài chú ý sau :
- Control ID : nó thực chất là một số nguyên (>0) đại diện cho
control. Thông thường ta không biết số này là bao nhiêu (vì do hệ điều
hành cung cấp khi chạy ứng dụng) và khi tạo ra một control ta thường
gán nó vào một biến, biến đó là tên đại diện, sẽ chứa ID của control
đó. Do trên cửa sổ của bạn sẽ có nhiều thành phần, mỗi thành phần
cần phải có một cái tên để quản lý và khai thác. Ví dụ bạn có hai nút
bấm trên cửa sổ thì bạn phải đặt tên cho nút thứ nhất là btn1 (hoặc
btnOK) và nút thứ hai là btn2 (btnCancel) chẳng hạn. Để khi người
dùng nhấp chuột thì ta biết rằng nút bấm nào vừa được tác động.
- Control ID : là một số nguyên duy nhất, không bao giờ có sự trùng
lặp (do bộ nhớ được phân chia để chứa các thành phần ).
- Handle : cái từ này tôi không biết nên dịch thế nào cho đúng
nghĩa nhưng có thể tạm hiểu rằng , nó là một giá trị đặc biệt được tạo
ra và gán vào một cửa sổ khi cửa sổ đó được tạo. Thông thường ,
handle chỉ được dùng cho cửa sổ , ít khi dùng cho control. Khi nói
đến handle , người ta nghĩ ngay đến định danh của một cửa sổ (hay
GUI). Và handle là một dạng dữ liệu đặc biệt , nó không phải chuỗi
hay số.
Để tạo được một ứng dụng có giao diện đồ họa , thì thành phần bạn cần tạo đầu
tiên chính là một cửa sổ. Sau khi có cửa sổ thì chúng ta sẽ tạo tiếp các thành phần
con trên nó (các control).
Muốn tạo được cửa sổ ta cần gọi đến hàm GuiCreate. Có cú pháp hoàn chỉnh như
sau :
GUICreate ( "title" [, width [, height [, left [, top [, style [, exStyle [,
parent]]]]]]] )
Các phần được rào trong cặp dấu ngoặc vuông [ ] là tùy chọn, có thể có hoặc
không. Trong đó ,
Các tham số
Title : là tiêu đề của cửa sổ (văn bản này sẽ hiển thị trên thanh tiêu đề
khi cửa sổ xuất hiện).
Width : độ rộng của cửa sổ (tính theo pixel)
Heigh : chiều cao của cửa sổ (tính theo pixel)
Left : vị trí bên trái của màn hình (tương ứng với tọa độ x). Gán -1 là
canh giữa màn hình. Nếu đã gán giá trị cho left, thì Top cũng phải
được gán giá trị.
Top : vị trí phía trên của màn hình (tương ứng với tọa độ y). Gán -1 đề
canh giữa màn hình
Style : xác định style (kiểu) cửa sổ. Xem trong GUI Control Styles
Appendix của file help.
Sử dụng -1 để dùng style mặc định, bao gồm các giá trị sau
: $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP,
$WS_SYSMENU.
Các style $WS_CLIPSIBLINGS, và $WS_SYSMENU luôn được sử dụng
nếu như style $WS_MAXIMIZEBOX hoặc $WS_SIZEBOX được chỉ
định.
exStyle : xác định style mở rộng cho cửa sổ (xem bảng Extended Style
Table bên dưới ). Mặc định là -1.
Parent : handle của cửa sổ đã được tạo ra trước đó. Cửa sổ sắp tạo ra sẽ là
con của cửa sổ có handle vừa gán.
Trả về
Thành công : hàm trả về handle của cửa sổ
Hỏng : hàm trả về 0 và gán @error = 1
Chú ý
Hai tham số Left và Top sẽ xác định vị trí xuất hiện của hộp thoại trên
màn hình. Điểm giao nhau của hai tham số này chính là góc trái trên của hộp
thoại.
Theo mặc định, các cửa sổ được tạo ra sẽ không thể có chức năng resize (dùng chuột để kéo lớn hoặc thu nhỏ kích thước của cửa sổ) và phóng lớn cực đại (maximize). Vì thế, khi bạn muốn sử dụng bất kỳ tính năng nào ở
trên thì có thể thêm vào tham số style các giá trị
WS_SIZEBOX hoặc WS_MAXIMIZEBOX.
Tuy nhiên, khi sử dụng WS_SIZEBOX thì các style
WS_MINIMIZEBOX, WS_CAPTION, WS_POPUP, WS_SYSMENU lại
không được thiết lập. Cách tốt nhất để tạo nên một hộp thoại có thể resize là
sử dụng WS_OVERLAPPEDWINDOW.
Khi dùng $WS_EX_MDICHILD cho tham số style mở rộng , thì vị trí
cửa sổ là vị trí liên hệ đến vùng client của cửa sổ bố-mẹ (parent). Tham số
$WS_EX_LAYERED cho phép có một bức ảnh trong suốt bên trên ảnh nền
đã định nghĩa trong cửa sổ parent.
Để kết hợp các style do bạn chỉ định với style mặc định, ta sử dụng :
BitOr($GUI_SS_DEFAULT_GUI, newstyle,...).
Muốn sử dụng được các hằng số liên quan đến GUICreate, bạn cần gọi
#include <WindowsConstants.au3>
Bảng các style mở rộng (Extended style table)
Style mở rộng Kết quả
$WS_EX_ACCEPTFILES
Cho phép một control edit hoặc input được tạo trên GUI có thể nhận được tên của file được kéo và thả vào. Control cũng phải được gán trạng thái $GUI_DROPACCEPTED bằng hàm GUICtrlSetState. Đối vớ các control khác, thông tin của việc drag&drop có thể được truy lại với @GUI_DRAGID, @GUI_DRAGFILE, @GUIDROPID.
$WS_EX_APPWINDOW Yêu cầu cửa sổ luôn nổi ở-trên thanh taskbar khi nó xuất hiện.
$WS_EX_CLIENTEDGE Cửa sổ sẽ được bao với viền bị trũng xuống (sunken).
$WS_EX_CONTEXTHELP
Bao gồm một dấu chấm hỏi ở thanh tiêu đề của cửa sổ. Không dùng được với WS_MAXIMIZEBOX hoặc WS_MINIMIZEBOX.
$WS_EX_DLGMODALFRAME
Tạo một cửa sổ có viền lớn gấp đôi bình thường. Tùy chọn, cửa sổ có thể được tạo với một thanh tiêu đề bằng cách chỉ định WS_CAPTION trong tham số style
$WS_EX_MDICHILD Tạo một cửa sổ con bên trong cửa sổ bố-mẹ (simulation not real MDI).
$WS_EX_OVERLAPPEDWINDOW Kết hợp style WS_EX_CLIENTEDGE và WS_EX_WINDOWEDGE
$WS_EX_STATICEDGE
Tạo một cửa sổ có viền chỉ bằng một phần ba so với bình thường , style này được sử dụng cho các mục không chấp nhận viêc nhập liệu của người dùng
$WS_EX_TOPMOST GUI được tạo với style này sẽ luôn ở trên các cửa sổ khác, thậm chí khi GUI không được kích hoạt.
$WS_EX_TRANSPARENT Cửa sổ sẽ xuất hiện trong suốt bởi vì các bit của những cửa sổ liên quan bên dưới đã được vẽ lại
$WS_EX_TOOLWINDOW
Tạo ra một cửa sổ chứa công cụ, ta còn gọi là floating toolbar (thanh công cụ trôi nổi). Cửa sổ chứa công cụ sẽ có một thanh tiêu đề và font chữ nhỏ hơn cửa sổ bình thường. Cứa sổ này sẽ không xuất hiện trong taskbar hoặc trong hộp thoại khi bạn Alt-Tab. Nếu cửa sổ chứa công cụ có một menu hệ thống, icon của nó sẽ không hiển thị trên thanh tiêu đề. Tuy nhiên, bạn có thể ép chúng hiển thị bằng cách gõ phím Alt-Space.
$WS_EX_WINDOWEDGE Tạo cửa sổ được bao với viền nổi
$WS_EX_LAYERED Tạo một cửa sổ được xếp thành lớp (layer). Chú ý rằng cái này không sử dụng được cho
các cửa sổ con
Ví dụ 1
Đoạn mã này tạo ra một cửa sổ, trên đó có chứa một label và một button. Khi bạn
nhấn vào Button sẽ tạo ra một số ngẫu nhiên và hiển thị ở label.
#include <GUIConstantsEx.au3>
$gui = GUICreate("Random number", 200, 100) ;tạo gui chính
;tạo nhãn sẽ hiển thị số vừa tạo
$label_num = GUICtrlCreateLabel("000", 20, 20, 160, 30)
;gán label này dùng font Arial, size là 14
GUICtrlSetFont(-1, 14, 400, 0, "Arial")
;tạo nút cấp phát số ngẫu nhiên
$button_gen = GUICtrlCreateButton("Generate random number", 20,
50, 160, 30)
GUISetState() ; hiển thị gui vừa tạo lên màn hình
while 1 ; vòng lặp xử lý thông điệp
$msg = GUIGetMsg() ;ghi nhận sự kiện xảy ra trên gui
Switch $msg
Case $GUI_EVENT_CLOSE ;nếu nhấn nút Close hoặc Alt-F4
ExitLoop ; thì thoát
Case $button_gen ;nếu nhấn nút cấp phát thì tạo số ngẫu nhiên
$num = Int(Random(-10^9, 10^9))
; gán vào label để hiển thị số vừa cấp phát
GUICtrlSetData($label_num, $num)
EndSwitch
WEnd
Ví dụ 2
Đoạn mã này minh họa việc tạo cửa sổ con có nền trong suốt bằng một ảnh gif.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Example( )
Func Example2()
Local $gui, $background, $pic, $basti_stay, $msg
Local $sFile =
RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\A
utoIt v3\AutoIt", "InstallDir") &
"\Examples\GUI\logo4.gif"
$gui = GUICreate("Background", 400, 100)
; background picture
$background = GUICtrlCreatePic(@SystemDir &
"\oobe\images\mslogo.jpg", 0, 0, 400, 100)
GUISetState(@SW_SHOW)
; transparent MDI child window
$pic = GUICreate("", 169, 68, 0, 0, $WS_POPUP,
BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)
; transparent pic
$basti_stay = GUICtrlCreatePic($sFile, 0, 0, 169, 68)
GUISetState(@SW_SHOW)
Do
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
EndFunc
GUIDelete
Xóa bỏ một cửa sổ GUI và tất cả các control trên đó
GUIDelete ( [winhandle] )
Các tham số
Winhandle [tùy chọn] handle của cửa sổ cần xóa , được trả về từ hàm GUICreate
(mặc định là GUI đã dùng trước đó.)
Trả về
Th.
Công : Returns 1.
Hỏng : Returns 0.
Chú ý
None.
GUIGetCursorInfo
Lấy thông tin về vị trí của con trỏ chuột (tính theo cửa sổ GUI)
GUIGetCursorInfo ( [winhandle] )
Các tham số
winhandle [tùy chọn] handle của cửa sổ muốn sử dụng. Nếu bỏ quên thì cửa sổ
hiện hành được sử dụng
Giá trị trả về
Th.
Công : Trả về một mảng có 5 phần tử , chứa các thông tin sau :
$array[0] = tọa độ X (chiều ngang)
$array[1] = tọa độ Y (chiều dọc)
$array[2] = nút thứ nhất của chuột được nhấn (thường là nút trái , 1 là có
nhấn, 0 nếu không nhấn)
$array[3] = nút thứ hai của chuột được nhấn (thường là nút phải , 1 là có
nhấn, 0 nếu không nhấn)
$array[4] = ID của control mà con trỏ chuột đang bay-lượn ở trên. Cho 0
nếu không có control
Hỏng
: Trả về 0 và gán @error=1
Chú ý
Tọa độ của con trỏ chuột được tính theo tọa độ bên trong GUI , chứ
không phải tính theo tọa độ màn hình
Nếu tham số "winhandle" được dùng thì cửa sổ được chỉ định sẽ trở
thành cửa -sổ-hiện-hành mới.
Việc lấy thông tin về vị trí của con trỏ chuột chỉ thành công khi dùng trên
một cửa sổ được tạo ra bằng hàm GUICreate. Khi không có winhandle thì
hàm chỉ thành công khi cửa sổ GUI được kích hoạt
Định danh của ListViewItem hoặc TreeViewItem sẽ không bao giờ được
trả về , chỉ trả về ID của ListView hoặc TreeView mà thôi.
GUIGetMsg
Lấy và trả về các sự kiện nào đã xảy trên GUI
GUIGetMsg ( [advanced] )
Các tham số
Advanced
[tùy chọn] trả về thông tin mở rộng chứa trong một mảng
0 = (default) trả về một sự kiện đơn lẻ.
1 = trả về một mảng chứa sự kiện và thông tin mở rộng
Giá trị trả về
Trả về một giá trị đơn hoặc một mảng tùy vào tham số Advanced
Sự kiện sẽ trả về định danh (ID) của control đã gởi đi thông điệp , hoặc nó là một
sự kiện đặc biệt (như là đóng hoặc thu nhỏ cửa sổ ,...). Hoặc trả về 0 nếu không có
sự kiện nào xảy ra.
ID của sự kiện ID của control đã gởi đi sự kiện
0 Không có sự kiện
$GUI_EVENT_CLOSE Hộp thoại bị đóng (click nút close hoặc
menu hệ thống hoặc một nút do ta tạo)
$GUI_EVENT_MINIMIZE Hộp thoại bị thu nhỏ (minimize) bởi click
nút bấm từ thanh tiêu đề
$GUI_EVENT_RESTORE Hộp thoại được phục hồi do nhấn nút ở
thanh taskbar
$GUI_EVENT_MAXIMIZE Hộp thoại được phóng lớn cực đại do
nhấn nút maximize
$GUI_EVENT_MOUSEMOVE Con trỏ chuột được di chuyển
$GUI_EVENT_PRIMARYDOWN Nút cơ bản của chuột được nhấn giữ
(thường là nút trái , nó tùy vào thiết lập
trong win)
$GUI_EVENT_PRIMARYUP Nút cơ bản của chuột được nhả ra
$GUI_EVENT_SECONDARYDOWN Nút thứ hai của chuột được nhấn giữ
(thường là nút phải)
$GUI_EVENT_SECONDARYUP Nút thức hai của chuột được nhả ra
$GUI_EVENT_RESIZED Cửa sổ được định lại kích thước (resize)
$GUI_EVENT_DROPPED Kết thúc của hành động
kéo&thả @GUI_DRAGID,
@GUI_DRAGFILE và @GUI_DROPID
sẽ được sử dụng để truy lại ID hoặc tập tin
cho các control liên quan.
Khi sử dụng tham số Advanced thì thông tin mở rộng được trả về trong mảng như
sau :
$array[0] = 0 hoặc ID của sự kiện hoặc ID của control
$array[1] = Handle của cửa sổ đã phát ra sự kiện
$array[2] = handle của control đã tạo ra sự kiện (nếu có thể áp dụng)
$array[3] = tọa độ X hiện hành của con trỏ chuột (tính theo GUI)
$array[4] = tọa độ Y hiện hành của con trỏ chuột (tính theo GUI)
Nếu bạn sử dụng chế độ GUIOnEventMode thì
hàm GUIGetMsg luôn trả về 0 và @error được gán bằng 1.
Các nút minimize , restore và maximize sẽ không thực thi bất kỳ hành động gì
Chú ý
Hàm này sẽ tự động tạo ra khoảng dừng để không làm quá tải cho CPU nên nó có
thể sử dụng một cách an toàn trong vòng lặp khép kín mà không cần bất kỳ lệnh
sleep hay delay khác
Thông tin về vị trí của con trỏ chuột và control đang được con trỏ "bay lượn" phía
trên có thể được truy lại bằng hàm GUIGetCursorInfo. Không có sự kiện nào xảy
ra khi con trỏ chuột vượt qua control vì thế GUIGetCursorInfo phải được gọi để
lấy ID của control đó.
GUIGetStyle
Truy lại các style của GUI
GUIGetStyle ( [ winhandle] )
Các tham số
winhandle [tùy chọn] handle của cửa sổ , được trả về từ hàm GUICreate... (mặc
định là GUI trước đó)
Giá trị trả về
Th.
Công : Trả về một mảng gồm hai phần tử chứa thông tin của style
$array[0] = Style
$array[1] = style mở rộng
Hỏng : Trả về 0
Chú ý
Cẩn thận về những thay đổi của style sau khi hàm GUISetState được gọi
GUIGetStyle
Truy lại các style của GUI
GUIGetStyle ( [ winhandle] )
Các tham số
winhandle [tùy chọn] handle của cửa sổ , được trả về từ hàm GUICreate... (mặc
định là GUI trước đó)
Giá trị trả về
Th. Trả về một mảng gồm hai phần tử chứa thông tin của style
Công :
$array[0] = Style
$array[1] = style mở rộng
Hỏng : Trả về 0
Chú ý
Cẩn thận về những thay đổi của style sau khi hàm GUISetState được gọi
GUIRegisterMsg
Đăng ký một hàm-do-người-dùng-định-nghĩa cho Windows Message ID
(WM_MSG) .
GUIRegisterMsg ( msgID, "function" )
Các tham số
msgID Định danh thông điệp windows (Windows Message ID , Xem
Appendix: Windows Message Codes).
function Tên của hàm sẽ được gọi khi thông điệp xuất hiện , sử dụng chuỗi
rỗng để bỏ qua , không đăng ký.
Giá trị trả về
Th.
Công : 1
Hỏng : 0
Chú ý
!!! Để hàm do bạn định nghĩa có thể làm việc được , cần gán cho nó tối đa 4 tham
số , ngược lại có thể nó sẽ không được gọi !!!
Ví dụ
Func MyUserFunction($hWndGUI, $MsgID, $WParam, $LParam)
...
EndFunc
hoặc
Func MyUserFunction($hWndGUI, $MsgID)
...
EndFunc
Khi người dùng gọi hàm thì 4 tham số sẽ mang những giá trị sau :
Vị trí Tham số Ý nghĩa
1 hWnd Handle của GUI mà thông điệp sẽ xuất hiện
2 Msg Định danh (ID) của thông điệp Windows
3 wParam Tham số thông điệp đầu tiên (giá trị hex)
4 lParam Tham số thông điệp thứ hai (giá trị hex)
Có thể đăng ký tối đa 256 hàm cho các thông điệp windows
Theo mặc định , sau khi hàm người dùng kết thúc thì trình điều khiển
thông điệp nội bộ của AutoIT sẽ tiếp tục làm việc. Điều đó sẽ không xảy ra
nếu như lệnh Return trong hàm của bạn trả về một giá trị hoặc return mà
không có giá trị theo sau.
!!! Nếu bạn muốn AutoIT chạy trình điều khiển nội bộ đối với một thông
điệp , thì hàm-người-dùng nên trả về biến $GUI_RUNDEFMSG (trong thư
viện GUIConstantsEx.au3) !!!
Ví dụ : khi bạn muốn hàm trở về sớm hơn so với tiến trình kết thúc của
nó và tiếp tục chạy trình điều khiển thông điệp nội bộ
Cẩn trọng : cản trở việc chạy một hàm-người-dùng đang thực thi một
thông điệp cửa sổ với một lệnh như MsgBox() thì có thể đưa đến một cách
chạy không mong đợi, hệ thống sẽ trở về nhanh như có thể !!!
Vài control có sử dụng các định danh thông điệp Windows đặc biệt , cho
nên việc đăng ký chúng không có hiệu quả. Ví dụ như : WM_CHAR,
WM_KEYDOWN, WM_KEYUP được dùng bởi control edit.
GUISetAccelerators
Cài đặt một bảng tăng tốc cho GUI . Bảng tăng tốc này sẽ cho phép người dùng sử
dụng các phím nóng
GUISetAccelerators ( accelerators [, winhandle] )
Các tham số
Accelerators Một mảng hai chiều để tổ chức bảng tăng tốc (xem chú ý)
winhandle [tùy chọn] handle của cửa sổ cần cài đặt , được trả về từ hàm
GUICreate (mặc định là gui trước đó).
Giá trị trả về
Th.
Công : Returns 1.
Hỏng : Returns 0.
Chú ý
Mảng này có chức năng là chứa phím nóng (hotkey) và ID của control cần gọi .
Mảng phải được định nghĩa như sau :
Dim $array[n][2] – trong đó n là tổng số phím tăng tốc cần thiết lập
$array[0][0] = Hotkey (theo định dạng của hàm HotKeySet) đầu tiên
$array[0][1] = Control ID sẽ dùng cho hotkey đầu tiên, được trả về từ hàm
GUICtrlCreate...
$array[1][0] = Hotkey thứ hai
$array[1][1] = Control ID sẽ dùng cho hotkey thứ hai...
.........
$array[n][0] = Hotkey thứ n
$array[n][1] = Control ID sẽ dùng cho hotkey thứ n
Nếu tham số truyền không phải là mảng hai chiều thì sẽ không có trình tăng tốc
nào được tạo.
GUISetBkColor
Thiết lập màu nền cho cửa sổ
GUISetBkColor ( background [, winhandle] )
Các tham số
Background Màu nền cần gán
winhandle [tùy chọn] handle của cửa sổ mà bạn muốn gán màu (mặc định là cửa
sổ trước đó)
Giá trị trả về
Th.
Công : Returns 1.
Hỏng : Returns 0.
Chú ý
Những phiên bản trước của AutoIt (v3.0.102) sử dụng định dạng màu BGR ,
những phiên bản mới hơn sử dụng RGB theo mặc định. Tuy nhiên bạn có thể thay
đổi điều này bằng lựa chọn ColorMode.
GUISetFont
Thiết lập font chữ mặc định cho GUI
GUISetFont (size [, weight [, attribute [, fontname [, winhandle]]]] )
Các tham số
Size Kích cỡ của font (mặc định là 8.5)
weight [tùy chọn] trọng lượng của font (bình thường = 400)
attribute
[tùy chọn] muốn thiết lập định dạng cho ký tự , ta có in nghiêng : 2 ,
gạch chân : 4 , gạch ngang (strike) : 8 . Muốn kết hợp nhiều định dạng
ta cộng các giá trị với nhau. Ví dụ , muốn có chữ in nghiêng và gạch
chân , ta dùng 2+4.
fontname [tùy chọn] tên của font chữ sẽ dùng
winhandle [tùy chọn] handle của cửa sổ , được trả về từ hàm GUICreate (mặc
định là cửa sổ đã dùng trước đó)
Giá trị trả về
Th.
Công : Returns 1.
Hỏng : Returns 0.
Chú ý
Size có thể là một số thập phân , như 8.5
Vài control như Label , mặc định giá trị 8.5 có thể được thay bằng 9 theo
ghi nhận từ Windows Theme
Xem Appendix để có được một danh sách đầy đủ về các font của
windows
GUISetHelp
Cài đặt một file thi hành để gọi khi phím F1 được nhấn
GUISetHelp ( helpfile [, winhandle] )
Các tham số
Helpfile File sẽ chạy khi mà phím F1 được nhấn (lúc gui đã được kích hoạt)
Winhandle [tùy chọn] handle của cửa sổ , được trả về từ hàm GuiCreate(mặc định
là Gui trước đó)
Giá trị trả về
Th.
Công : Returns 1.
Hỏng : Returns 0.
GUISetOnEvent
Thiết lập một hàm cần gọi khi có một nút được nhấn (hàm đó do người viết mã
soạn)
GUISetOnEvent ( specialID, "function" [, winhandle] )
Các tham số
specialID Xem bảng ID bên dưới
function Tên của hàm cần gọi (hàm này do người viết script soạn)
winhandle [tùy chọn] handle của cửa sổ cần thiết lập , được trả về từ hàm
GUICreate (mặc định là gui trước đó)
Giá trị trả về
Th.
Công : Returns 1.
Hỏng : Returns 0.
Chú ý
Các hàm OnEvent chỉ được gọi khi lựa chọn chế độ xử lý gui là
GUIOnEventMode (chế độ vòng lặp thông điệp sẽ không làm việc khi có lựa
chọn Opt("GuiOnEventMode", 1) ) . Đồng thời các nút minimize, maximize
và restore sẽ không đưa ra bất cứ phản ứng nào.
Nếu function là một chuỗi rỗng "" , thì không có phản ứng xảy ra khi
người dùng thao tác.
Bảng ID đặc biệt
Special Id Miêu tả
$GUI_EVENT_CLOSE Hộp thoại bị đóng (click nút close hoặc
menu hệ thống hoặc một nút do ta tạo)
$GUI_EVENT_MINIMIZE Hộp thoại bị thu nhỏ (minimize) bởi click
nút bấm từ thanh tiêu đề
$GUI_EVENT_RESTORE Hộp thoại được phục hồi do nhấn nút ở
thanh taskbar
$GUI_EVENT_MAXIMIZE Hộp thoại được phóng lớn cực đại do
nhấn nút maximize
$GUI_EVENT_MOUSEMOVE Con trỏ chuột được di chuyển
$GUI_EVENT_PRIMARYDOWN Nút cơ bản của chuột được nhấn giữ
(thường là nút trái , nó tùy vào thiết lập
trong win)
$GUI_EVENT_PRIMARYUP Nút cơ bản của chuột được nhả ra
$GUI_EVENT_SECONDARYDOWN Nút thứ hai của chuột được nhấn giữ
(thường là nút phải)
$GUI_EVENT_SECONDARYUP Nút thức hai của chuột được nhả ra
$GUI_EVENT_RESIZED Cửa sổ được định lại kích thước (resize)
$GUI_EVENT_DROPPED Kết thúc của hành động
kéo&thả @GUI_DRAGID,
@GUI_DRAGFILE và @GUI_DROPID
sẽ được sử dụng để truy lại ID hoặc tập tin
cho các control liên quan.
GUISetState
Thay đổi trạng thái của cửa sổ GUI
GUISetState ( [flag [, winhandle]] )
Các tham số
flag
[tùy chọn]
@SW_SHOW = hiển thị cửa sổ đã ẩn trước đó (default)
@SW_HIDE = Ẩn cửa sổ
@SW_MINIMIZE = Minimize (cực tiểu) cửa sổ
@SW_MAXIMIZE = Maximize (cực đại) cửa sổ
@SW_RESTORE = phục hồi lại cửa sổ đã bị cực tiểu
@SW_DISABLE = Vô hiệu cửa sổ
@SW_ENABLE = kích hoạt cửa sổ
@SW_LOCK = Khóa cửa sổ không cho vẽ lại
@SW_UNLOCK = Mở khóa cửa sổ , cho phép vẽ lại
winhandle [tùy chọn] handle của gui cần thiết lập trạng thái , trả về từ hàm
GUICreate (mặc định là GUI trước đó)
Giá trị trả về
Th.
Công : Returns 1.
Hỏng : Returns 0.
Chú ý
Khi cửa sổ được tạo ra , chúng sẽ bị ẩn . Cho nên muốn hiển thị cửa sổ ta
phải gọi hàm này với tham số @SW_SHOW
Chỉ một cửa sổ là có thể bị khóa với @SW_LOCK. Các @SW_LOCK
khác sẽ khóa cửa sổ khi có yêu cầu. @SW_UNLOCK bỏ qua "winhandle"
để mở khóa bất kỳ cửa sổ nào bị khóa..
GUISetStyle
Thay đổi style cho cửa sổ
GUISetStyle ( Style [,ExStyle [, winhandle]] )
Các tham số
Style
Định nghĩa style cho cửa sổ. Xem GUI Control Styles Appendix.
sử dụng -1 để bỏ qua , không thay đổi
exStyle
[tùy chọn] định nghĩa style mở rộng cho gui. Xem bảng Extended
Style Table bên dưới. -1 là mặc định
, không thay đổi style
winhandle [tùy chọn] handle của cửa sổ cần thiết lập , được trả về từ hàm
GUICreate (mặc định là Gui trước đó)
Giá trị trả về
Th.
Công : Returns 1.
Hỏng : Returns 0.
Chú ý
Sẽ không có sự kiểm tra nào trên giá trị của style , cũng không có sự tác động nào
đối với các control đã định nghĩa. Đó là trách nhiệm của người thiết kế để đảm bảo
tính tương thích.
GUICtrlCreateLabel
Label là chính là một text box, nó đảm nhiệm chức năng hiển thị nội dung của văn
bản lên trên GUI. Văn bản hiển thị trên đó là văn bản tĩnh, mà thông thường đối
với C++ hay vài ngôn ngữ khác người ta gọi là Static.
Để tạo một Label , ta có hàm với cú pháp sau :
GUICtrlCreateLabel ( "text", left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
Text Văn bản sẽ hiển thị
left Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode.
Top Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó
height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước
đó.
style [tùy chọn] định nghĩa style cho control. Xem trong GUI Control
Styles Appendix.
default ( -1) : none.
các style bắt buộc : $SS_NOTIFY, $SS_LEFT
exStyle [tùy chọn] định nghĩa style mở rộng cho control. Xem Extended Style
Table.
Giá trị trả về
Th.
Công : Trả về ID (định danh) của control Label vừa tạo
Hỏng : Trả về 0
Chú ý
Để thay đổi thông tin trên control, xem GUICtrlSet....
Để kết hợp style mặc định với các style khác,
gọi BitOr($GUI_SS_DEFAULT_LABEL, newstyle,...
Muốn dùng các giá trị nêu trên, phải gọi #include <StaticConstants.au3>
trong file script của bạn
Đưa về kích thước mặc định là $GUI_DOCKAUTO
Style mở rộng $GUI_WS_EX_PARENTDRAG cho phép bạn kéo những
cửa sổ bố-mẹ không có thanh tiêu đề (không có $WS_CAPTION trong
GUICreate)
Để thiết lập màu nền trong suốt, gọi GUICtrlSetBkColor(-1,
$GUI_BKCOLOR_TRANSPARENT).
Ví dụ
#include <GUIConstantsEx.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $widthCell, $msg, $iOldOpt
; will create a dialog box that when displayed is centered
GUICreate("My GUI")
GUISetHelp("notepad") ; will run notepad if F1 is typed
$iOldOpt = Opt("GUICoordMode", 2)
$widthCell = 70
GUICtrlCreateLabel("Line 1 Cell 1", 10, 30, $widthCell) ; first cell 70 width
GUICtrlCreateLabel("Line 2 Cell 1", -1, 0) ; next line
GUICtrlCreateLabel("Line 3 Cell 2", 0, 0) ; next line and next cell
GUICtrlCreateLabel("Line 3 Cell 3", 0, -1) ; next cell same line
GUICtrlCreateLabel("Line 4 Cell 1", -3 * $widthCell, 0) ; next line Cell1
GUISetState() ; will display an empty dialog box
; Run the GUI until the dialog is closed
Do
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
$iOldOpt = Opt("GUICoordMode", $iOldOpt)
EndFunc ;==>Example
GUICtrlCreatePic
Hàm này sẽ tạo ra một control cho phép nạp và hiển thị hình ảnh (picture) trên
GUI.
GUICtrlCreatePic ( filename, left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
Filename Đường dẫn và tên đầy đủ file ảnh cần load. Hỗ trợ ảnh BMP, JPG và
GIF (không có hình động)
left Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode.
Top Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó
height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước
đó.
Style
[Tùy chọn] Định nghĩa style cho control. Xem GUI Control Styles
Appendix.
default (-1) : $SS_NOTIFY
style bắt buộc : $SS_BITMAP
exStyle [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table.
Giá trị trả về
Th.
Công : Trả về ID của control picture vừa được tạo
Hỏng : Trả về 0 nếu ảnh không tạo được ảnh
Chú ý
Để thiết lập hoặc thay đổi thông tin picture, xem hàm GUICtrlSet....
Để cập nhật ảnh sau khi hộp thoại đã được hiển thị , sử dụng hàm
GUICtrlSetImage
Nếu bạn muốn ảnh hiển thị với kích thước gốc của nó , gán width = heigh
= 0
Nếu bạn muốn có một ảnh trong suốt , bạn cần tạo GUI với style mở
rộng $WS_LAYERED. Điểm ảnh left-top (góc trái trên) sẽ được dùng làm
màu trong suốt. Khi có nhiều ảnh được tạo , thì ảnh cuối cùng được định
nghĩa màu trong suốt. Xem example 2.
.Để kết hợp style mặc định với style khác , sử dụng
BitOr($GUI_SS_DEFAULT_PIC, newstyle,...).
Để sử dụng được các giá trị nêu trên , gọi thư viện #include
<StaticConstants.au3>
Đưa về kích thước mặc định : $GUI_DOCKSIZE.
Nếu một ảnh được thiết lập làm ảnh trong suốt , các control khác sẽ bị
phủ lấp , điều quan trọng là phải vô hiệu control pic và tạo nó sau khi bạn đã
tạo các control khác : GUICtrlSetState(-1, $GUI_DISABLE). Chỉ điều này
thôi thì chưa đủ cho control Tab và ListView vì chúng sẽ hoạt động hơi khác
thường. Trong trường hợp này bạn cần tạo ảnh với style
$WS_CLIPSIBLINGS , GuiCtrlSetState(-1,$GUI_ONTOP) là cần thiết cho
control Tab và ListView.
Style mở rộng $GUI_WS_EX_PARENTDRAG cho phép bạn nắm và
kéo những cửa sổ con không có thanh tiêu đề.
Nền thì luôn được làm cho trong suốt. GUICtrlSetBkColor( ) thì không
có tác dụng đối với control picture.
PNG có thể được dùng với GDI+. Xem example 3.
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Global $gui, $guiPos, $pic, $picPos
Example1()
Example2()
;----- example 1 ----
Func Example1()
Local $n, $msg
GUICreate("My GUI picture", 350, 300, -1, -1, $WS_SIZEBOX +
$WS_SYSMENU) ; will create a dialog box that when displayed is centered
GUISetBkColor(0xE0FFFF)
$n = GUICtrlCreatePic(@SystemDir & "\oobe\images\mslogo.jpg", 50, 50,
200, 50)
GUISetState()
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
;~ GUISetState ()
; resize the control
$n = GUICtrlSetPos($n, 50, 50, 200, 100)
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
GUIDelete()
EndFunc ;==>Example1
;----- example 2
Func Example2()
Local $msg
$gui = GUICreate("test transparentpic", 200, 100,-1 )
$pic = GUICreate("", 68, 71, 10, 10, $WS_POPUP,
BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)
GUICtrlCreatePic(@SystemDir & "\oobe\images\merlin.gif", 0, 0, 0, 0,-
1,$GUI_WS_EX_PARENTDRAG )
GUISetState(@SW_SHOW, $gui)
GUISetState(@SW_SHOW, $pic)
HotKeySet("{ESC}", "main")
HotKeySet("{LEFT}", "left")
HotKeySet("{RIGHT}", "right")
HotKeySet("{DOWN}", "down")
HotKeySet("{UP}", "up")
$picPos = WinGetPos($pic)
$guiPos = WinGetPos($gui)
Do
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
EndFunc ;==>Example2
Func main()
$guiPos = WinGetPos($gui)
WinMove($gui, "", $guiPos[0] + 10, $guiPos[1] + 10)
EndFunc ;==>main
Func left()
$picPos = WinGetPos($pic)
WinMove($pic, "", $picPos[0] - 10, $picPos[1])
EndFunc ;==>left
Func right()
$picPos = WinGetPos($pic)
WinMove($pic, "", $picPos[0] + 10, $picPos[1])
EndFunc ;==>right
Func down()
$picPos = WinGetPos($pic)
WinMove($pic, "", $picPos[0], $picPos[1] + 10)
EndFunc ;==>down
Func up()
$picPos = WinGetPos($pic)
WinMove($pic, "", $picPos[0], $picPos[1] - 10)
EndFunc ;==>up
;----- example 3 PNG work araund by Zedna
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#Include <WinAPI.au3>
Global $hGUI, $hImage, $hGraphic, $hImage1
; Create GUI
$hGUI = GUICreate("Show PNG", 350, 301)
; Load PNG image
_GDIPlus_StartUp()
$hImage =
_GDIPlus_ImageLoadFromFile("E:\WINDOWS\system32\oobe\images\tha
nks8.png")
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
GUISetState()
; Loop until user exits
do
until GUIGetMsg() = $GUI_EVENT_CLOSE
; Clean up resources
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ShutDown()
; Draw PNG image
Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
_WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
_WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
Return $GUI_RUNDEFMSG
EndFunc
GUICtrlCreateButton Tạo một nút bấm cho GUI
GUICtrlCreateButton ( "text", left, top [, width [, height [, style [, exStyle]]]] ) Các tham số Text Văn bản sẽ hiện trên nút bấm left Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode. Top Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode. width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước
đó.
style
[Tùy chọn] Định nghĩa style cho control. Xem GUI Control Styles Appendix. default ( -1) : none. style bắt buộc : $WS_TABSTOP
exStyle [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table. Giá trị trả về Th. Công : Trả về ID của control Button vừa tạo
Hỏng : Trả về 0 Chú ý
Để thay đổi thông tin của button, sử dụng GUICtrlSet....
Một nút bấm có thể hiển thị kèm theo một icon hoặc ảnh bằng cách sử
dụng style $BS_ICON hoặc $BS_BITMAP . Gọi GUICtrlSetImage để chỉ
định ảnh mà bạn muốn dùng.
Để kết hợp style mở rộng và các style khác, gọi
BitOr($GUI_SS_DEFAULT_BUTTON, newstyle,...).
Các giá trị bên trên muốn dùng được, cần gọi đến thư viện #include
<ButtonConstants.au3>
Đưa về kích thước mặc định : $GUI_DOCKSIZE
Ví dụ #include<GUIConstantsEx.au3> Opt('MustDeclareVars',1) Example() Func Example() Local$Button_1,$Button_2,$msg GUICreate("My GUI Button"); will create a dialog box that when displayed is centered Opt("GUICoordMode",2) $Button_1=GUICtrlCreateButton("Run Notepad",10,30,100) $Button_2=GUICtrlCreateButton("Button Test",0,-1) GUISetState() ; will display an dialog box with 2 button ; Run the GUI until the dialog is closed While1 $msg=GUIGetMsg() Select Case$msg=$GUI_EVENT_CLOSE ExitLoop Case$msg=$Button_1 Run('Notepad.exe') ; Will Run/Open Notepad Case$msg=$Button_2 MsgBox(0,'Testing','Button 2 was pressed') ; Will demonstrate Button 2 being pressed EndSelect WEnd EndFunc ;==>Example
GUICtrlCreateInput
Input chính là một textbox cho phép người dùng nhập văn bản vào . Văn bản đó có
thể được phân loại, kiểm tra xem có phù hợp với định dạng hay không. Định dạng
đó có thể là , chỉ cho phép nhập số không được nhập ký tự chẳng hạn. Hình thức
input mà bạn thường gặp nhất là ở các hộp thoại đăng nhập, yêu cầu user và
password.
GUICtrlCreateInput ( "text", left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
text The text of the control.
left Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề trái được tính theo GUICoordMode.
Top Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề trái được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước
đó.
style
[tùy chọn] Định nghĩa style cho input. Xem GUI Control Styles
Appendix.
default ( -1) : $ES_LEFT, $ES_AUTOHSCROLL
style bắt buộc : $WS_TABSTOP only if no $ES_READONLY.
$ES_MULTILINE is always reset.
exStyle [tùy chọn] định nghĩa style mở rộng. Xem Extended Style Table.
Giá trị trả về
Th.
Công : Trả về ID của control Input vừa tạo
Hỏng : Trả về 0
Chú ý
Để đọc nội dung của input, xem hàm GUICtrlRead.
Để gán thông tin cho input , xem hàm GUICtrlSet....
Dùng input như một hộp nhập password thì dùng style
$ES_PASSWORD (mỗi ký tự nhập vào sẽ được thay bằng dấu * )
Nếu bạn muốn kéo thả một filename vào input, sử dụng style mở
rộng WS_EX_ACCEPTFILES trong hàm tạo cửa sổ GUICreate() và thiết
lập trạng thái $GUI_DROPACCEPTED.
Nếu có nhiều tập tin được kéo thả vào control, tên của các tập tin được
ngăn cách với nhau bằng dấu gạch đứng " | ". Dùng GuiCtrlRead để lấy văn
bản này.
Thư viện chứa các giá trị nêu trên #include <EditConstants.au3>
Đưa về kích thước mặc định $GUI_DOCKHEIGHT.
Ví dụ
#include <GUIConstantsEx.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $file, $btn, $msg
GUICreate(" My GUI input acceptfile", 320, 120, @DesktopWidth / 2 -
160, @DesktopHeight / 2 - 45, -1, 0x00000018); WS_EX_ACCEPTFILES
$file = GUICtrlCreateInput("", 10, 5, 300, 20)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlCreateInput("", 10, 35, 300, 20) ; will not accept drag&drop
files
$btn = GUICtrlCreateButton("Ok", 40, 75, 60, 20)
GUISetState()
$msg = 0
While $msg <> $GUI_EVENT_CLOSE
$msg = GUIGetMsg()
Select
Case $msg = $btn
ExitLoop
EndSelect
WEnd
MsgBox(4096, "drag drop file", GUICtrlRead($file))
EndFunc ;==>Example
GUICtrlCreateEdit
Edit chính là hộp soạn thảo văn bản tương tự như input. Nhưng input thì chỉ có một
dòng, còn edit thì có nhiều dòng và kích thước lớn. Vùng soạn thảo văn bản của
notepad chính là một Edit. Muốn tạo một Edit , bạn chỉ cần gọi và thiết lập đúng
hàm sau :
GUICtrlCreateEdit ( "text", left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
text Văn bản hiển thị trên edit
left Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode.
Top Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó
height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước
đó.
style
[Tùy chọn] Định nghĩa style cho control. Xem GUI Control Styles
Appendix.
default ( -1) : $ES_WANTRETURN, $WS_VSCROLL,
$WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL
style bắt buộc : $ES_MULTILINE, $WS_TABSTOP only if not
$ES_READONLY
exStyle [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table.
Giá trị trả về
Th.
Công : Trả về ID của Edit vừa được tạo
Hỏng : Trả về 0
Chú ý
Để đọc nội dung của edit, xem hàm GUICtrlRead.
Để gán thông tin cho edit , xem hàm GUICtrlSet....
Nếu bạn muốn kéo thả một filename vào edit, sử dụng style mở
rộng WS_EX_ACCEPTFILES trong hàm tạo cửa sổ GUICreate() và thiết
lập trạng thái $GUI_DROPACCEPTED.
Nếu có nhiều file được chọn để kéo thả vào Edit thì tên của mỗi file được
ghi trên một dòng riêng biệt
Thư viện chứa các giá trị được nêu ở trên #include <EditConstants.au3>
Đưa về kích thước mặc định $GUI_DOCKAUTO
Việc tạo một RichEdit thì quá phức tạp vì thế không đề cập ở đây. Nó
phải sử dụng đến GuiCtrlCreateObj. Bạn muốn tìm hiểu thì xem ở ví dụ 2
trong file help của AutoIt.
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $myedit, $msg
GUICreate("My GUI edit") ; will create a dialog box that when displayed is
centered
$myedit = GUICtrlCreateEdit("First line" & @CRLF, 20, 32,350, 200,
$ES_AUTOVSCROLL + $WS_VSCROLL)
GUISetState()
Send("{END}")
; will be append dont' forget 3rd parameter
GUICtrlSetData($myedit, "Second line", 1)
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
GUIDelete()
EndFunc ;==>Example
GUICtrlCreateRadio
Radio là một dạng nút-lựa-chọn gần giống như checkbox , nhưng khác với
checkbox ở hai điểm. Thứ nhất là các radio thường tập hợp thành một nhóm với
nhau. Thứ hai là trong nhóm đó bạn chỉ được phép chọn một (giống như trắc
nghiệm vậy). Hàm sau cho phép bạn tạo mỗi lần một nút radio.
GUICtrlCreateRadio ( "text", left, top [, width [, height [, style [, exStyle]]]]
)
Các tham số
Text Văn bản hiện thị cạnh bên miêu tả nội dung của radio (không phải
tooltip)
left Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode.
Top Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó
height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước
đó.
style [Tùy chọn] Định nghĩa style cho control. Xem GUI Control Styles
Appendix.
default ( -1) : none.
style bắt buộc : $BS_AUTORADIOBUTTON và $WS_TABSTOP
nếu là nút radio đầu tiên trong nhóm.
exStyle [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table.
Giá trị trả về
Th.
Công : Trả về ID (mới) của nút radio vừa được tạo
Hỏng : Trả về 0
Chú ý
Để đọc giá trị của radio (có được chọn hay không), xem hàm
GUICtrlRead.
Để thiết lập thông tin cho radio, xem hàm GUICtrlSet....
Để kết hợp style mặc định với style khác,
dùng BitOr($GUI_SS_DEFAULT_RADIO, newstyle,...).
Để sử dụng được các giá trị nêu ở trên, cần gọi thư viện #include
<ButtonConstants.au3>
Đưa về kích thước mặc định $GUI_DOCKHEIGHT.
Ví dụ
#include <GUIConstantsEx.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $radio1, $radio2, $msg
GUICreate("My GUI radio") ; will create a dialog box that when displayed
is centered
$radio1 = GUICtrlCreateRadio("Radio 1", 10, 10, 120, 20)
$radio2 = GUICtrlCreateRadio("Radio 2", 10, 40, 120, 20)
GUICtrlSetState($radio2, $GUI_CHECKED)
GUISetState() ; will display an dialog box with 1 checkbox
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $radio1 And BitAND(GUICtrlRead($radio1),
$GUI_CHECKED) = $GUI_CHECKED
MsgBox(64, 'Info:', 'You clicked the Radio 1 and it is Checked.')
Case $msg = $radio2 And BitAND(GUICtrlRead($radio2),
$GUI_CHECKED) = $GUI_CHECKED
MsgBox(64, 'Info:', 'You clicked on Radio 2 and it is Checked.')
EndSelect
WEnd
EndFunc ;==>Example
GUICtrlCreateList
Hàm này sẽ giúp bạn tạo ra một cái danh sách để chứa thông tin. Danh sách là một
dạng dữ liệu rất hay gặp trong đời thường và trên máy tính (ở các chương trình
nghe nhạc và quản lý). Tuy nhiên, ở đây AutoIt chỉ hỗ trợ bạn tạo ra một danh sách
với các tính năng đơn giản, thông dụng. Danh sách này chỉ có một cột nhưng lại có
nhiều dòng. Nếu bạn cần một danh sách có nhiều cột và nhiều dòng thì hãy dùng
ListView , ở đây tôi không đề cập đến phần này. Cú pháp cho bạn tạo một Listbox
như sau :
GUICtrlCreateList ( "text", left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
Text Văn bản sẽ hiển thị trong List box
left Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode.
Top Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề
trái được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó
height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước
đó.
style
[Tùy chọn] Định nghĩa style cho control. Xem GUI Control Styles
Appendix.
default ( -1) : $LBS_SORT, $WS_BORDER, $WS_VSCROLL
style bắt buộc : $WS_TABSTOP, $LBS_NOTIFY
exStyle [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table.
Giá trị trả về
Th.
Công : Trả về ID của listbox vừa tạo
Hỏng : Trả về 0
Chú ý
Để đọc các giá trị của listbox , xem hàm GUICtrlRead
Để thiết lập hoặc thay đổi thông tin , xem hàm GUICtrlSet....
Nhiều mục-nhập (entry) khác nhau trong danh sách có thể được chọn ,
được thiết lập với GUICtrlSetData
Để giới hạn mức cuộn (srolling) theo chiều ngang , dùng hàm
GUICtrlSetLimit
Để kết hợp style mặc định với các style khác ,
gọi BitOr($GUI_SS_DEFAULT_LIST, newstyle,...).
Để sử dụng được các giá trị nêu trên , cần gọi thư viện : #include
<ListBoxConstants.au3>
Đưa về kích thước mặc định (size và vị trí) : $GUI_DOCKAUTO
Ví dụ
#include <GUIConstantsEx.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $MESSAGE = "The following buttons have been clicked"
Local $add, $clear, $mylist, $close, $msg
GUICreate("My GUI list") ; will create a dialog box that when displayed is
centered
$add = GUICtrlCreateButton("Add", 64, 32, 75, 25)
$clear = GUICtrlCreateButton("Clear", 64, 72, 75, 25)
$mylist = GUICtrlCreateList("buttons that have been clicked", 176, 32, 121,
97)
GUICtrlSetLimit(-1, 200) ; to limit horizontal scrolling
GUICtrlSetData(-1, $MESSAGE)
$close = GUICtrlCreateButton("my closing button", 64, 160, 175, 25)
GUISetState()
$msg = 0
While $msg <> $GUI_EVENT_CLOSE
$msg = GUIGetMsg()
Select
Case $msg = $add
GUICtrlSetData($mylist, "You clicked button No1|")
Case $msg = $clear
GUICtrlSetData($mylist, "")
Case $msg = $close
MsgBox(0, "", "the closing button has been clicked", 2)
Exit
EndSelect
WEnd
EndFunc ;==>Example
GUICtrlCreateListView
ListView cũng chính là một danh sách (Listbox) nhưng nó có nhiều dòng và nhiều
cột , tạo thành một ma trận. Listview mà bạn thường thấy là trong Windows
Explorer , khi bạn duyệt file với chế độ View là Detail.
GUICtrlCreateListView ( "text", left, top [, width [, height [, style [,
exStyle]]]] )
Các tham số
text
Văn bản này sẽ là tiêu đề của các cột trong listview. Mỗi tiêu đề sẽ
được ngăn cách với ký tự được chỉ định
trong Opt("GUIDataSeparatorChar").
left Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề trái
được tính theo GUICoordMode.
Top Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề trái
được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó
height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước đó.
style
[tùy chọn] định nghĩa style cho control. Xem GUI Control Styles
Appendix.
default (-1) : $LVS_SHOWSELALWAYS, $LVS_SINGLESEL
style bắt buộc : $LVS_REPORT
exStyle [tùy chọn] định nghĩa style mở rộng cho control. Xem Extended Style
Table hoặc ListView Extended Style Table.
Giá trị trả về
Th.
Công : Trả về ID của listview vừa được tạo
Hỏng : Trả về 0
Chú ý
Để thêm các mục vào Listview , sử dụng hàm
GUICtrlCreateListViewItem
ListView sẽ xuất hiện mặc định như trong windows explorer với view là
Detail (LVS_REPORT là bắt buộc).
Bạn có thể khởi tạo kích thước cho một cột bằng cách nối thêm các khoảng
trắng vào tiêu đề của cột. Cột có thể được mở rộng theo chiều dài của mục-
(item)-được-thêm-vào bởi GUICtrlCreateListViewItem. Kích thước của một
cột sẽ lên đến 25 ký tự. Nhưng sẽ không có một sự resize được diễn ra khi
bạn cập nhật nội dung ListView bằng GuiCtrlSetData.
Để tạo một ListView với icon, icon nhỏ hoặc chỉ là một kiểu List , sau
khi tạo bạn gọi hàm GUICtrlSetStyle với các style : $LVS_ICON,
$LVS_SMALLICON hoặc $LVS_LIST.
Chức năng sắp xếp các mục trong ListView bằng cách nhấp vào tiêu đề
của cột (như trong Explorer) thì không có tác dụng.
Khi bạn chọn một mục trong ListView, bạn muốn toàn bộ dòng đó được
phát sáng thay vì chỉ có ở một cột thì hãy gọi style mở
rộng $LVS_EX_FULLROWSELECT.
Để kết hợp style mặc định với style khác , bạn
gọi BitOr($GUI_SS_DEFAULT_LISTVIEW, newstyle,...).
Thư viện cần thiết cho các tham số nêu ở trên là : #include
<ListViewConstants.au3>
$GUI_BKCOLOR_LV_ALTERNATE là một cờ đặc biệt , có thể dùng
với Listview để làm cho màu nền giữa các dòng có thể xen kẽ nhau.
- Dòng chẵn sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của
control ListView
- Dòng lẻ sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của
control ListViewItem
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $listview, $button, $item1, $item2, $item3, $input1, $msg
GUICreate("listview items", 220, 250, 100, 200, -1,
$WS_EX_ACCEPTFILES)
GUISetBkColor(0x00E0FFFF) ; will change background color
$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200,
150);,$LVS_SORTDESCENDING)
$button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
$item1 = GUICtrlCreateListViewItem("item2|col22|col23", $listview)
$item2 = GUICtrlCreateListViewItem("item1|col12|col13", $listview)
$item3 = GUICtrlCreateListViewItem("item3|col32|col33", $listview)
$input1 = GUICtrlCreateInput("", 20, 200, 150)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and
dropping
GUISetState()
GUICtrlSetData($item2, "ITEM1")
GUICtrlSetData($item3, "||COL33")
GUICtrlDelete($item1)
Do
$msg = GUIGetMsg()
Select
Case $msg = $button
MsgBox(0, "listview item", GUICtrlRead(GUICtrlRead($listview)), 2)
Case $msg = $listview
MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
EndSelect
Until $msg = $GUI_EVENT_CLOSE
EndFunc ;==>Example
GUICtrlCreateListViewItem
Tạo ra một mục (item) mới để thêm vào trong ListView.
GUICtrlCreateListViewItem ( "text", listviewID )
Các tham số
Text Văn bản của các mục (item) phụ, mỗi mục được ngăn cách với
Opt("GUIDataSeparatorChar").
listviewID Định danh (ID) của control ListView mà bạn muốn thêm item vào
Giá trị trả về
Th.
Công : Định danh (ID) của mục vừa được tạo
Failure: Trả về 0
Chú ý
Hàm này tạo ra những mục (item) Listview đặc biệt, chúng có thể được
chọn, có tính năng như những control bình thường và có thể được thiết lập
với GUICtrlSetData.
Các item này có thể được xóa bỏ như các control khác khi gọi hàm
GUICtrlDelete
Những mục trong Listview có thể được kéo thả vào trong một control
Edit hay Input , khi được thiết lập trạng thái (state)
$GUI_DROPACCEPTED.
Xem hàm GUICtrlCreateListView về việc resize lại kích thước của các
cột.
$GUI_BKCOLOR_LV_ALTERNATE là một cờ đặc biệt , có thể dùng
với Listview để làm cho màu nền giữa các dòng có thể xen kẽ nhau.
- Dòng chẵn sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của
control ListView
- Dòng lẻ sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của
control ListViewItem
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $listview, $button, $item1, $item2, $item3, $input1, $msg
GUICreate("listview items", 220, 250, 100, 200, -1,
$WS_EX_ACCEPTFILES)
GUISetBkColor(0x00E0FFFF) ; will change background color
$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200,
150);,$LVS_SORTDESCENDING)
$button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
$item1 = GUICtrlCreateListViewItem("item2|col22|col23", $listview)
$item2 = GUICtrlCreateListViewItem("............item1|col12|col13",
$listview)
$item3 = GUICtrlCreateListViewItem("item3|col32|col33", $listview)
$input1 = GUICtrlCreateInput("", 20, 200, 150)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and
dropping
GUISetState()
GUICtrlSetData($item2, "|ITEM1")
GUICtrlSetData($item3, "||COL33")
GUICtrlDelete($item1)
Do
$msg = GUIGetMsg()
Select
Case $msg = $button
MsgBox(0, "listview item", GUICtrlRead(GUICtrlRead($listview)), 2)
Case $msg = $listview
MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
EndSelect
Until $msg = $GUI_EVENT_CLOSE
EndFunc ;==>Example
GUICtrlDelete
Xóa bỏ một control
GUICtrlDelete ( controlID )
Các tham số
controlID Định danh (ID) của control . Định danh này được trả về bởi hàm
GUICtrlCreate...
Giá trị trả về
Th.
Công : Trả về 1
Hỏng : Trả về 0.
Chú ý
Đối với việc xóa ContextMenu (menu ngữ cảnh) , xem remark của
GUICtrlCreateContextMenu.
GUICtrlGetState
Lấy trạng thái hiện hành của control
GUICtrlGetState ( [controlID] )
Các tham số
controlID [tùy chọn] định danh của control được trả về từ hàm GUICtrlCreate....
Giá trị trả về
Th.
Công : Trả về trạng thái. Xem hàm GUICtrlSetState để biết giá trị
Hỏng : Trả về -1 nếu control không được định nghĩa
Chú ý
Khác với hàm GUICtrlRead , hàm này chỉ trả về trạng thái của control : kích
hoạt/vô hiệu/ẩn/hiện/cho phép kéo thả
Ngoại lệ : với ListView nó trả về tổng số cột đã click
GUICtrlRead
Đọc trạng thái hoặc dữ liệu của control
GUICtrlRead ( controlID [, advanced] )
Các tham số
controlID Định danh của control , được trả về từ hàm GUICtrlCreate...
advanced
[tùy chọn] trả về thông tin mở rộng của control
0 = (Default) trả về một giá trị là trạng thái hoặc dữ liệu của control
1 = trả về thông tin mở rộng (xem chú ý)
Giá trị trả về
Th.
Công : Trả về giá trị phụ thuộc vào loại control
Hỏng : Trả về 0
Loại Giá trị
Checkbox,
Radio Trạng thái của nút bấm (xem bảng trạng thái State trong file help)
Combo, List Giá trị được chọn
Input, Edit Văn bản đã nhập vào
Button Văn bản đang hiển thị
Date Ngày được chọn
Progress Phần trăm hiện hành
Slider Giá trị hiện hành
Tab Một số hoặc ID của control tabitem đã chọn , phụ thuộc vào giá
trị tham số Advanced
Menu,
MenuItem Trạng thái của menu/item. Xem State table
TreeView ID của control TreeViewItem được chọn
TreeViewItem Trạng thái của TreeViewItem
ListView Định danh (ID) của ListViewItem đã chọn. 0 có nghĩa là không
có mục nào được chọn
Dummy Giá trị được gán bởi GUICtrlSendToDummy
hoặc GUICtrlSetData
Chú ý
Trong chế độ advanced , giá trị trả về chứa dữ liệu bổ sung của control (xem bảng
bên dưới)
ghi chú : không phải tất cả các control đều có sẵn thông tin bổ sung !
Loại Giá trị bổ sung
Checkbox,
Radio Văn bản của control
Menu,
MenuItem Văn bản của control
TreeView Văn bản của TreeViewItem đang được chọn
TreeViewItem Văn bản của treeviewitem
ListViewItem
Trạng thái của ListViewItem nếu style mở rộng
$LVS_EX_CHECKBOXES sử dụng trong chế độ advanced .
Xem state table
Tab ID của control tabitem được chọn
Với checkbox , radio vài trạng thái có thể trả về $GUI_FOCUS và
$GUI_CHECKED,. Ví dụ :
BitAnd(GUICtrlRead($Item),$GUI_CHECKED) để kiểm tra xem control
có được đánh-dấu-chọn (check).
Đối với các mục trong Listview , vài trạng thái có thể được trả về như
$GUI_CHECKED và $GUI_UNCHECKED (chỉ đối với control listview
có style mở rộng LVS_EX_CHECKBOXES – trả về dạng Advanced) .
ví dụ : BitAnd(GUICtrlRead($Item),$GUI_CHECKED) để kiểm tra xem
item có được đánh dấu hay không.
Đối với các mục trong TreeView , vài trạng thái có thể được trả về
như $GUI_FOCUS, $GUI_EXPAND và $GUI_CHECKED,
$GUI_UNCHECKED (chỉ đối với treeview controls có style
TVS_CHECKBOXES). Ví dụ :
BitAnd(GUICtrlRead($Item),$GUI_CHECKED) để kiểm tra xem control
có được check
GUICtrlRegisterListViewSort
Đăng ký một hàm đã được định nghĩa dùng vào việc sắp xếp các mục trong
ListView. Đây là hàm nội bộ , sẽ được gọi tự động khi có yêu cầu sắp xếp.
GUICtrlRegisterListViewSort ( controlID, "function" )
Các tham số
controlID ID của ListView
function Tên của hàm cần gọi để thực hiện sắp xếp
Giá trị trả về
Th.
Công : 1
Hỏng : 0
Chú ý :
!!! Để hàm có thể làm việc , bạn phải định nghĩa nó với tối đa 4 tham số , ngược lại
thì hàm sẽ không được gọi !!!
Ví dụ :
Func MySortFunction($nListViewID, $LParam1, $LParam2, $nColumn)
...
EndFunc
hoặc
Func MySortFunction($nListViewID, $LParam1, $LParam2)
...
EndFunc
Khi hàm được gọi thì 4 tham số trên sẽ mang các giá trị sau :
Vị trí Tham số Ý nghĩa
1 controlID ID của ListView mà hàm cần sử dụng
2 lParam1 Giá trị của mục đầu tiên (theo mặc định là mục controlID).
3 lParam2 Giá trị của mục thứ hai (theo mặc định là mục controlID).
4 column Cột sẽ được nhấp để sắp xếp (cột đầu tiên là 0).
Những giá trị sau sẽ được trả về để thay đổi cách chạy của hàm
Giá trị trả về Ý nghĩa
-1 Mục thứ nhất đặt trước mục thứ hai
0 Không đổi
1 Mục thứ nhất đặt sau mục thứ hai.
Xem thêm ví dụ trong file help để rõ cách làm việc.
GUICtrlSetBkColor
Thay đổi màu nền hiện tại của control sang một màu khác
GUICtrlSetBkColor ( controlID, backgroundcolor )
Các tham số
controlID ID của control muốn đổi màu nền. ID này được trả về bởi hàm
GUICtrlCreate….
backgroundcolor Màu RGB muốn sử dụng
Giá trị trả về
Th.
Công : Trả về 1
Hỏng : Trả về 0
Chú ý
Chỉ có Button, Label, Checkbox, Group, Radio, Edit, Input, List,
Listview, ListviewItem, Treeview, TreeviewItem, Graphic, Progress và
Slider là có thể được thay đổi màu nền.
Control Progress sẽ không được vẽ với màu khác nếu sử dụng "Windows
XP style"
Các nút bấm (button) sẽ luôn được vẽ lại theo style của Windows Classic.
Mặc khác hàm này chỉ có tác dụng nếu các nút bấm này không được tạo với
style $BS_ICON.
Những phiên bản trước của AutoIt (v3.0.102) sử dụng định dạng màu
BGR , những phiên bản mới hơn sử dụng RGB theo mặc định. Tuy nhiên
bạn có thể thay đổi điều này bằng lựa chọn ColorMode.
Cờ đặc biệt $GUI_BKCOLOR_TRANSPARENT có thể được dùng với
control Label để có được nền trong suốt. Các control Picture thì luôn có một
màu trong suốt.
Cờ đặc biệt $GUI_BKCOLOR_LV_ALTERNATE có thể được dùng với
control ListView để làm màu nền xen kẽ cho từng dòng.
- Các dòng lẻ sẽ lấy màu từ GUICtrlSetBkColor của control
ListView
- Các dòng chẳn sẽ lấy màu từ GUICtrlSetBkColor của control
ListViewItem
GUICtrlSetColor
Thay đổi màu chữ cho control
GUICtrlSetColor ( controlID, textcolor)
Các tham số
controlID Định danh của control , được trả về bởi hàm GUICtrlCreate….
textcolor Màu RGB muốn dùng
Giá trị trả về
Th.
Công : Trả về 1
Hỏng : Trả về 0
Chú ý
Chỉ có Button, Label, Checkbox, Group, Radio, Edit, Input, List,
Listview, ListviewItem, Treeview, TreeviewItem, Graphic và Progress là có
thể được thay đổi màu chữ
Checkbox, Radio hoặc Progress sẽ không được vẽ lại nếu sử dụng
Windows XP style
Button luôn được vẽ lại trong "Windows Classic style".
Những phiên bản trước của AutoIt (v3.0.102) sử dụng định dạng màu
BGR , những phiên bản mới hơn sử dụng RGB theo mặc định. Tuy nhiên
bạn có thể thay đổi điều này bằng lựa chọn ColorMode.
GUICtrlSetData
Chỉnh sửa dữ liệu hiển thị trên control.
GUICtrlSetData ( controlID, data [, default] )
Các tham số
controlID Định danh của control , được trả về từ GUICtrlCreate…
data
Đối với Combo, List, ListView, ListViewItem : văn bản của mỗi
item được ngăn cách bởi Opt("GUIDataSeparatorChar",...)
Đối với Progress : giá trị % (phần trăm)
Slider : giá trị
Group, Label, Button, Checkbox, Radio, Combo, List, Input, Edit,
TabItem : văn bản muốn hiển thị
Date : ngày hoặc thời gian phụ thuộc vào style của control
TreeViewItem: văn bản cần hiển thị
Dummy : giá trị
default [tùy chọn]
với Combo, List : giá trị sẽ làm mặc định
Với Edit, Input : nếu bạn định nghĩa nó không phải là chuỗi rỗng ""
, chuỗi "data" được sẽ được chèn vào vị trí của con nháy (caret) ,
không viết đè chuỗi gốc.
Giá trị trả về
Th.
Công : Trả về 1
Hỏng : Trả về 0
Trả về -1 nếu data không hợp lệ
Chú ý
Đối với control Combo hoặc List :
- Nếu "data" trùng với một mục nhập đã tồn tại , nó sẽ được gán như mặc
định
- Nếu "data" bắt đầu với một ký tự ngăn cách (GUIDataSeparatorChar)
hoặc chuỗi rỗng , danh sách trước đó sẽ bị hủy.
Đối với control ListView, ListViewItem :
Để cập nhật văn bản cho một cột chỉ định , thì chỉ cần bỏ qua những cột
khác. Ví dụ , muốn cập nhật tiêu đề cho cột thứ ba , ta gán "||new_text"
Nếu "new_text" là rỗng , cột và mục con (subitem) trong cột sẽ bị xóa. Ví
dụ , "|" sẽ xóa cột và subitem thứ hai , "" sẽ xóa cột/subitem thứ nhất.
GUICtrlSetData
Chỉnh sửa dữ liệu hiển thị trên control.
GUICtrlSetData ( controlID, data [, default] )
Các tham số
controlID Định danh của control , được trả về từ GUICtrlCreate…
data
Đối với Combo, List, ListView, ListViewItem : văn bản của mỗi
item được ngăn cách bởi Opt("GUIDataSeparatorChar",...)
Đối với Progress : giá trị % (phần trăm)
Slider : giá trị
Group, Label, Button, Checkbox, Radio, Combo, List, Input, Edit,
TabItem : văn bản muốn hiển thị
Date : ngày hoặc thời gian phụ thuộc vào style của control
TreeViewItem: văn bản cần hiển thị
Dummy : giá trị
default
[tùy chọn]
với Combo, List : giá trị sẽ làm mặc định
Với Edit, Input : nếu bạn định nghĩa nó không phải là chuỗi rỗng ""
, chuỗi "data" được sẽ được chèn vào vị trí của con nháy (caret) ,
không viết đè chuỗi gốc.
Giá trị trả về
Th.
Công : Trả về 1
Hỏng : Trả về 0
Trả về -1 nếu data không hợp lệ
Chú ý
Đối với control Combo hoặc List :
- Nếu "data" trùng với một mục nhập đã tồn tại , nó sẽ được gán như mặc
định
- Nếu "data" bắt đầu với một ký tự ngăn cách (GUIDataSeparatorChar)
hoặc chuỗi rỗng , danh sách trước đó sẽ bị hủy.
Đối với control ListView, ListViewItem :
Để cập nhật văn bản cho một cột chỉ định , thì chỉ cần bỏ qua những cột
khác. Ví dụ , muốn cập nhật tiêu đề cho cột thứ ba , ta gán "||new_text"
Nếu "new_text" là rỗng , cột và mục con (subitem) trong cột sẽ bị xóa. Ví
dụ , "|" sẽ xóa cột và subitem thứ hai , "" sẽ xóa cột/subitem thứ nhất.
GUICtrlSetFont
Thiết lập font chữ cho control
GUICtrlSetFont (controlID, size [, weight [, attribute [, fontname]]] )
Các tham số
controlID ID của control , được trả về từ hàm GUICtrlCreate…
size Size của font (mặc định là 8.5)
weight [tùy chọn] trọng lượng của font (default 400 = bình thường)
attribute
[tùy chọn] muốn thiết lập định dạng cho ký tự , ta có in nghiêng : 2 ,
gạch chân : 4 , gạch ngang (strike) : 8 . Muốn kết hợp nhiều định dạng
ta cộng các giá trị với nhau. Ví dụ , muốn có chữ in nghiêng và gạch
chân , ta dùng 2+4.
fontname [tùy chọn] tên của font chữ sẽ dùng
Giá trị trả về
Th.
Công : Trả về 1
Hỏng : Trả về 0
Chú ý
Theo mặc định , control sẽ sử dụng font được thiết lập từ GUISetFont
Size có thể là một số thập phân , như 8.5
Vài control như Label , mặc định giá trị 8.5 có thể được thay bằng 9 theo
ghi nhận từ Windows Theme
Xem Appendix để có được một danh sách đầy đủ về các font của
windows
GUICtrlSetFont
Thiết lập font chữ cho control
GUICtrlSetFont (controlID, size [, weight [, attribute [, fontname]]] )
Các tham số
controlID ID của control , được trả về từ hàm GUICtrlCreate…
size Size của font (mặc định là 8.5)
weight [tùy chọn] trọng lượng của font (default 400 = bình thường)
attribute
[tùy chọn] muốn thiết lập định dạng cho ký tự , ta có in nghiêng : 2 ,
gạch chân : 4 , gạch ngang (strike) : 8 . Muốn kết hợp nhiều định dạng
ta cộng các giá trị với nhau. Ví dụ , muốn có chữ in nghiêng và gạch
chân , ta dùng 2+4.
fontname [tùy chọn] tên của font chữ sẽ dùng
Giá trị trả về
Th.
Công : Trả về 1
Hỏng : Trả về 0
Chú ý
Theo mặc định , control sẽ sử dụng font được thiết lập từ GUISetFont
Size có thể là một số thập phân , như 8.5
Vài control như Label , mặc định giá trị 8.5 có thể được thay bằng 9 theo
ghi nhận từ Windows Theme
Xem Appendix để có được một danh sách đầy đủ về các font của
windows
GUICtrlSetOnEvent
Định nghĩa một hàm bởi người sử dụng và hàm này sẽ được gọi mỗi khi control
được click vào
GUICtrlSetOnEvent ( controlID, "function" )
Các tham số
controlID ID của control , được trả về từ hàm GUICtrlCreate….
function Tên của hàm sẽ gọi khi cần control được click
Giá trị trả về
Th.
Công : Trả về 1
Hỏng : Trả về 0
Chú ý
Các hàm OnEvent (theo sự kiện) chỉ được gọi khi lựa chọn
GUIOnEventMode được thiết lập sang giá trị 1 – trong chế độ này thì chế độ
GUIGetMsg sẽ KHÔNG được sử dụng
Khi user-function được gọi , id của control có thể được truy lại bằng
macro @GUI_CTRLID.
Nếu bạn cần handle của cửa sổ và handle của control thì có thể truy lại
với macro @GUI_WINHANDLE hoặc @GUI_CTRLHANDLE.
Nếu hàm là một chuỗi rỗng "", thì không có gì xảy ra khi bạn click vào
control.
GUICtrlSetPos Thay đổi vị trí của control trên cửa sổ GUI
GUICtrlSetPos ( controlID, left, top [, width [, height]] ) Các tham số controlID ID của control , id này được trả về từ hàm GUICtrlCreate…. left Lề trái (tọa độ x) cần gán top Lề trên (tọa độ y) cần gán width [tùy chọn] độ rộng mới cho control height [tùy chọn] chiều cao mới cho control Giá trị trả về Th. Công : Trả về 1
Hỏng : Trả về 0 Chú ý None. GUICtrlSetState
Thay đổi trạng thái của control
GUICtrlSetState ( controlID, state )
Các tham số
controlID ID của control , được trả về từ hàm GUICtrlCreate….
state Xem bảng trạng thái bên dưới
Giá trị trả về
Th.
Công : Trả về 1
Hỏng : Trả về 0
Chú ý
Bảng trạng thái
State Miêu tả
Không thay đổi 0
$GUI_UNCHECKED Radio, Checkbox hoặc ListViewItem sẽ không
được đánh dấu (uncheck)
$GUI_CHECKED Radio, Checkbox or ListViewItem sẽ được đánh
dấu (check)
$GUI_INDETERMINATE Checkbox có ba trạng thái thuộc tính sẽ bị tô màu
xám
$GUI_AVISTART Avi sẽ bắt đầu play
$GUI_AVISTOP Avi sẽ dừng chơi
$GUI_AVICLOSE Avi sẽ dừng chơi và giải phóng tài nguyên.
$GUI_DROPACCEPTED Control sẽ chấp nhận thao tác kéo thả : từ file hoặc
từ control khác . Xem chú ý
$GUI_NODROPACCEPTED Control sẽ không chấp nhận kéo thả
$GUI_SHOW Control sẽ hiển thị. Trên control Tabitem sẽ chọn
tab đầu đầu tiên để hiển thị
$GUI_HIDE Control sẽ ẩn
$GUI_ENABLE Control sẽ được kích hoạt để tương tác được
$GUI_DISABLE Control bị vô hiệu không tương tác (sẽ bị tô màu
xám)
$GUI_FOCUS Control sẽ được đưa tiêu điểm được chọn hoặc
input
$GUI_NOFOCUS Listview sẽ mất tiêu điểm.
$GUI_DEFBUTTON Control sẽ được thiết lập như nút mặc định trên cửa
sổ. Xem phần chú ý đối với các TreeviewItem
$GUI_EXPAND TreeViewItem mở rộng các mục con
$GUI_ONTOP Control sẽ có thuộc tính ở-trên (ontop) đối với cửa
sổ (zOrdering).
Các trạng thái có thể được cộng lại với nhau để có đa thuộc tính , ví dụ
như $GUI_DISABLE + $GUI_HIDE sẽ làm cho control bị vô hiệu và ẩn đi.
Nếu control AVI bị làm ẩn với $GUI_HIDE , nó nên được đóng lại với
$GUI_AVICLOSE.
Trạng thái của menu ngữ cảnh "contextmenu" không thể bị thay đổi
Trạng thái của menu hoặc menuitem không thể được ẩn.
Trạng thái của một "listviewitem" có thể bị thay đổi nếu nó liên kết với
một Listview mà listview này được tạo với style mở rộng
$LVS_EX_CHECKBOXES. $GUI_FOCUS và $GUI_NOFOCUS có thể
được sử dụng trên listviewitem riêng biệt ,
style $LVS_SHOWSELALWAYS sẽ làm cho mục được chọn luôn hiển thị
thậm chí nó không có tiêu điểm.
! Thông tin quan trọng đối với $GUI_EXPAND : trạng thái này chỉ hữu
dụng cho các TreeViewItem. Nếu bạn muốn sử dụng hành động này , ít nhất
phải có một nhánh-con trong TreeView mà bạn đã tạo !
Nếu bạn muốn chọn mục khác trong một TreeView , bạn có thể dùng
$GUI_FOCUS – TreeView mẹ sẽ lấy tiêu điểm của cửa sổ và mục được chỉ
định sẽ bị đánh dấu như là được chọn
Nếu muốn thiết lập một mục trong TreeView làm mục mặc định , có
nghĩa là nó sẽ bị vẽ in đậm. Bạn có thể gọi $GUI_DEFBUTTON – để tắt nó
thì sử dụng một giá trị khác $GUI_DEFBUTTON, chẳng hạn như 0. Trạng
thái này sẽ không được trả về bởi GUICtrlGetState.
Với những control có tiếp nhận $GUI_EVENT_DROPPED, macro
@GUI_DRAGID sẽ trả về controlID từ nơi mà sự lôi-kéo bắt đầu (-1 nếu từ
một file, @GUI_DRAGFILE chứa tên tập tin đang được kéo đi) và
@GUI_DROPID trả về controlID của control được thả
Chỉ việc lôi-kéo một ListViewItem sẽ khởi động tiến trình kéo và thả
(drag&drop). Macro @GUI_DRAGID sẽ là ID của ListView
GUICtrlSetStyle
Thay đổi style cho control
GUICtrlSetStyle ( controlID, style [, exStyle] )
Các tham số
controlID ID của control , được trả về từ hàm GUICtrlCreate….
style Style cần thiết lập cho control . Xem GUI Control Styles Appendix.
exStyle [tùy chọn] style mở rộng muốn thiết lập. Xem Extended Style Table.
Giá trị trả về
Th.
Công : Trả về 1
Hỏng : Trả về 0
Chú ý
Vài style không thể được thay đổi một cách linh động. Xem tài liệu MSDN. Style
cho combo box $CBS_UPPERCASE là một ví dụ.
Xử lý sự kiện trên GUI
Khi bạn tạo ra một cửa sổ và các thành phần con trên đó thì tất nhiên chúng phải
được dùng cho một mục đích mà bạn đã vạch ra , nhập liệu, vẽ, chơi nhạc, tìm
kiếm file,…. Nhưng làm sao biết được rằng cái gì đang diễn ra trên GUI của bạn ,
phím nào vừa được nhấn ? chuột trái vừa nhấp ở đâu ? mục nào được chọn ?….
Tất cả những cái này chúng ta sẽ nắm bắt được bởi vì chúng do windows tạo ra và
AutoIt sẽ cung cấp cho chúng ta cách để biết được và xử lý được những sự kiện đã
và đang diễn ra trên cửa sổ.
AutoIt hỗ trợ cho ta hai phương pháp để xử lý sự kiện :
Sử dụng vòng lặp thông điệp
Sử dụng chế độ OnEvent
Vòng lặp thông điệp
Trong chế độ này , bạn sẽ sử dụng một vòng lặp khép kín để nhận liên tục các sự
kiện nào sẽ xảy ra trên GUI và ứng với mỗi sự kiện ta sẽ viết các lệnh tương ứng.
Để nhận được các sự kiện nào đã xảy ra trên GUI ta dùng hàm GUIGetMsg. Đặc
điểm của chế độ này là vòng lặp và hàm GUIGetMsg sẽ được gọi nhiều lần trong
một giây.
Trong trường hợp GUI là vấn đề bạn quan tâm trên cả ,và tất cả những gì bạn cần
là đợi sự kiện xảy ra thì chế độ vòng lặp thông điệp sẽ rất phù hợp để bạn làm
những việc này.
Chế độ OnEvent
OnEvent không sử dụng vòng lặp để tiếp nhận sự kiện , mà sử dụng một hàm đã
định nghĩa trước đó để phản ứng lại với một sự kiện và/hoặc một control tương
ứng. Khi hàm được gọi thì đoạn chương trình chính tạm dừng , hàm được gọi hoàn
tất thì đoạn chương trình chính sẽ chạy trở lại.
Khi GUI không phải là vấn đề quan tâm hàng đầu của bạn , và bạn còn có nhiều
tác vụ khác cần xử lý bên trong đoạn chương trình chính thì OnEvent là chế độ
thích hợp nhất.
VÒNG LẶP THÔNG ĐIỆP
Trong chế độ vòng lặp thông điệp , đoạn mã của sẽ trải qua phần lớn thời gian làm
việc trong một vòng lặp khép kín. Vòng lặp này chỉ đơn giản là sử dụng các giá trị
được trả về từ hàm GUIGetMsg( ) . Các giá trị đó cho biết sự kiện nào đang xảy ra
trên GUI (nút được nhấn , đóng gui, ... ).
Chế độ này chính là chế độ xử lý mặc định của AutoIt dành cho GUI. Trong chế độ
vòng lặp thông điệp bạn chỉ nhận được các sự kiện khi bạn chủ động gọi và nhận
từ GUIGetMsg , vì vậy bạn phải đảm bảo rằng hàm được gọi nhiều lần trong một
giây , ngược lại có thể làm cho GUI của bạn không có phản ứng.
Dạng cơ bản của vòng lặp thông điệp
Dạng chung của vòng lặp thông điệp có thể trình bày như sau :
While 1
$msg = GUIGetMsg()
...
...
WEnd
Thông thường một vòng lặp khép kín như trên sẽ làm cho tần suất CPU lên 100%
(xem trong task manager) – nhưng may mắn là hàm GUIGetMsg sẽ tự động tạo ra
khoảng dừng và giảm tải CPU trong khi chờ đợi sự kiện. Cho nên bạn không cần
phải đặt bất kỳ một lệnh sleep hay lệnh trì hoãn nào ở đây bởi vì việc này sẽ làm
cho GUI của bạn không phản ứng với các sự kiện.
Các sự kiện của GUI
Có ba loại thông điệp sự kiện mà GUIGetMsg sẽ trả về :
- No Event
- Control Event
- System Event
No Event
Khi không có sự kiện nào xảy ra , hàm GUIGetMsg sẽ trả về giá trị 0. Đây là sự
kiện phổ biến nhất trong các GUI thông thường
Control Event
Khi một control được click hoặc thay đổi thì một sự kiện sẽ được gửi đi , sự kiện
này xảy ra trên control nên được gọi là Control Event . Thường thì sự kiện này là
một số nguyên dương cho biết controlID (định danh của control trên GUI, được
tạo ra bởi hàm GUICtrlCreate... ) nào đang/vừa được tương tác
System Event
Các sự kiện hệ thống – như đóng một GUI – là một số âm . Các sự kiện khác nhau
được định nghĩa trong thư viện GUIConstantsEx.au3. Dưới đây là các sự kiện
phổ biến thường hay dùng :
$GUI_EVENT_CLOSE
$GUI_EVENT_MINIMIZE
$GUI_EVENT_RESTORE
$GUI_EVENT_MAXIMIZE
$GUI_EVENT_PRIMARYDOWN
$GUI_EVENT_PRIMARYUP
$GUI_EVENT_SECONDARYDOWN
$GUI_EVENT_SECONDARYUP
$GUI_EVENT_MOUSEMOVE
$GUI_EVENT_RESIZED
$GUI_EVENT_DROPPED
Ví dụ GUI
Ở đây chúng ta sẽ bắt đầu với chương trình hello world đơn giản như sau :
#include <GUIConstantsEx.au3>
GUICreate("Hello World", 200, 100) GUICtrlCreateLabel("Hello world! How are you?", 30, 10) GUICtrlCreateButton("OK", 70, 50, 60) GUISetState(@SW_SHOW) Sleep(2000)
Đoạn chương trình trên sẽ hiển thị một cửa sổ với một dòng văn bản "Hello world !
How are you ? " , một nút bấm và sẽ thoát sau 2 giây.
Và bây giờ chúng ta sẽ hoàn tất chương trình trên bằng việc sử dụng vòng lặp
thông điệp , lúc này bạn sẽ thấy mọi thứ linh động và hữu ích hơn.
#include <GUIConstantsEx.au3> GUICreate("Hello World", 200, 100) GUICtrlCreateLabel("Hello world! How are you?", 30, 10) $okbutton = GUICtrlCreateButton("OK", 70, 50, 60) GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() Select Case $msg = $okbutton MsgBox(0, "GUI Event", "You pressed OK!") Case $msg = $GUI_EVENT_CLOSE
MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...") ExitLoop EndSelect WEnd
Mọi thứ như bạn thấy đấy , thật dễ dàng. Bạn có thể tạo cửa sổ và các control rồi
thêm vào các mệnh lệnh cho chúng xử lý. Tuy nhiên đây chỉ là một ví dụ rất đơn
giản nhưng cũng rất cơ bản và bạn nên hiểu rõ. Khi thành thạo bạn có thể làm ra
những thứ khác hay hơn nhiều.
GUIGetMsg nâng cao và chế độ nhiều cửa sổ
Các định danh (ID) của control là duy nhất , thậm chí khi bạn có nhiều cửa sổ thì
đoạn mã của bạn vẫn sẽ làm việc tốt . Tuy nhiên , khi xử lý các sự kiện như
$GUI_EVENT_CLOSE hoặc $GUI_MOUSEMOVE bạn cần phải biết được GUI
nào đã phát ra thông điệp này để mà ra lệnh cho đúng. Giả sử rằng bạn vừa tạo ra
hai cửa sổ và chỉ muốn thoát chương trình khi cửa sổ thứ nhất gửi đi thông điệp
Close, nếu cửa sổ thứ hai cũng phát thông điệp Close thì chỉ ẩn GUI đi, chứ không
thoát ứng dụng. Muốn làm được điều này bạn phải gọi GUIGetMsg giống như sau
:
$msg = GUIGetMsg(1)
Khi gọi với tham số là 1 , giá trị trả về bây giờ không còn là một số nguyên nữa mà
thay vào đó là một mảng. Sự kiện nào vừa xảy ra sẽ được lưu trong phần tử đầu
tiên ($array[0]) và thông tin bổ sung như handle của cửa sổ đã phát ra sự kiện sẽ
được lưu trong phần tử thứ hai ($array[1]) . Ví dụ ở trên sẽ được sửa lại để làm
việc với hai cửa sổ và bạn sẽ hiểu cách viết mã xử lý chúng như thế nào .
#include <GUIConstantsEx.au3> $mainwindow = GUICreate("Hello World", 200, 100) GUICtrlCreateLabel("Hello world! How are you?", 30, 10) $okbutton = GUICtrlCreateButton("OK", 70, 50, 60) $dummywindow = GUICreate("Dummy window for testing ", 200, 100, -1, 100) GUISetState(@SW_SHOW, $dummywindow)
GUISwitch($mainwindow) GUISetState() While 1 $msg = GUIGetMsg(1) Select Case $msg[0] = $okbutton MsgBox(0, "GUI Event", "You pressed OK!") Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $mainwindow MsgBox(0, "GUI Event", "You clicked CLOSE on the main window! Exiting...") ExitLoop EndSelect WEnd
Đầu tiên , có một sự thay đổi quan trọng là việc xuất hiện của hàm GUISwitch –
khi một cửa-sổ-mới (new window) được tạo ra thì nó trở thành cửa sổ mặc định
cho các thao tác của GUI trong tương lai (bao gồm việc tạo control). Trong ví dụ
này , chúng ta muốn làm việc với của sổ chính "Hello world" , không phải cửa sổ
dummy , nên phải switch về cửa sổ chính. Một vài hàm về GUI cho phép bạn sử
dụng handle cửa sổ trong tham số để tự động chuyển sang GUI cần chứa control
mà không cần phải dùng đến lệnh GUISwitch. Và chúng ta đã có một trường hợp
trong đoạn code trên :
GUISetState(@SW_SHOW, $dummywindow)
Sự thay đổi tiếp theo là cách gọi hàm GUIGetMsg và kiểm tra các sự kiện – để ý
việc dùng $msg[0] và $msg[1] – bây giờ chúng ta sẽ thoát khỏi chương trình khi
event Close được gởi đi và nó phải xuất phát từ cửa sổ chính.
CHẾ ĐỘ OnEvent
Trong chế độ OnEvent , việc xử lý các sự kiện xảy ra trên GUI không phải bằng
cách dò xét liên tục bằng một vòng lặp khép kín nữa , mà thay vào đó là việc tạm
dừng đoạn script và gọi một hàm đã được định nghĩa trước đó dành cho một sự
kiện với một control tương ứng. Ví dụ như người dùng nhấp vào nút Button1 thì
đoạn chương trình chính của bạn nhất thời sẽ ngưng lại để gọi hàm đã tạo trước đó
dành cho Button1. Sau khi hàm đã hoàn tất công việc của nó thì đoạn chương trình
chính của bạn sẽ chạy tiếp. Chế độ này tương tự như trong phương thức xử lý form
của Visual Basic.
Khi một GUI đang thực thi, đoạn chương trình chính của bạn có thể làm bất cứ
công việc gì , nhưng để tạo nên sự đơn giản cho các ví dụ , chúng ta sẽ tạo nên một
vòng lặp While với khoảng dừng bên trong.
Theo mặc định , GUI luôn được xử lý theo chế độ vòng lặp thông điệp. Vì vậy để
chuyển sang chế độ OnEvent ở đầu đoạn mã chúng ta phải sử dung
Opt("GUIOnEventMode", 1).
Dạng OnEvent cơ bản
Dạng tổng quát có thể trình bày như sau :
While 1 Sleep(1000) ; khoảng dừng của vòng lặp WEnd Func Event1() ; Code to handle event goes here EndFunc Func Event2() ; Code to handle event goes here EndFunc
GUI Events
Trong chế độ OnEvent , GUI của bạn sẽ phát ra các sự kiện sau :
- Control Event
- System Event
Cả hai loại sự kiện trên sẽ gọi một hàm do người viết chương trình thiết lập , hàm này có thể được chỉ định cho GUI (sử dụng hàm GUISetOnEvent) hoặc chỉ định xử lý cho control (sử dụng hàm GUICtrlSetOnEvent) . Nếu một sự kiện nào đó xảy ra mà AutoIt không tìm thấy hàm làm việc tương ứng thì nó sẽ bị bỏ qua. Bên
trong hàm được gọi ta có thể sử dụng các macro khác nhau do AutoIt cung cấp để
hỗ trợ việc xử lý các sự kiện
Macro Chi tiết
@GUI_CTRLID ID của control đang gửi thông điệp hoặc ID của sự kiện
hệ thống
@GUI_WINHANDLE Handle của GUI đã gửi đi thông điệp
@GUI_CTRLHANDLE Handle của control đã gửi đi thông điệp (nếu có thể dùng
được)
Chú ý : Bạn có thể sử dụng một hàm cho nhiều sự kiện , điều bạn cần làm trong
trường hợp này là tạo ra các hành động khác nhau dựa trên macro @GUI_CTRLID
. Ví dụ , bạn có thể đăng ký tất cả sự kiện hệ thống vào trong một hàm rồi tùy
trường hợp mà viết lệnh.
Control Event
Khi bạn nhấp hoặc thay đổi một control thì một sự kiện được gửi đi . Sự kiện đó
được gửi vào trong một hàm đã định nghĩa và đã được thiết lập trong
GUICtrlSetOnEvent. Bên trong hàm này thì macro @GUI_CTRLID mang giá trị
là controlID được trả về khi tạo bằng hàm GUICtrlCreate....
System Event
Các sự kiện hệ thống – ví dụ như close một gui – thì cũng được gởi đi theo cách
tương tự như Control Event . Tuy nhiên sự kiện lại được gửi vào hàm được thiết
lập trong GUISetOnEvent. Sự kiện hệ thống có thể mang những giá trị sau :
$GUI_EVENT_CLOSE
$GUI_EVENT_MINIMIZE
$GUI_EVENT_RESTORE
$GUI_EVENT_MAXIMIZE
$GUI_EVENT_PRIMARYDOWN
$GUI_EVENT_PRIMARYUP
$GUI_EVENT_SECONDARYDOWN
$GUI_EVENT_SECONDARYUP
$GUI_EVENT_MOUSEMOVE
$GUI_EVENT_RESIZED
$GUI_EVENT_DROPPED
Ví dụ
Chúng ta sẽ bắt đầu với chương trình hello world đơn giản sau :
#include <GUIConstantsEx.au3> GUICreate("Hello World", 200, 100) GUICtrlCreateLabel("Hello world! How are you?", 30, 10) GUICtrlCreateButton("OK", 70, 50, 60) GUISetState(@SW_SHOW) Sleep(2000)
Sử dụng chế độ OnEvent , chúng ta sẽ viết lại để hoàn tất đoạn mã trên :
#include <GUIConstantsEx.au3> Opt("GUIOnEventMode", 1) ; Change to OnEvent mode $mainwindow = GUICreate("Hello World", 200, 100) GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") GUICtrlCreateLabel("Hello world! How are you?", 30, 10) $okbutton = GUICtrlCreateButton("OK", 70, 50, 60) GUICtrlSetOnEvent($okbutton, "OKButton") GUISetState(@SW_SHOW) While 1 Sleep(1000) ; Idle around WEnd Func OKButton() ;Note: at this point @GUI_CTRLID would equal $okbutton, ;and @GUI_WINHANDLE would equal $mainwindow MsgBox(0, "GUI Event", "You pressed OK!")
EndFunc Func CLOSEClicked() ;Note: at this point @GUI_CTRLID would equal $GUI_EVENT_CLOSE, ;and @GUI_WINHANDLE would equal $mainwindow MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...") Exit EndFunc
Như bạn thấy , nó rất đơn giản. Mặc dù chỉ là ví dụ cơ bản nhưng sẽ là cái nền để
bạn tạo ra những cái hay hơn đấy.
Thao tác nâng cao và chế độ nhiều cứa sổ
Chúng ta cũng đã biết rằng các control ID là duy nhất , cho dù bạn có nhiều cửa sổ
và nhiều control thì bạn vẫn có thể xử lý chúng theo định danh mà bạn đã chọn.
Tuy nhiên vấn đề là xử lý như thế nào ?
Ở đây sẽ trình bày một ví dụ tương tự như ví dụ trên , nhưng có thêm một cửa sổ
dummy nữa :
#include <GUIConstantsEx.au3> Opt("GUIOnEventMode", 1) ; Change to OnEvent mode $mainwindow = GUICreate("Hello World", 200, 100) GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") GUICtrlCreateLabel("Hello world! How are you?", 30, 10) $okbutton = GUICtrlCreateButton("OK", 70, 50, 60) GUICtrlSetOnEvent($okbutton, "OKButton") $dummywindow = GUICreate("Dummy window for testing ", 200, 100, 500, 200) GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") GUISetState(@SW_SHOW, $dummywindow) GUISwitch($mainwindow) GUISetState(@SW_SHOW) While 1 Sleep(1000) ; Idle around WEnd
Func OKButton() ;Note: at this point @GUI_CTRLID would equal $okbutton MsgBox(0, "GUI Event", "You pressed OK!") EndFunc Func CLOSEClicked() ;Note: at this point @GUI_CTRLID would equal $GUI_EVENT_CLOSE, ;@GUI_WINHANDLE will be either $mainwindow or $dummywindow If @GUI_WINHANDLE = $mainwindow Then MsgBox(0, "GUI Event", "You clicked CLOSE in the main window! Exiting...") Exit EndIf EndFunc
Đầu tiên , có một sự thay đổi quan trọng là việc xuất hiện của hàm GUISwitch –
khi một cửa-sổ-mới (new window) được tạo ra thì nó trở thành cửa sổ mặc định
cho các thao tác của GUI trong tương lai (bao gồm việc tạo control). Trong ví dụ
này , chúng ta muốn làm việc với của sổ chính "Hello world" , không phải cửa sổ
dummy , nên phải switch về cửa sổ chính. Một vài hàm về GUI cho phép bạn sử
dụng handle cửa sổ trong tham số để tự động chuyển sang GUI cần chứa control
mà không cần phải dùng đến lệnh GUISwitch. Và chúng ta đã có một trường hợp
trong đoạn code trên :
GUISetState(@SW_SHOW, $dummywindow)
Cũng xin nhắc là chúng ta sử dụng hàm OnEvent để điều khiển nút "close" cho cả
hai cửa sổ và sau đó sử dụng macro @GUI_WINHANDLE để xét xem cửa sổ nào
vừa gởi đi sự kiện. Chúng ta chỉ đóng GUI khi nút close được nhấn và thông điệp
đó xuất phát từ cửa sổ chính (không phải dummy) . Nhưng bạn cũng có thể sử gán
cho mỗi cửa sổ một hàm khác nhau để xử lý nếu bạn bạn thích.
_Main() Func _Main() HotKeySet("{ESC}", "_Quit") ; press ESC to exit While 1
$pos = MouseGetPos() ToolTip("Mouse : " & $pos[0] & ", " &$pos[1] ) Sleep(10) WEnd EndFunc ;==>_Main Func _Quit() Exit EndFunc ;==>_Quit #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <Timers.au3> Global $string , $def_str, $temp_str , $i , $len , $run , $nDelay , $misc , $timer2type ; run = 1 : playing run=2 : paused run=0 : stoped ; i : dem so ky tu can lay $str1 = "when i saw you at the party , when you asked me girlfriend , i didn't know why i can't say clearly . You 're as pretty as angel , your eyes seemed to burn my heart. My strange lover..." & @CRLF $str2 = "When i smelt a perfume from your hair , when i kissed your body , the waves of love were flowing in my and your soul . You said , don't leave me baby ..." & @CRLF $str3 = "When i heard words you told , when i believed your heart , and now i knew i was a fool . I didn't cry but my soul was dying , my heart broke when you said ''Good bye''" & @CRLF $str4 = "When i looked the waves of ocean , when i missed my memories , i felt all thing were only a deam . A full house which would never exist in this world. The sun was setting..." & @CRLF $str5 = "When i told my children stories , when i took my wife's hands , i knew the happy life was right here . '' Every thing is never perfect , i have to accept . '' " & @CRLF $str6 = "When i see the winter of my life , when i write these lines , all left ever and ever, all will never return . Outside the window , sights are a white by snow , the wind 's still blowing , it's still cold, very cold. " $str7 = "Maybe this's final winter i can look , think and count leaves ..." $def_str = $str1 & $str2 & $str3 & $str4 & $str5 & $str6 & $str7 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $string = $def_str $len = StringLen($string)
$i = 0 $run = 0 $nDelay = 50 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $gui = GUICreate("A Text Typer", 700, 500) $eMainText = GUICtrlCreateEdit("", 5, 5, 690, 420, $ES_AUTOVSCROLL + $WS_VSCROLL+ $ES_READONLY) GUICtrlSetFont(-1, 10, 400, default, "Tahoma") $text_ShowSource = GUICtrlCreateLabel("Source : <default text>", 8, 435, 690, 20) $text_delay = GUICtrlCreateLabel("Delay (miliSecond) :" , 10, 470, 100, 30) $eDelay = GUICtrlCreateInput($nDelay, 115, 467, 40, 20, $ES_NUMBER) $btnPlayPause = GUICtrlCreateButton("Start", 170, 462, 80, 30) $btnStop = GUICtrlCreateButton("Stop", 250, 462, 80, 30) $btnOpenText = GUICtrlCreateButton("Open text", 350, 462, 80, 30) $btnLoadDefault = GUICtrlCreateButton("Load default text", 430, 462, 110, 30) $text_status = GUICtrlCreateLabel("Status : Stoped...", 580, 470, 150, 30) GUISetState() ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while 1 $msg = GUIGetMsg() Switch $msg case $GUI_EVENT_CLOSE ExitLoop Case $btnPlayPause If $run=0 Or $run=2 Then; if state is "stoped" or "paused", then $run = 1 ; set state to "start" update_status(1) ; set new text for buttons and status $nDelay = Abs(Int(GUICtrlRead($eDelay))) ; read delay value for speed type $timer2type = _Timer_SetTimer($gui, $nDelay, "TypeText") ; create a new timer (note : this will use current valure of $i and $run) GUICtrlSetState($eDelay, $GUI_DISABLE) ; disable input of delay ElseIf $run=1 Then ; if state is "typing" , then
$run = 2 ; change state to "stoped" update_status(2) ; set new texts for buttons GUICtrlSetState($eDelay, $GUI_ENABLE) ; enable delay s input _Timer_KillTimer($gui, $timer2type) ; kill timer to stop typing text (note : current value will be used on next time when i create new timer) EndIf Case $btnStop _Timer_KillTimer($gui, $timer2type) $run = 0 $i = 0 update_status(0) GUICtrlSetState($eDelay, $GUI_ENABLE) Case $btnOpenText _Timer_KillTimer($gui, $timer2type) ; kill timer to stop typing text If BrowseText() Then $i = 0 ; check if a new file is opened successfully , if yes , then reset position which is reading in text $nDelay = Abs(Int(GUICtrlRead($eDelay))) ; update delay value $timer2type = _Timer_SetTimer($gui, $nDelay, "TypeText") ; create a new timer for typing text $run = 1 ; set state this time is RUNNING update_status(1) ; update text on button and status Case $btnLoadDefault _Timer_KillTimer($gui, $timer2type) $i = 0 $run = 0 update_status(0) $string = $Def_str GUICtrlSetData($text_ShowSource, "Source : <Default text>") $nDelay = Abs(Int(GUICtrlRead($eDelay))) $timer2type = _Timer_SetTimer($gui, $nDelay, "TypeText")
$run = 1 update_status(1) EndSwitch WEnd ;============================================================== ; this func will set new texts for buttons and status Func update_status($nState) If $nState=0 Then ; neu trang thai la stop GUICtrlSetData($btnPlayPause, "Start") GUICtrlSetData($text_status, "Status : Stoped...") ElseIf $nState=1 Then ; neu trang thai la play GUICtrlSetData($btnPlayPause, "Pause") GUICtrlSetData($text_status, "Status : Typing...") Else ; neu trang thai la pause GUICtrlSetData($btnPlayPause, "Start") GUICtrlSetData($text_status, "Status : Paused...") EndIf EndFunc ; this func will show open dialog for user who choose a text file and if success then continue to type with new texts Func BrowseText() Local $filePath, $file $filePath = FileOpenDialog("Open a text file", @MyDocumentsDir, "Text (*.txt) | All file (*.*)", 1+2) If @error <> 1 Then $file = FileOpen($filePath, 0) If $file =-1 Then MsgBox(16, "Error", " I'm sorry. A error occured when I read file. ") Return 0 Else $string = FileRead($file) FileClose($file) GUICtrlSetData($text_showSource , "Source : " & $filepath) EndIf Else return 0 EndIf Return 1
EndFunc ; it's important , this will type text and show it on GUI Func TypeText($hWnd, $Msg, $iIDTimer, $dwTime) $i += 1 If ($i>StringLen($string)) Then $i=0 $run = 0 update_status(0) GUICtrlSetData($text_status, "Status : Completed") _Timer_KillTimer($gui, $timer2type) Return EndIf $temp_str = StringLeft($string, $i) $condition = StringRight($temp_str, 1) <> @CR And StringRight($temp_str, 1)<>@LF If $condition Then $temp_str &= "_" GUICtrlSetData($eMainText, $temp_str) Else Sleep(400) EndIf EndFunc #include <GUIConstants.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <Timers.au3> Global $str , $count, $temp , $Timer_Types $str = " Hi there , this is a sample of auto-typed text" $count = 0 Opt("GUICloseOnESC",0) ;============== MAKE GUI =========================================== $gui = GUICreate("A type text (basic)", 500, 336, 193, 125) $eMainEdit = GUICtrlCreateEdit("", 8, 11, 481, 273, BitAND($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN,$WS_VSCROLL)) $txt_speed = GUICtrlCreateLabel("Speed (miliSecond) : ", 20, 300, 104, 17) $eSpeed = GUICtrlCreateInput("50", 135, 300, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_NUMBER)) $btnStartStop = GUICtrlCreateButton("Start", 200, 295, 108, 30, 0)
$btnOpen = GUICtrlCreateButton("Open text", 365, 295, 112, 30, 0) GUISetState(@SW_SHOW) ;============================================================================================== While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $btnStartStop If GUICtrlRead($btnStartStop)="Start" Then GUICtrlSetData($btnStartStop, "Stop") GUICtrlSetState($eSpeed, $GUI_DISABLE) $nDelay = Abs(Int(GUICtrlRead($eSpeed))) $Timer_Type = _Timer_SetTimer($gui , $nDelay, "_Type_Text") Else _Timer_KillAllTimers($gui) GUICtrlSetData($btnStartStop, "Start") GUICtrlSetState($eSpeed, $GUI_ENABLE) $count = 0 EndIf Case $btnOpen _Timer_KillAllTimers($gui) If BrowseFile() Then $count = 0 GUICtrlSetState($eSpeed, $GUI_DISABLE) $nDelay = Abs(Int(GUICtrlRead($eSpeed))) $Timer_Type = _Timer_SetTimer($gui, $nDelay, "_Type_Text") GUICtrlSetData($btnStartStop, "Stop") EndSwitch WEnd ;==================================================================== Func BrowseFile() Local $path, $file, $IsError=0 $path = FileOpenDialog("Open text file", @MyDocumentsDir, "Text (*.txt)|All file (*.*)" , 1+2) If @error=1 Then MsgBox(16, "Error", "Sorry. I can't open file. Previous texts will be continued.")
$IsError = 1 Else $file = FileOpen($path, 0) If $file=-1 Then MsgBox(16, "Error", "Sorry. I can't read this file") $IsError = 1 EndIf $str = FileRead($file) FileClose($file) EndIf If $IsError=0 Then Return 1 ; open file successfully Else Return 0 ; fail EndIf EndFunc ; important function , this will type text automaticly Func _Type_Text($hwnd, $msg, $wParam, $lParam) $count += 1 If $count>StringLen($str) Then $count = 0 _Timer_KillAllTimers($gui) GUICtrlSetData($btnStartStop, "Start") GUICtrlSetState($eSpeed, $GUI_ENABLE) Return EndIf $temp = StringLeft($str, $count) $temp &= "|" GUICtrlSetData($eMainEdit, $temp) EndFunc