Saturday, January 18, 2014

Bài 15: Kiểu dữ liệu trong Autoit

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ự.

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.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-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 0xtheo 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 ' '. 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.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.

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"

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.

Thursday, January 9, 2014

Bài 11: Thiết kế giao diện

    Nếu như các script viết bằng AutoIt có thể hoạt động một cách hoàn toàn âm thầm, nghĩa là click và chạy mà người dùng ko biết j` (mở ngoặc: giống "virus" YM nhờ ), thì đôi khi bạn lại muốn tạo một GUI cho script cho giống một soft hoàn chỉnh

Khả năng tạo GUI trong AutoIt góp phần làm cho nó trở nên phổ biến và tiện dụng hơn


Trong GUI, bạn có thể tạo label, button, checkbox, radiobox, list, progress bar, context menu... nói chung là tất tần tật những j` mà một GUI có thể có.

Để tạo một ứng dụng có GUI, bạn có thể tạo bằng cách tự viết code lấy - Cái này chả khác j` với việc làm đồ họa bằng Pascal. Phải căn ke từng mili trên màn hình, sửa đổi vị trí cho hợp nhãn,... túm lại là rất phiền


Thử ví dụ một GUI cho dễ hình dung nhé:

Code:
; GUI
GuiCreate("Sample GUI", 400, 400)
GuiSetIcon(@SystemDir & "\mspaint.exe", 0)


; MENU
GuiCtrlCreateMenu("Menu&One")
GuiCtrlCreateMenu("Menu&Two")
GuiCtrlCreateMenu("MenuTh&ree")
GuiCtrlCreateMenu("Menu&Four")

; CONTEXT MENU
$contextMenu = GuiCtrlCreateContextMenu()
GuiCtrlCreateMenuItem("Context Menu", $contextMenu)
GuiCtrlCreateMenuItem("", $contextMenu) ;separator
GuiCtrlCreateMenuItem("&Properties", $contextMenu)

; PIC
GuiCtrlCreatePic("logo4.gif",0,0, 169,68)
GuiCtrlCreateLabel("Sample pic", 75, 1, 53, 15)
GuiCtrlSetColor(-1,0xffffff)


; AVI
GuiCtrlCreateAvi("sampleAVI.avi",0, 180, 10, 32, 32, $ACS_AUTOPLAY)
GuiCtrlCreateLabel("Sample avi", 170, 50)

; GUI MESSAGE LOOP
GuiSetState()

Một cách khác, thuận tiện hơn, đó là sử dụng một soft dạng GUI Builder. Có nhiều GUI Builder dành cho AutoIt, nhưng theo quan điểm cá nhân, có lẽ Koda là khá nhất. Công cụ này có thể tại về từ trang web:
http://www.autoitscript.com/fileman/...ormdesign.html

Phiên bản mới nhất là 1.6, cập nhật ngày 19/9.

Koda cho phép bạn dễ dàng tạo GUI chỉ bằng cách drag-and-drop vào form, sau đó sẽ tự động sinh code AutoIt để bạn đưa vào script của mình. Rất rất tiện lợi nếu so sánh với việc code từ đầu bằng tay.

Gắn GUI với code


Có GUI rồi, là đến lúc bạn muốn gắn nó với các mã AutoIt thực thi các lệnh đã viết từ trước.

AutoIt hỗ trợ 2 chế độ tương tác với GUI: OnEvent và MessageLoop. Có thể đảo qua lại 2 chế độ bằng cách dùng lệnh:
Code:
Opt("GUIOnEventMode", 1)

Ở chế độ OnEvent, ta sẽ gắn từng "sự kiện" với một hàm tương ứng. Ví dụ, ta gắn "sự kiện" người dùng click nút Close với hàm Close():
Code:
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSE")
Func CLOSE()
  MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...")
  Exit
EndFunc

Ở chế độ MessageLoop, ta có một cách tiếp cận hoàn toàn khác. AutoIt sẽ tạo một vòng lặp vô hạn, liên tục kiểm tra xem có sự kiện nào xảy ra với GUI ko - thông qua một hàm mang tên GUIGetMsg.

Toàn bộ việc gắn code với GUI được thực hiện qua một vòng lặp While:
Code:
While 1
  $msg = GUIGetMsg()

  Select
    Case $msg = $GUI_EVENT_CLOSE
      MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...")
      ExitLoop
  EndSelect
WEnd



Identical(UDS

Bài 10: 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


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
 Tạo một cửa sổ
 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ể)
 Hiển thị hoặc ẩn cửa sổ
 Lấy các thông tin về các sự kiện diễn ra trên gui
 Đọc dữ liệu từ control
 Gán/Thay đổi dữ liệu trên control
 Thay đổi các lựa chọn trên control (ví dụ như màu sắc , style,…)


Bài 13: Toán tử trong AutoIT

Tương tự như các ngôn ngữ lập trình khác, AutoIt cũng hỗ trợ các toán tử như gán, tính số học,  so sánh, và logic,...

Dưới đây là danh sách các toán tử trong Autoit kèm theo mô tả
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 $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 theothứ 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
dụ  :  2 + 4 * 10sẽ 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)/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)



Followers

Popular Posts