Thursday, October 29, 2009

Xây dựng chương trình để khởi động các chương trình khác

Viết chương trình, có rất nhiều ngôn ngữ lập trình dư sức để viết một chương trình như vậy. Nhưng dễ dàng hơn hết, có lẻ và Visual Basic. Viết chương trình này bằng Visual Basic không đòi hỏi gì bạn nhiều, chỉ cần chút khéo léo và áp dụng các công cụ của Visual Basic một cách thích hợp cộng thêm chút ít sáng tạo mà thôi.


Chương trình Launch đã hoàn tất

Có rất nhiều cách để phân loại các phần mềm cài đặt trên máy. Chương trình thí dụ này phân nhóm các ứng dụng cài đặt trong Windows thành 3 nhóm: Windows System (các công cụ chuẩn của Windows), Applications (các ứng dụng của người dùng cài thêm), Vietnamese Utilities (các tiện ích về tiếng việt).

Cơ chế hoạt động của chương trình này là "mồi lửa" cho người sử dụng khởi động chương trình mà mình cần bằng menu hay các button của chương trình, sau đó chương trình này tự động "biến".

Để mồi lửa cho người sử dụng, ta buộc phải biết chính xác vị trí của các file chương trình mà người dùng cần.

Đầu tiên là các tiện ích kèm theo Windows như WordPad, Notepad, Paint, ... (tôi chỉ xin thí dụ 3 chương trình thôi). Các file thực thi của chương trình này chủ yếu nằm trong thư mục Windows, vậy chỉ cần tìm ra thư mục Windows là ta có thể giải quyết được vấn đề.

Chuyện này cũng rất dễ dàng và vô cùng may mắn là Windows có khả năng tự động tìm kiếm các file thực thi trong thư mục Windows và Windows\System cho nên chúng ta khỏe (ta có thể hiểu là nó tự đặt dường dẫn đến thư mục Windows và Windows\System).

Chú ý: Khi muốn gọi WordPad bạn phải gọi file write.exe và Paint phải gọi file Pbrush.exe. 2 file này không phải là file chương trình chính, chúng chỉ có nhiệm vụ gọi file thực thi của Paint (MSPaint.exe) và WordPad (WordPad.exe) nằm trong Program files\Accessories mới thực sự là file chương trình chính.
Microsoft phải làm như vậy để tương thích với các chương trình cũ của Windows 3.x. Sau đây là tên file của một số chương trình có sẵn trong Windows (với điều kiện bạn phải cho cài đặt khi setup Windows).

Tên file Thư mục Chương trình
notepad.exe Windows Notepad
write.exe Windows WordPad
Pbrush.exe Windows Paint
Cleanmgr.exe Windows Disk Cleanup (W98)
Defrag.exe Windows Disk Defragmenter
Scandskw.exe Windows Scan Disk
Sndvol32.exe Windows Volume Control
Winfile.exe Windows File manager
Msconfig.exe

System

System Configuration Utility
Sfc.exe System System file checker
Sysedit.exe System System Configuration Editor
.... .... ....

Vậy là chuyện gọi 1 chương trình của Windows không có gì khó khăn, chỉ cần biết tên file là xong, mọi chuyện còn lại là của Windows.

Còn các ứng dụng khác do người dùng hay người lắp máy cài đặt thêm chỉ có cách là gọi theo đường dẫn chính xác vì mỗi máy mỗi khác, công sức cho việc tìm kiếm khá gian nan, chưa hợp với các tay nghiệp dư như chúng ta. Khuyết điểm của chương trình là phải viết riêng cho từng máy, chúng ta sẽ giải quyết vấn đề này ở bài viết sau "Nâng cấp chương trình Launch".


Thiết kế giao diện

Khởi động Visual Basic Tôi dùng Visual Basic 5 để minh họa, các bạn có thể dùng các phiên bản khác (v4 hay v6) cũng không sao. Còn nếu máy chưa có phải tiến hành cài đặt, nên chọn các ấn bản Enterprise để tận dụng sức mạnh của Visual Basic (VB). Kể từ Visual Basic 5 trở đi Microsoft chỉ phát hành version 32 bit, version 16bit cuối cùng xuất hiện ở Visual Basic 4.

Vào file/ New Project, click chọn Standard EXE, click OK, bạn sẽ thấy ngay một form trống xuất hiện sẵn sàng để thiết kế.

Bây giờ bạn hãy tạo các control khác trên form, vị trí các control bạn có thể tùy ý bạn hay theo mẫu minh họa, thiết đặt các thông số về thuộc tính (properties) như sau:

Control Properties Name Notes
form

> BorderStyle: 1- FixedSingle
> MinButton: True
> Icon: cho 1 file *.ico, *.cur để làm biểu tượng cho chương trình.
> Caption: Launch

frmMain

form chính của chương trình.

Mục đích của việc gán thuộc tính BorderStyle: 1- FixedSingle là không cho người dùng thay đổi kích thước cửa sổ chương trình trong khi chạy. MinButton: True, cho phép người dùng Minimaize chương trình của mình. Mặc nhiên khi chọn BorderStyle: 1- FixedSingle thì 2 thuộc tính MinButton & MaxButton tự động gán là False.

CommandButton Caption: Windows cmdWin Các nút nhấn để khởi động các ứng dụng tương ứng trong nhóm
CommandButton Caption: Applications cmdApp
CommandButton Caption: VietNamese cmdVN
CommandButton Caption: Exit cmdExit Nút thoát
Ta có thể chia nhóm các ứng dụng đã cài đặt trên máy tính bằng nhiều cách. Có thể phân loại theo chức năng, ngôn ngữ, môi trường hoạt động, ... Trong bày minh họa này tôi tạm phân loại 1 các đơn giãn thành 3 nhóm sau: Windows (các ứng dụng có sẵn của Windows), Apptications (các chương trình ứng dụng khác), VietNamese (Các tiện ích về tiếng việt như: từ điển, bộ gõ, ...).
Label Caption: Để trống
Alignment: 2- Center
Font: fontsize = 14
lblMsg Khung thông báo
CheckBox Caption: Unload after 20 sec
Value: 1-Checked
chkUnload Nếu check thì sao 20 giây chương trình tự động thoát.
PictureBox Height: 255; Width: 5295 picOut
PictureBox Appearance: 0- Flat
BorderStyle: 0- None
BackColor: &H00C0FFC0&
picIns Bạn nên chọn một màu nào đó cho BackColor để dễ nhìn.
Bạn tự cho kích thước sao cho picIns nhỏ hơn picOut 1 chút. Và picIns phải nằm lọt trong picOut, để có thể làm picIns lọt vào bên trong bạn làm như sau: Tạo picOut, hiệu chỉnh kích thước cho hợp lý (hình minh họa), click chọn picOut, vẽ thêm 1 picturebox bên trong nữa, điều chỉnh kích thước và đặt tên là picIns. Hai PictureBox này sẽ làm thanh hiển thị thời gian khi chương trình ở chế độ tự động thoát.
Timer (giữ nguyên các thuộc tính) timer1 Phục vụ cho việc tự động thoát.

Tạo hệ thống các menu cho chương trình:

Từ trình đơn Tools chọn Menu Editor hay nhấn tổ hợp phím Ctrl - E cũng có tác dụng tương tự.

Số lượng menu này chỉ làm ví dụ. Bạn thích đưa chương trình nào vào menu thì tạo ra mục chọn menu tương ứng. Trong hộp thoại Menu Editor có các nút với công dụng như sau:

Sau đây thuộc tính của các menu

Caption

Name

&Windows
___ Windows Explorer
___ -
___ Paint
___ WordPad
___ Notepad

mnuWin
mnuWE
mnusp1
mnuPaint
mnuWP
mnuNotepad
&Applications
___ Microsoft Word
___ Microsoft Excel
___ Microsoft Access
___ -
___ Paint Shop Pro
___ -
___ Visual Basic
___ Visual C++
mnuApp
mnuWord
mnuExcel
mnuAccess
mnusp2
mnuPaintPro
mnusp3
mnuVb
mnuVc
&Vietnamese
___ VNI Tan Ky 4
___ VietKey 4.09d
___ -
___ Lac Viet td
___ Just click 'n' see
mnuVN
mnuVNI
mnuVK
mnusp4
mnuLV
mnuClickSee
&Exit mnuExit

Chúng ta thấy có 4 menu có tên lần lượt sp1, sp2, sp3, sp4, thuộc tính Caption của nó chỉ là dấu trừ "-". Tác dụng của nó là tạo ra các đường kẻ ngang để phân cách các mục chọn trong menu. Sau khi tạo xong, bạn có các hệ thống menu như sau

Giao diện sau khi tạo xong hệ thống menu. Bây giờ bạn có thể chạy thử chương trình bằng phím F5. Lúc này bạn đã thiết kế xong phần giao diện của chương trình, kế tiếp chúng ta sẽ tiến hành viết code cho chương trình.


Viết Code cho menu

Ta chỉ cần viết code cho menu, sau đó dùng các nút lệnh để gọi menu tương ứng.

Bây giờ chúng ta viết code cho mục Windows Explorer trong menu Windows. Vào Windows chọn Windows Explorer để viết code cho mục chọn menu này.

Bạn gõ vào đoạn sau:

Private Sub mnuWE_Click() ' dòng này có sẵn

Dim P
P = Shell("explorer", vbNormalFocus)

End Sub ' dòng này có sẵn

Giải thích:

* Dim P

Khai báo 1 biến kiểu variant để chứa trị trả về của hàm Shell. Đây là kiểu dữ liệu bao trùm tất cả các kiểu dữ liệu trong Visual Basic.

* P=Shell("explorer",vbNormalFocus)

Hàm Shell dùng để gọi một chương trình khác thi hành

Cú pháp Shell(pathname[,windowstyle])

pathname: là đường dẫn và file thực thi của chương trình cần gọi. Đây là 1 xâu cho nên khi viết bạn phải đặt chúng trong cặp dấu " " mới đúng.

windowstyle: là hằng số qui định phong cách khi khởi động của chương trình cần chạy. Thí dụ: sau khi gọi chương trình bạn cần Maximize, Minimize chương trình đó ... các hằng có giá trị và ý nghĩa như sau:

Tên hằng

Giá trị

ý nghĩa

vbHide 0 Window is hidden and focus is passed to the hidden window.
vbNormalFocus 1 Window has focus and is restored to its original size and position.
vbMinimizedFocus 2 Window is displayed as an icon with focus.
vbMaximizedFocus 3 Window is maximized with focus.
vbNormalNoFocus 4 Window is restored to its most recent size and position. The currently active window remains active.
vbMinimizedNoFocus 5 Window is displayed as an icon. The currently active window remains active.

Vậy có thể viết lại hàm Shell như sau Shell("explorer",1) cho gọn

Lưu ý: Trong phần pathname của hàm shell lý ra phải ghi đầy đủ đường dẫn, thí dụ
"C:\Windows\Explorer.exe" (giả sử thư mục windows là c:\windows) thay vì "explorer.exe". Sở dĩ ta có thể ghi gọn như vậy là vì Windows tự động đặt dường dẫn path đến các thư mục như: Windows; Windows\system. Do đó chỉ cần ghi explorer.exe cho tổng quát (khỏi sợ sai đường dẫn khi đem chạy trên máy khác).

Bây giờ nhấn F5 để chạy chương trình, vào menu Windows chọn Windows Explorer, lập tức chương trình Windows Explorer được khởi động.

Tương tự như vậy bạn có viết code cho tất cả các menu con còn lại của menu Windows.

Notepad.exe (Windows/Notepad)

Write.exe (Windows/WordPad)

Pbrush.exe (Windows/Paint)

Đối với Paint và WordPad ta phải dùng 2 file write.exe & pbrush.exe trong thư mục Windows để khởi động. Thực ra 2 file này chỉ có chức năng gọi WordPad.exe và MSPaint.exe (trong thư mục \Program Files\Accessories\) chứ không phải là file chương trình chính. Microsoft phải làm vậy để tương thích với các chương trình cũ.

Còn các mục chọn khác bạn cũng viết hàm Shell tương tự nhưng đường dẫn phải cụ thể và chính xác. Thí dụ để viết code cho menu "Lac Viet td". Vào VietNamese / Lac Viet td, gõ vào

Private Sub mnuLV_Click()

Dim F
F=Shell("d:\tools\lvtd\lvtd.exe",1)

End Sub

Do file lvtd.exe của máy tôi nằm trong thư mục d:\tools\lvtd

Nhấn F5 chạy thử xem có vừa ý hay không ?

Viết code cho các Command Button

Bây giờ ta viết lệnh cho các CommandButton tương ứng. Yêu cầu là viết code sao cho khi nhấn vào nút Windows thì menu Windows tương ứng sẽ hiện ra như hình minh họa

Vậy phải viết lệnh cho nút

+ Windows (cmdWin) gọi menu Windows (mnuWin)
+ Application (cmdApp) ---> mnuApp
+ VietNamese (cmdVN) ---> mnuVN

Double click vào cmdWin (hay Right click chọn View code từ menu popup), gõ vào

Private Sub cmdWin_Click()

popupmenu mnuWin

End Sub

Giải thích:

popupmenu mnuWin hành vi (method) popupmenu dùng để hiển thị menu có tên mnuWin

Xem cú pháp popupmenu

Tương tự cho 2 nút lệnh còn lại. Khi chạy thử chương trình bạn click vào nút lệnh nào sẽ xuất hiện menu tương ứng. Từ đây người dùng có thể chọn lệnh từ menu popup hay menu pulldown (menu kéo xuống) đều được.

Viết lệnh cho nút Exit như sau:

Private Sub cmdExit_Click()
End
End Sub

Làm cho chương trình tự động thoát

Đối tượng Timer

Nếu đang ở chế động tự động thoát (mục Unload after 20 Sec được chọn) sau 20 giây chương trình sẽ tự động thoát, không cần chúng ta can thiệp. Để làm được việc này ta phải dùng Timer và Picture box (picIns, picOut) đã tạo từ trước.

Sau khi chương trình khởi động hoặc khi check vào checkbox. Mỗi giây độ rộng hiện tại của picIns cộng với độ rộng của picOut/20 (vì 20 giây), cho đến khi độ rông của picIns = picOut thì dừng chương trình. Nếu không check chức năng tự động thoát không hoạt động.

Chúng ta tiến hành viết code cho các đối tượng như sau

Tình huống Form_Load() sẽ được kích hoạt khi chương trình khởi động, timer hoạt động với trị interval = 1000 (tương đương 1 giây), độ rộng picIns ban đầu là 0.

Private Sub Form_Load()
Timer1.Interval = 1000
PicIns.Width = 0
End Sub

Khi người dùng Click vào check box. Nếu có chọn sẽ làm cho timer hoạt động tương tự như Form_Load(), nếu không chọn thì cho timer ngừng.

Private Sub chkUnload_Click()
If chkUnload.Value = 1 Then
PicIns.Visible = True
Timer1.Interval = 1000
Else
Timer1.Interval = 0
PicIns.Visible = False
End If
PicIns.Width = 0
End Sub

Kiểm tra xem độ rộng picIns >= picOut hay không. Nếu có, kết thúc chương trình (End), nếu không tiếp tục tăng độ rộng picIns theo chu kỳ mỗi giây 1 lần.

Private Sub Timer1_Timer()
If PicIns.Width >= PicOut.Width Then
End
Else
PicIns.Width = PicIns.Width + PicOut.Width / 20
End If
End Sub

Chạy thử chương trình xem nó có tự động thoát không. Thử click vào check box xem có hoạt động như mong muốn chưa.

Tô son điểm phấn

Thêm vài lời nhắc nhỡ

Chúng ta còn sót 1 đối tượng là lblMsg (Label box) chưa sử dụng đến. Label box này ta dùng để in câu thông báo hướng dẫn mỗi khi người dùng rê Mouse qua các Command Button.

Thí dụ như: Khi rê mouse trên nút Windows thì câu thông báo sẽ là "Các ứng dụng chuẩn của Windows" chẳng hạn. Để làm được điều này ta hãy khảo sát tình huống MouseMove của đối tượng, cụ thể là của Command Button và Form. Right click vào nút Windows, chọn View code, chọn tình huống MouseMove.

Private Sub cmdWin_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
lblMsg.Caption = "Run Windows Utilities (Accessories group)"
End Sub

Hiển thị câu thông báo Run Windows Utilities (Accessories group) trong lblMsg khi mouse di chuyển trên nút Windows. Một cách tương tự bạn có thể làm cho các button còn lại.

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
lblMsg.Caption = "Please, select a program to start your work."End Sub

Hiển thị câu thông báo Please, select a program to start your work. trong lblMsg khi mouse di chuyển phía trên form

Khi chạy chương trình, bạn thử rê mouse lên các button sẽ thấy nội dung của lblMsg thay đổi liên tục (hiển thị các câu thông báo của chính bạn).

Làm sao để form khởi động ở giữa màn hình

Đối với Visual Basic version 5 & 6, thì chuyện này rất dễ nhưng có vẻ bí hiểm. Bạn chỉ cần right click lên cửa sổ Form Layout (nếu chưa hiển thị hãy bật lên bằng cách View\Form Layout Window) chọn Startup Position, chọn Center Screen là xong ngay.

Không những thế, bạn còn có thể tự hiệu chỉnh vị trí form sẽ hiển thị trên màn hình khi chạy một cách rất trực quan. Còn nếu bạn khoái thủ công, hãy thêm dòng lệnh này vào tình huống FormLoad của form cần canh giữa màn hình như sau.

Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
End Sub

Cách này áp dụng cho mọi phiên bản của Visual Basic.

Cuối cùng bạn chỉ dịch ra file EXE để chạy.

No comments:

Post a Comment