1 Giao diện người dùng - Tương Tác với GUI Wed Aug 24, 2011 5:16 pm
Trunks-Kun
Administrator
Thật chất việc tạo GUI ở bài trước đã giải quyết vụ Nhập rồi, cho nên bài này ta chỉ nói đến vấn đề Xuất dữ liệu. Nhưng Xuất cái gì ra phần lớn phụ thuộc vào người đang sử dụng chứ không phải người tạo ra cái GUI đó. Với cương vị là người tạo ra GUI, thứ duy nhất tụi mình có thể làm là kiu chương trình đợi và hỏi xem Người Dùng muốn làm gì để mà phục vụ. Nếu hiểu đúng bạn sẽ thấy, tụi mình đang có 2 vấn đề cần giải quyết trước khi bàn đến chuyện phục vụ Người Dùng:
1. Đợi và Hỏi
Thứ nhất là Đợi người dùng ra lệnh, hay nói đúng hơn là đợi họ tương tác, đợi họ click chuột vào. Điều đó có nghĩa rằng phải làm cho GUI luôn hiện ra và ở bài trước tụi mình đã dùng hàm MsgBox(), nhưng hàm này lại dừng toàn bộ chương trình, không cho thực hiện bất kỳ câu lệnh nào trong lúc đợi. Thay vào đó ta có thể dùng 1 vòng lặp While hoặc Do vì chúng vẫn giữ được GUI mà lại cho phép ta chèn nhiều lệnh vào đó. Trong các ví dụ bên dưới tớ sẽ làm mẫu với While và hầu hết các Coder AutoIT đều dùng vòng lặp này, còn tại sao hay dùng While thì chỉ đơn giản vì trong File Help hay dùng nó :>
%%- Tiếp theo là Hỏi xem người dùng muốn làm gì và dĩ nhiên là hỏi bằng lệnh chứ kg phải là ta đứng kế bên người đang dùng sản phẩm của ta mà hỏi :> Câu lệnh hỏi mà ta đang nói đến chính là GUIGetMsg(), nếu bỏ lệnh này trong vòng lặp While thì mỗi khi Người Dùng làm 1 cái gì đó với Gui nó sẽ trả về 1 giá trị tương ứng, chỉ cần 1 phép so sánh đơn giản là tụi mình có thể biết được người dùng đang làm gì trên GUI. Có 1 tin buồn rằng số lượng các giá trị mà GUIGetMsg() có thể trả về không phải là ít, rất khó nhớ và phân biệt được, nhưng lại có 1 tin vui khác là bạn không cần phải nhớ :p vì AutoIT đã đưa chúng vào các biến có Tên rất dễ phân biệt, bên dưới là ví dụ minh họa cho việc Đợi và Hỏi xem khi nào người dùng bấm Nút X (Tắt GUI).
- Nếu hiểu rõ về câu Lệnh If, chắc hẳn bạn sẽ thắc mắc rằng tại sao dòng lệnh 60 lại không bị lỗi bởi biến $GUI_EVENT_CLOSE chưa hề được khai báo. Thật ra biến này đã được khai báo trong file GUIConstantsEx.au3 và file này đã được Include vào chương trình ở dòng đầu tiên. Để làm việc với GUI bạn sẽ cần phải Include khoãn 5 đến 6 file như vậy, nhưng không phải là Include 1 lần tất cả, vì mỗi file chỉ khai báo sẵn những biến cho 1 loại Control nào đó. Bài viết được đăng trên trang web autoit.72ls.net, mong đọc giả vào xem để ủng hộ Anh Em trong Forum viết tiếp.
- Một số bạn hỏi tớ làm sao để có được danh sách của tất cả tên biến và tên file au3 kể trên, câu trả lời là Trong file Help của AutoIT. Nhưng có một lời khuyên khác là không cần phải tìm đến danh sách này khi mới học AutoIT, bởi có tìm thấy tụi mình cũng chã biết làm gì với chúng, hơn nữa tuy số lượng của chúng nhiều nhưng chỉ dùng khoãn 2 đến 3 Biến là đủ có được 1 GUI tốt.
1. Đợi và Hỏi
Thứ nhất là Đợi người dùng ra lệnh, hay nói đúng hơn là đợi họ tương tác, đợi họ click chuột vào. Điều đó có nghĩa rằng phải làm cho GUI luôn hiện ra và ở bài trước tụi mình đã dùng hàm MsgBox(), nhưng hàm này lại dừng toàn bộ chương trình, không cho thực hiện bất kỳ câu lệnh nào trong lúc đợi. Thay vào đó ta có thể dùng 1 vòng lặp While hoặc Do vì chúng vẫn giữ được GUI mà lại cho phép ta chèn nhiều lệnh vào đó. Trong các ví dụ bên dưới tớ sẽ làm mẫu với While và hầu hết các Coder AutoIT đều dùng vòng lặp này, còn tại sao hay dùng While thì chỉ đơn giản vì trong File Help hay dùng nó :>
%%- Tiếp theo là Hỏi xem người dùng muốn làm gì và dĩ nhiên là hỏi bằng lệnh chứ kg phải là ta đứng kế bên người đang dùng sản phẩm của ta mà hỏi :> Câu lệnh hỏi mà ta đang nói đến chính là GUIGetMsg(), nếu bỏ lệnh này trong vòng lặp While thì mỗi khi Người Dùng làm 1 cái gì đó với Gui nó sẽ trả về 1 giá trị tương ứng, chỉ cần 1 phép so sánh đơn giản là tụi mình có thể biết được người dùng đang làm gì trên GUI. Có 1 tin buồn rằng số lượng các giá trị mà GUIGetMsg() có thể trả về không phải là ít, rất khó nhớ và phân biệt được, nhưng lại có 1 tin vui khác là bạn không cần phải nhớ :p vì AutoIT đã đưa chúng vào các biến có Tên rất dễ phân biệt, bên dưới là ví dụ minh họa cho việc Đợi và Hỏi xem khi nào người dùng bấm Nút X (Tắt GUI).
- Code:
#include <GUIConstantsEx.au3>
GUICreate("72ls.NET",400,250,100,200) ;Tạo Window
GUICtrlCreateLabel("Họ Tên:", 2, 7, 43, 16) ;Tạo Label
GUICtrlSetBkColor(-1,0xFF0000) ;Chọn màu nên cho Label
GUICtrlCreateInput("Nội dung", 50, 7, 72, 20) ;Tạo Input
GUICtrlCreateEdit("", 2, 34, 180, 70) ;Tạo Edit
GUICtrlCreateCheckbox("Đẹp Trai", 2, 120) ;Tạo checkbox để chọn
GUICtrlCreateCheckbox("Học Giỏi", 2, 140) ;Tạo checkbox để chọn
GUICtrlCreateCheckbox("Lắm Tiền", 2, 160) ;Tạo checkbox để chọn
GUICtrlCreateRadio("Keo Kiệt ", 92, 120) ;Tạo Radio để chọn
GUICtrlCreateRadio("Rộng Lượng ", 92, 140) ;Tạo Radio để chọn
GUICtrlCreateGroup("",-99, -99, 1, 1) ;Tạo Group
GUICtrlCreateRadio("Đã Có Bồ ", 92, 170) ;Tạo checkbox để chọn
GUICtrlCreateRadio("Thất Tình ", 92, 190) ;Tạo checkbox để chọn
GUICtrlCreateGroup("", -99, -99, 1, 1) ;Đóng Group
GUICtrlCreateTab(200, 7, 150,190) ;Tạo Tab nền
GUICtrlCreateTabItem("List Control") ;Tạo vùng Tab của List Control
GUICtrlCreateList("Nhà Lầu",210, 37, 100,90) ;Tạo List Control
GUICtrlSetData(-1, "Xe Hơi|Hồ Bơi|Máy Bay") ;Thêm dữ liệu vào ComboBox
GUICtrlCreateTabItem("Combo Box") ;Tạo vùng Tab của Combo Box
GUICtrlCreateCombo("Nhà Lầu",210, 37, 100,90) ;Tạo ComboBox
GUICtrlSetData(-1, "Xe Hơi|Hồ Bơi|Máy Bay") ;Thêm dữ liệu vào ComboBox
GUICtrlCreateTabItem("") ;Đóng Tab Nền
GUICtrlCreateButton("Nhập",20,190,52) ;Tạo nút có chữ Nhập
$File = GUICtrlCreateMenu("File") ;Tạo Menu File
GUICtrlCreateMenuItem("Open",$File)
GUICtrlCreateMenuItem("Save",$File)
GUICtrlCreateMenuItem("",$File)
GUICtrlCreateMenuItem("Exit",$File)
GUICtrlCreateMenu("Edit") ;Tạo Menu Edit
GUISetState() ;Hàm để hiện GUI ra
;Cho điều kiện của While luôn True.
;Vòng lặp không bao giờ dừng => GUI luôn hiện
While True
;Hỏi xem người dùng muốn làm gì
;Câu trả lời sẽ được gán vào biến $Msg
$Msg = GUIGetMsg()
;$GUI_EVENT_CLOSE tương ứng với việc người dùng bấm nút X tắt GUI
;Nếu $Msg là $GUI_EVENT_CLOSE thì thoát vòng lặp => Kết thức chương trình
If $Msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
- Nếu hiểu rõ về câu Lệnh If, chắc hẳn bạn sẽ thắc mắc rằng tại sao dòng lệnh 60 lại không bị lỗi bởi biến $GUI_EVENT_CLOSE chưa hề được khai báo. Thật ra biến này đã được khai báo trong file GUIConstantsEx.au3 và file này đã được Include vào chương trình ở dòng đầu tiên. Để làm việc với GUI bạn sẽ cần phải Include khoãn 5 đến 6 file như vậy, nhưng không phải là Include 1 lần tất cả, vì mỗi file chỉ khai báo sẵn những biến cho 1 loại Control nào đó. Bài viết được đăng trên trang web autoit.72ls.net, mong đọc giả vào xem để ủng hộ Anh Em trong Forum viết tiếp.
- Một số bạn hỏi tớ làm sao để có được danh sách của tất cả tên biến và tên file au3 kể trên, câu trả lời là Trong file Help của AutoIT. Nhưng có một lời khuyên khác là không cần phải tìm đến danh sách này khi mới học AutoIT, bởi có tìm thấy tụi mình cũng chã biết làm gì với chúng, hơn nữa tuy số lượng của chúng nhiều nhưng chỉ dùng khoãn 2 đến 3 Biến là đủ có được 1 GUI tốt.