Thursday, October 29, 2009

Thủ thuật nhỏ trong VB p4

Gọi Internet Explorer (IE)

Chức năng Wordwrap / Mẫu hàm API

Có rất nhiều cách gọi trình duyệt Internet Explorer của Windows. Ơở đây tôi xin bày cho bạn 1 cách đơn giản nhất. Để chạy một chương trình khác từ Visual Basic, bạn buộc phải dùng hàm Shell(), đối số là gì, đó mới là điều quan trọng.

Thường IE nằm ở Program Files\Internet Explorer\IExplorer.exe thư mục Program Files nằm cùng ổ đĩa với thư mục Windows. Tóm lại, ta tìm thư mục Windows ở ổ đĩa nào, sau đó lấy 2 ký tự đầu tiên là tên ổ đĩa (Vi dụ C:), kế đến bạn hãy ghép với "Program Files\Internet Explorer\IExplorer.exe" để được đường dẫn đến IE rõ ràng. Tuy nhiên cách này sẽ "phá sản" nếu như người dùng "ngẫu hứng" cài IE ở một thư mục khác.

Có một cách khác hơi "mánh mung" một chút, nhưng đơn giản hơn và triệt để hơn rất nhiều. Bạn có thể "xí gạt" Windows để gọi IE thông qua Windows Explorer bằng cách chuyển cho nó một tham số là file htm, lúc này tự động Windows Explorer nhận biết và "alô" đến cho IE để vào thế chỗ. Vậy cũng xong chuyện, việc gọi Windows Explorer rất đễ dàng

Thí dụ: Cần gọi IE để hiển thị file "testfile.htm" bạn có thể dùng hàm Shell() như sau:

Shell("explorer.exe testfile.htm",vbNormalFocus)

Lưu ý: cách này đòi hỏi hệ thống bạn phải có Internet Explorer 4 trở lên.

Thật là đơn giản phải không bạn ?

Tạo chức năng WordWrap bằng thuộc tính ScrollBars của TextBox

Gọi Internet Explorer / Mẫu hàm API

Trong các trình soạn thảo văn bản (như Notepad). Nếu chức năng Wordwrap được chọn, khi gõ văn bản đến giới hạn của cạnh phải của sổ, thì văn bản tự động rớt xuống dòng dưới. Ngược lại nếu không cho hiệu lực chức năng này, chỉ khi nào bạn nhấn phím Enter mới xuống dòng được.

Bạn có muốn tạo 1 tính năng Wordwrap như trong Notepad không ? Cũng dễ lắm. Chúng ta hãy lợi dụng thuộc tính ScrollBars của Textbox để làm tính năng Wordwrap.

Properties ScrollBars

Thuộc tính này dùng để quy định cho Textbox có các thanh cuộn hay không, nhưng thuộc tính này chỉ có tác dụng khi thuộc tính Multiline của Textbox = True.

0 - None: Textbox không có thanh cuộn.

1 - Horizontal: Chỉ có thanh cuộn ngang.

2 - Vertical: Chỉ có thanh cuộn đứng.

3 - Both: Có cả 2 thanh cuộn ngang và đứng.

Tính năng Wordwrap chỉ có tác dụng khi thuộc tính ScrollBars là:

0 - None hoặc 2 - Vertical

Không có Wordwrap khi ScrollBars là:

1 - Horizontal hoặc 3 - Both

Nhưng thuộc tính này không thể thay đổi trong lúc chương trình thực thi. Chỉ cho phép thay đổi trong lúc thiết kế mà thôi. Do đó bạn phải tạo luôn 2 Textbox: Một Textbox không có Wordwrap (Text1), một Textbox có Wordwrap (Text2).

Trong lúc thiết kế bạn hãy cho 1 Textbox ẩn đi (Visible = False). Trong thí dụ minh họa này tôi cho Text2 ẩn.

Text1.Visible = True

Text2.Visible = False

Sau đó hãy tạo một Control nào đó để chuyển đổi qua lại giữa chế độ Wordwrap và không Wordwrap. Trong minh họa này tôi đã tạo luôn một trình Notepad, và đặt lệnh Wordwrap vào menu Edit của chương trình (Name: WWrap).

Sau đây là Code của một số Control cần thiết cho việc Demo chức năng Wordwrap.

Option Explicit

Private Sub Form_Resize()

Text1.Move 0, 0, ScaleWidth, ScaleHeight
Text2.Move 0, 0, ScaleWidth, ScaleHeight

End Sub

Điều chỉnh kích thước và vị trí của 2 Textbox, cho thích hợp với kích thước của Form mỗi khi người dùng thay đổi kích thước cửa sổ, hoặc chương trình khởi động. Xin bạn hãy nhớ một điều là: tình huống Form_Resize luôn luôn được triệu gọi mỗi khi Form_Load.

Private Sub mnuWWrap_Click()

mnuWWrap.Checked = Not (mnuWWrap.Checked)
If mnuWWrap.Checked = True Then
Text1.Visible = False
Text2.Visible = True
Text2.SetFocus
Else
Text1.Visible = True
Text2.Visible = False
Text1.SetFocus
End If

End Sub

Các lệnh cần xử lý khi người dùng chọn chức năng Wordwrap. Cho ẩn hiện Text1 hay Text2 tùy theo trạng thái (check hoặc không check) của menu WordWrap.

Private Sub Text1_Change()

Text2.Text = Text1.Text

End Sub

Private Sub Text2_Change()

Text1.Text = Text2.Text

End Sub

Tuy nhiên tại mỗi thời điểm, người dùng chỉ làm việc (gõ văn bản) trên một Textbox mà thôi, cho nên ta phải tiến hành cập nhật liên tục nội dung của 2 Textbox mỗi khi có 1 sự thay đổi nào đó trên bất cứ Textbox nào nhờ vào thủ tục tình huống Change.

Nhưng nếu chỉ bấy nhiêu đó thôi thì không ổn. Mỗi lần người dùng chuyển qua lại giữa Wordwrap và không Wordwrap tức là thay đổi Textbox, tự nhiên người dùng có cảm giác là lạ do con trỏ không nằm đúng vị trí quả thật là hơi "vô duyên". Để khắc phục nhược điểm trên bạn hãy thêm vài dòng Code sau đây vào chương trình đảm bảo người dùng không hề biết được là bạn đã đánh tráo Textbox của họ mỗi khi chọn chức năng Wordwrap.

Private Sub Text1_GotFocus()

Text1.SelStart = Text2.SelStart

End Sub

Private Sub Text2_GotFocus()

Text2.SelStart = Text1.SelStart

End Sub

Bây giờ bạn hãy chạy thử chương trình và gõ vào vài dòng văn bản, sau đó chọn lệnh Wordwrap vài lần xem, úi cha ! thật là tuyệt, chính bạn còn bị "lừa"nữa.

Lấy các mẫu khai báo hàm API

Gọi Internet Explorer / Chức năng Wordwrap

Để biết cách khai báo hàm API bạn cần khởi động tiện ích API Text Viewer được cung cấp kèm theo Visual Basic.

Nạp file Win32api.txt vào, chọn Declares trong phần API Type (có thể bạn phải chờ giây lát để chương trình load file này lên vì kích thước rất lớn). Hoặc bạn cũng có thể xem trực tiếp file này (dạng Text) bằng Wordpad.

Sau đó, bạn hãy chọn hàm trong danh sách Available Items, hàm nào cần dùng nhấn nút Add để thêm vào hộp văn bản Select Items phía đưới. Sau khi đã chọn xong tất cả các hàm cần dùng, nhấn nút Copy để chép các hàm vừa chọn vào Clipboard. Kế đến bạn chỉ việc Paste vào Visual Basic để dùng mà thôi.

Các hàm API có 2 dạng: hàm (Function) có trị trả về và thủ tục (Sub) không có trị trả về.

Khai báo cho hàm có trị trả về như sau:

Declare Function Lib [Alias ]([danh sách các đối số])

Khai báo cho các thủ tục:

Declare Sub Lib [Alias ]([danh sách các đối số])

là tên hàm trong các file thư viện DLL.

tên file thư viện DLL để Visual Basic tìm các hàm API. Các file thư viện này phải có đầy đủ tên cùng phần mở rộng, riêng đối với 3 thư viện USER, KERNEL, và GUI thì không cần phải có phần mở rộng. Tên này là một String nên cần phải bao trong dấu "".

[Alias ] có thể có hay không cũng được. Bạn cần khai báo bí danh khi muốn triệu gọi hàm API với một cái tên khác do chính bạn đặt, hoặc trong tên hàm chuẩn có chứa ký tự bị cấm sử dụng trong Visual Basic, lúc này bạn hãy đặt bí danh cho nó để Visual Basic sử dụng được.

Ví dụ hàm API "AddfontResource " sau đây được đặt lại bí danh là AddFont cho ngắn gọn mỗi lần gọi hàm.

Declare Function AddFontResource Lib "gdi32" Alias "AddFont" (ByVal lpFileName As String) As Long

Phạm vi sử dụng của hàm API cũng phụ thuộc vào các vị trí khai báo nó như cách khai báo các biến trong Visual Basic.

No comments:

Post a Comment