Friday, October 30, 2009

Thủ thuật nhỏ trong VB p8

1. Ghi các thiết đặt vào Registry

Chúng ta sẽ dùng hàm GetSetting & lệnh SaveSetting để thực hiện nhiệm vụ này. Vị trí ghi đọc giá trị của chúng trong Registry nằm ở: HKEY_CURRENT_USER\Software\VB and VBA Program Settings

* Hàm GetSetting: Dùng để đọc một trị từ Registry. Có cú pháp như sau:

GetSetting(appname, section, key[, default])

Trong đó:

AppName: Nơi mà hàm này sẽ tìm đến để đọc, thường nên đặt là tên của ứng dụng. Bắt buộc có.

Section: Trong một AppName bạn có thể tạo nhiều Section khác nhau, mỗi Section lưu trữ một nhóm thông tin có liên quan với nhau để dễ quản lý (giống như tạo thư mục con vậy). Bắt buộc có.

Key: Trong mỗi Section bạn có thể tạo nhiều key, mỗi key lưu 1 trị. Bắt buộc có.

Default: Trị mặc nhiên mỗi khi không tìm thấy Key cần đọc trong Registry. Tham số này có thể có hay không cũng được. Nếu không có trị mặc nhiên sẽ là một chuỗi rổng ("").

* Lệnh SaveSetting: Ghi thông tin vào Registry.

SaveSetting appname, section, key, setting

Các thông số tương tự như hàm GetSetting nhưng không có đối số Default. Nhưng lại có đối số Setting là trị sẽ được ghi vào Registry cho mỗi Key.

Bạn hãy xem hình để biết rõ hơn cách tổ chức các thông tin của Registry & cách ghi các thiết đặt của lệnh SaveSetting.


Các trị được lưu trong Registry

Thí dụ minh họa: Lưu trạng thái của form trước khi thoát

Trạng thái hiển thị của form bao gồm: Maximize, Minimize, Normal, Top, Left, Width, Height. Một vị trí thuận tiện nhất để lưu các thông số trên là Registry của Windows.

Vậy để giữ lại trạng thái của form thì khi form phát sinh sự kiện Unload bạn hãy ghi lại các thông số về trạng thái. Khi mở form bạn chỉ cần đọc lại các thông số đã lưu trữ. Vậy là ta có thể giữ lại được trạng thái form trước đó.

Để thí dụ tôi sẽ minh họa cách lưu lại vi trí của Form. Hãy khởi động VB & tạo 1 project mới, có 1 form tên là Form1, gõ vào code sau đây:

Option Explicit

Private Sub Form_Load()
On Error Resume Next 'Dòng này hãy gõ sau.
Me.Left = GetSetting("ChuongTrinh_ViDu", "ViTriForm", "X")
Me.Top = GetSetting("ChuongTrinh_ViDu", "ViTriForm", "Y")
End Sub

Private Sub Form_Unload(Cancel As Integer)
SaveSetting "ChuongTrinh_ViDu", "ViTriForm", "X", Me.Left
SaveSetting "ChuongTrinh_ViDu", "ViTriForm", "Y", Me.Top
End Sub

Bây giờ bạn cho chạy thử chương trình, khi chương trình chạy bạn hãy thử di chuyển form đi nơi khác, dừng chương trình, sau đó cho chạy lại, bạn sẽ thấy form xuất hiện ngay đúng vị trí mà nó đã nằm trước khi thoát.

Vào Registry để kiểm nghiệm

Tuy nhiên khi thử chương trình bạn sẽ thấy báo lỗi, lý do là chưa có thông tin trong Registry để đọc vào 2 properties Left & Top khi chạy lần đầu.

Để khắc phục lỗi này bạn có thể dùng đến trị Default của hàm GetSetting. Riêng tôi, tôi chọn cách đặt thêm dòng On Error Resume Next vào dòng đầu tiên của sự kiện Form_Load.

2. Làm cho chương trình giống trang Web

Nếu bạn cảm thấy quá chán chường với mấy cái nút lệnh Command Button, xin hãy tạo cho chương trình của mình những siêu liên kết (Hyper Links) giống như trang Web. Cách làm cực kỳ dễ:

Hãy dùng một Label Box, đặt một Caption thích hợp, rồi sau đó mà tùy ý xử lý dựa trên cái sự kiện Mouse_Move của nó.

Ví du như khi rê mouse đến thì dòng Text trong Labelbox được gạch chân bạn làm như sau:

Tạo project mới, có Form tên là Form1, trên đó đặt một Labelbox tên là Label1. Mở cửa sổ code gõ vào đoạn code sau:

Option Explicit

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Label1.FontUnderline = False
End Sub

Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Label1.FontUnderline = True
End Sub

Qua đoạn code trên ta có nhận xét sau:

- Khi mouse được rê đến Label1 thì phát sinh sự kiện mouse_move trên Label này làm cho dòng Text của nó bị gạch chân (như là Hyper link thứ thiệt).

- Khi mouse còn trên form, luôn luôn xảy ra sự kiện mouse trên form và Label1 bị gán thuộc tính FontUnderline=False. Do đó ta sẽ thấy khi mouse rời khỏi Labelbox tức thì Text của nó hết bị gạch chân ngay.

Khi mouse còn trên Form

Khi mouse được rê trên Labelbox

Tuy nhiên 1 Hyper link như vậy còn hơi nhạt nhẽo thiếu rất nhiều "hương sắc Web". Bạn có thể cho nó thêm vài thay đổi nữa như:

  • Đậm lên (FontBold)
  • In nghiêng (Font Italic)
  • Đổi Font chữ (FontName)
  • Đổi màu chữ (ForeColor)
  • Đổi màu nền (BackColor)
  • Đổi biểu tượng chuột (Mouse Icon). Nhớ đặt MousePointer là Custom - 99

Còn rất nhiều thứ xin mời bạn.

3. Làm sao để mở trình Browser & Mail mặc định của Windows ?

Bạn khai báo hàm API sau:

Private Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As _
String, ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Khi nào cần dùng chỉ việc gọi hàm

Dim ret&
ret& = ShellExecute(Me.hwnd, "Open", "http://ilpweb.itgo.com", "", App.Path, 1)

Nếu muốn gọi Mail bạn chỉ cần thay địa chỉ Web thành "mailto:email@site.com" là được rồi

Chúc bạn thành công

4. Đường dẫn của đối tượng DirListbox và App

Hãy hãy lưu ý thuộc tính Path của 2 đối tượng này. Thí dụ như bạn cần tham chiếu đến một tập tin tên là Test.txt nằm trong thư mục của chương trình (giả sử App.path == c:\myapp).

app.path & "\Test.txt" ==> c:\myapp\Test.txt

Nhưng nếu App.path của bạn là một thư mục gốc của bất kỳ ổ đĩa nào, ví dụ như c:\ thì nó lại thành.

app.path & "\Test.txt" ==> c:\\Test.txt

Chương trình sẽ báo lỗi ngay lập tức. Tương tự như vậy đối tượng DirListBox cũng bị trường hợp này.

Lý do là 2 đối tượng này trả về cho thuộc tính Path các trường hợp sau:

  • Nếu không phải là thư mục gốc thì: Tên ổ đĩa:\Tên thư mục - ví dụ C:\TEMP
  • Nhưng nếu là thư mục gốc thì lại Tên ổ đĩa:\ - vi dụ C:\

Khi lập trình tổng quát ta hay viết là

App.path & "\Test.txt"

Dir1.path & "\" & File1.Filename

Như vậy ta thấy dư 1 dấu \ khi là thư mục gốc. Để giải quyết lỗi này bạn có thể dùng hàm IIF() hoặc câu lệnh IF

Cụ thể tôi có thể viết như sau:

Dim F as String

F = Dir1.path & IIF(Len(Dir1.path)=3,""," ") & File1.FileName

Hay

If Len(Dir1=3) then

F = Dir1.path & File1.FileName

else

F = Dir1.path & "\" & File1.FileName

End If

No comments:

Post a Comment