VietSoftT3 - Phần mềm Việt
Liên kết  
  Home
  Phần mềm Việt khác
  Hỗ trợ lập trình
  Góc thư giản
  Đánh giá
  Diễn đàn
  Liên hệ
  Góp ý
Diễn đàn
=> Not registered yet?

Nơi giao lưu, trao đổi giữa các thành viên.

Diễn đàn - Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

You are here:
Diễn đàn => Thảo luận về lập trình VB6 => Hướng dẫn từng bước tạo thư viện (ActiveX DLL) bằng VB

<-Back

 1  2 Continue -> 

rubicolort3
(11 posts so far)
06/04/2008 4:04am (UTC)[quote]
Chắc các bạn mới học nghề chưa hiểu rõ hết tác dụng của thằng thư viện liên kết động nhỉ, tại sao phải tạo nó và tạo nó như thế nào, có khó không ?
Câu trả lời là không khó, rất dễ, bạn nào biết cách tạo và sử dụng hàm và thủ tục thì tạo thư viện liên kết động chỉ dựa vào chừng nấy thui

KỲ 1: Trước hết, bạn phải rõ thư viện động là cái chi chi và nó hoạt động như thế nào
Bản thân tên gọi “thư viện liên kết động” làm cho ta liên tưởng đến các thư viện cho phép các ứng dụng có thể liên kết đến và sử dụng nó. Thư viện liên kết động là modul chứa các hàm và dữ liệu mà có thể được sử dụng bởi nhiều ứng dụng khác nhau ở cùng một thời điểm. Ví dụ: thư viện user32.dll hoặc kernel32.dll là các thư viện liên kết động mà mỗi ứng dụng Windows đều phải dùng đến. Khi đã được viết và đóng gói trong một DLL, một hàm có thể được sử dụng ở bất cứ ứng dụng nào dưới dạng mã máy của nó mà không phải quan tâm đến mã nguồn nó được viết chi tiết ra sao
(Theo Wikipedia - tại tui không biết nói cho với các bạn rõ nên đành phải nhờ thằng Wikipedia giúp 1 tay zậy )

Các bạn thấy rõ đấy, các hàm API từ trước đến giờ bạn sử dụng và gọi chẳng là chỉ là 1 hàm nằm trong 1 thư viện liên kết động. Thư viện liên kết động có thể được tạo bới bất cứ ngôn ngữ lập trình gì nhưng cách gọi và sử dụng nó thì rất đơn giản, kô hề phụ thuộc vào bất cứ ngôn ngữ nào. Vì thế bạn có thể tự tạo ra bộ thư viện liên kết động cho riêng mình và hoặc là Add thằng vào chương trình luôn (chỉ có thư viện do VB mới Add được thui) hoặc gọi giống như 1 hàm API (do nó được viết bởi các ngôn ngữ khác như C nên kô add được)

Sau đây ta sẽ tìm hiểu chi tiết về ưu nhược điểm của việc sử dụng thư viện liên kết động. Các thư viện liên kết động là một thành phần không thể thiếu tạo nên hệ điều hành Windows. Ở đó, việc quản lý, trao đổi với phần cứng hay thiết bị ngoại vi đều thông qua các hàm có sẵn trong windows mà ta hay gọi là Windows API. Thay vì ta phải đữa lệnh điều khiển cho màn hình vẽ lên một cửa sổ giao diện như các ứng dụng, thì ta chỉ cần gọi một hàm trong một file DLL nào đó, hệ thống sẽ đảm bảo kết quả như ý muốn. Sau đây là ưu nhược điểm của thư viện liên kết động DLL

Ưu nhược điểm của thư viện liên kết động
- Giảm không gian sử dụng của bộ nhớ: hàm và dữ liệu trong các DLL được chia sẻ bởi các ứng dụng dùng nó. Như trong ví dụ ở trên, các ứng dụng Winword, Excel, Internet Explorer sẽ dùng chung một hàm print() đã được biên dịch thành mã máy và để trong một DLL nào đó, mà không cần phải include toàn bộ mã nguồn của hàm. Bên cạnh đó,ta cũng có thể giảm được dung lượng bộ nhớ của chương trình tùy vào cách dùng các hàm DLL (Run-time hay Load-time, sẽ được trình bày sau): ứng dụng của ta sẽ chỉ nạp các hàm này khi nào dùng đến.
Mã trong DLL nằm trong khu vực chỉ cho đọc (read-only) và được nạp vào các trang nhớ đánh dấu read-only. Nó cho phép hệ thống ánh xạ DLL vào trong không gian địa chỉ nhớ của các tiến trình sử dụng nó. Và như vậy, DLL được nạp chỉ một lần, và nếu một tiến trình yêu cầu sử dụng nó, hệ điều hành chỉ việc ánh xạ DLL tới không gian địa chỉ của ứng dụng gọi DLL.

- Giảm Swapping (tráo đổi): ta tưởng tượng có hai tiến trình sử dụng cùng một DLL, một tiến trình kết thúc công việc của nó và thoát ra. Nhưng DLL sẽ không gỡ bỏ ra khỏi bộ nhớ vì DLL quản lý thời gian tồn tại của nó bằng cách giữ một bộ đếm tham khảo cho các tiến trình sử dụng nó. Mỗi khi có một tiến trình nào đó yêu cầu sử dùng DLL, bộ đếm tham khảo sẽ tăng giá trị của nó lên 1; còn khi có một tiến trình gỡ bỏ không sử dung nữa thì bộ đếm lại giảm đi 1. DLL sẽ tự động xóa bỏ ra khỏi bộ nhớ chừng nào bộ đếm tham khảo trở về 0, trạng thái cho biết không còn có tiến trình nào sử dụng DLL nữa.
Bây giờ giả sử có một tiến trình bắt đầu chạy và yêu cầu hệ thống nạp một DLL hiện đang được dùng bởi một ứng dụng đã chạy trước đó. Chuyện gì sẽ xảy ra? Liệu hệ thống có nạp DLL một lần nữa không? Hiển nhiên là không, vì DLL được định nghĩa ra để có thể dùng chung giữa các ứng dụng khác nhau. Thành phần đã nạp DLL có tất cả các hàm và dữ liệu của nó trong bộ nhớ và hệ thống sẽ chỉ phải ánh xạ chúng tới không gian địa chỉ của tiến trình mới cho chúng hoạt động. Nó liên quan đến việc đọc các hàm và dữ liệu DLL từ trên đĩa.

- Khi đã xây dựng được một DLL với các chức năng hợp lý, ta có thể sử dụng nó trong bất cứ ứng dụng nào mà ta cảm thấy thích hợp. Ví dụ trong một ứng dụng nhỏ, ta có tập hợp các hàm chuyển đổi giá trị từ String sang ngày tháng và đóng gói nó vào trong một DLL. Khi đó, ở một ứng dụng khác, khi có nhu cầu chuyển đổi như trên, thì ta sẽ không phải viết lại các hàm hoặc đính kèm mã nguồn của các hàm đó vào chương trình đó nữa mà sử dụng trực tiếp DLL mà ta đã biên dịch.
Tạo ra khả năng tương tác giữa các ngôn ngữ: Một ứng dụng có thể sử dụng các DLL viết bằng bất cứ ngôn ngữ nào. Các nhà phát triển phần mềm chỉ việc đóng gói các module của mình vào trong một DLL với ngôn ngữ ưa thích, sau đó module này có thể được sử dụng trong các ứng dụng viết bằng C++ hay Visual Basic.
Mặc dù hầu hết các ngôn ngữ đều hỗ trợ việc sử dụng thư viện liên kết động, nhưng lại có rất ít ngôn ngữ cho phép tạo ra chúng. Với việc sử dụng DLL, người ta có thể tập trung nhiều hơn vào các xử lý logic của hệ thống, mà không cần phải quan tâm đến những xử lý thông thường, mà nếu phát triển từ đầu, sẽ chi phí rất nhiều thời gian và công sức. Các công việc này đã được thực hiện bởi một người nào đó, và đóng gói dưới dạng các DLL.

- Dễ dàng đưa ra sự hỗ trợ sau khi đã chuyển giao ứng dụng cho khách hàng: nếu như ta phát hiện có một số thành phần trong ứng dụng cần phải được thay đổi và sự thay đổi này cần phải được cập nhật cho khách hàng. Đóng gói và phân phối lại toàn bộ sản phẩm đã bán cho tất cả các khách hàng của chúng ta là một công việc hết sức khó khăn. Tuy nhiên ta có thể tránh được điều này nếu như ứng dụng của ta được thiết kế tốt thành các module và đóng gói chúng trong các DLL. Khi một module nào đó cần thay đổi, ta chỉ việc đóng gói lại DLL chứa module đó và gửi tới khách hàng, cho họ cập nhật.
- DLL Hell: là khó khăn lớn nhất thỉnh thoảng gặp khi dùng DLL. Ta có thể gặp những thông báo lỗi dạng như: “The ordinal abc could not be located in the dynamic-link library xyz.dll.”; hoặc khi cài đặt một ứng dụng mới, một số chương trình khác đang bình thường bỗng nhiên bị trục trặc hoặc thậm chí không thể nạp lên để chạy được. Đó là các dấu hiệu của DLL Hell trên máy tính của ta. Nguyên nhân cơ bản của sự cố trên là do chương trình cài đặt không kiểm tra phiên bản của các DLL trước khi sao lưu nó vào trong thư mục hệ thống. Khi một DLL mới thay thế một DLL cũ có sẵn, và nếu DLL mới này có một số thay đổi lớn làm cho nó không thể tương thích ngược lại với các chương trình sử dụng phiên bản cũ, nó sẽ làm rối loạn chương trình đó.

(Bây giờ các bạn đã hiểu thế nào thư viện liên kết động chưa, công việc tiếp theo của ta là tạo 1 thư viện liên kết động, hẹn cac bạn ở kỳ 2 nhé
rubicolort3
(11 posts so far)
06/04/2008 4:06am (UTC)[quote]
Cảm ơn pác đã ủng hộ, thật ra, em đã post kỳ 2, đang đánh nửa chừng, thằng Maxthon Browser nó dở chứng, thế là cả bài viết ngồi 1 tiếng đồng hồ đánh không cánh mà bay, kô có thời gian nên chưa post lại !

Tiếp theo kỳ 1, ở kỳ 2 này, ta sẽ tạo 1 thư viện liên kết động đơn giản nhất (nhớ đọc kỹ kỳ 1 để biết cách thức hoạt động của nó nhé!)

Đầu tiên, bạn vô VB6 tạo dự án mới, khi hộp thoại này hiện lên thì chọn mục ActiveX DLL (xem hình vẽ
(hoặc vô Files --> New Project (Ctrl + N), chọn ActiveX DLL)


Tiếp theo, bạn phải có kha khá 1 kho source các đoạn mã nguồn hay, phân loại nó vào từng Class (để dễ quản lý và gọi sử dụng.
* Cách tạo Class và các thuộc tính của nó
- Để tạo 1 Class, bạn chọn Project --> Add Class Module
- Chọn thuộc tính phạm vi hoạt động cho nó (Instancing) (Xem hình):



+ Private: Các Class, Module khác sẽ không gọi được Class này, các hàm trong Class mang tính chất cục bộ
+ PublicNotCreatable: Các Class, Module khác trong project sẽ gọi và sử dụng được Class này, nhưng khi biên dịch thành file DLL, thì chương trình khác không gọi được nó.
+ MultiUse: Thuộc tính này sẽ giúp Class có thể được gọi và sử dụng trong project và ngay cả với các chương trình khác sau khi biên dịch thành file DLL
(Hai thuộc tính trên đều phải khai báo Class chứa hàm cần gọi)
VD: Dim abc As NewClass
abc.[hàm or lệnh]
+ GlobalMultiUse: phạm vi cao nhất, các hàm Class sẽ được sử dụng toàn cục, không cần phải khai báo sử dụng Class chứa nó
(Thuộc tính này có lợi khi khai báo sử dụng API)
VD: Declare Function [Tên hàm] Lib "[Tên thư viện DLL]" ([Các tham số: Byval a as Long, Byref b as String]) As Long
- Ngoài ra còn có các thuộc tính khác của Class nhưng bài viết mục đích là tạo 1 thư viện liên kết động đơn giản nên ta không cần bàn đến nó !

Sau khi xác định và tạo được các Class, ta phải phân loại các mã nguồn, hàm ta có được vào Class này
VD: các hàm sử lý chuỗi như tách, đọc số, chuyển chuỗi ngày tháng sang thứ trong tuần, ... thì cho vào Class String (Đây chỉ là ví dụ, các bạn có thể đổi tên Class cho phù hợp với mình)
Các bạn có thể tham khảo 1 bộ thư viện liên kết động mà mình đã tạo: http://www.caulacbovb.com/forum/viewtopic.php?t=3129

* Cấu trúc 1 hàm trong Class tối thiểu phải có như sau:

[vb]
' Public or Private
Public Function [Tên Hàm] (Byval a As Long, Byref b As String, [Tên biến] as [Kiểu dữ liệu]) as Long
On Error Goto Loi: ' Bẫy lỗi xảy ra (có thể bỏ qua nếu là hàm ngắn gọn, chắc chắn không có lỗi)
'
' Các lệnh xử lý hàm
'
[Tên Hàm] = 1 ' Hàm trả về 1 khi thành công hay trả về giá trị của hàm
Exit Function ' Thoát khỏi hàm
Loi:
[Tên Hàm] = 0 ' Trả về 0 khi xảy ra lỗi
End Function
[/vb]

* Chú ý khi xây dựng 1 hàm:
- Thứ nhất: Từ khóa Public (toàn cục) / Private (cục bộ: tùy theo mục đích của hàm, là hàm chính hay hàm phụ mà ta đặt khóa này cho phù hợp.
- Thứ hai: Từ khóa Byval / Byref: chú ý và phân biệt chức năng của nó cho kỹ nha.
+ Byval: là từ viết tắt của By Value, nghĩa là truyền bằng trị. Phương pháp này không làm thay đổi giá trị của nội dung của biến khai báo bởi từ khóa Byval
+ Byref: là từ viết tắt của By Reference, nghĩa là truyền bằng tham khảo. Phương pháp này cho phép thay đổi nội dung của biến được khai báo bởi từ khóa Byref. Mục đích là nếu ta muốn trả về nhiều giá trị chứ không phải 1 thì ta dùng cách này. Nếu chỉ trả về 1 giá trị thì ta trả về giá trị của hàm thôi. Các bạn cứ xem ví dụ dưới đây sẽ hiểu rõ ah:

VD phân biệt 2 từ khóa Byval và Byref
[vb]
Public Function GetDateFromString(ByVal sDate As String, ByRef iDay As Integer, ByRef iMonth As Integer, ByRef iYear As Integer) As Long
On Error GoTo Loi
Dim aDate As Date
aDate = Format(sDate, "dd/mm/yyyy"
iDay = Day(aDate) ' Trả về ngày cho biến iDay
iMonth = Month(aDate) ' Trả về tháng cho biến iMonth
iYear = Year(aDate) ' Trả về năm cho biến iYear
GetDateFromString = 1
Exit Function
Loi:
GetDateFromString = 0
End Function
[/vb]

Khi đó, muốn sử dụng hàm GetDateFromString thì ta làm như sau
[vb]
Dim a As Integer, b As Integer, c As Integer ' Khai báo các biến trả về cho iDate, iMonth, iYear
If GetDateFromString("29/06/2006", a, b, c) = 1 Then ' Nếu không xảy ra lỗi
MsgBox a & "," & b & "," & c ' Khi này các biến a,b,c đã được hàm trả về giá trị của nó
End If
[/vb]
- Thứ ba: [Kiểu dữ liệu]: nếu là kiểu dữ liệu chuẩn của VB thì không nói gì, điều chú ý nếu là kiểu dữ liệu tự định nghĩa bằng các từ khóa Enum và Type thì phải chú ý đến sự đồng bộ giữa phạm vi hoạt động của Class chứa hàm và phạm vi của kiểu dữ liệu đó.
Ví dụ: Nếu Class bạn đặt là MultiUse thì khi khai báo kiểu dữ liệu Enum thì phải đặt từ khóa Public và đặt nó ngay trong Class đó, chứ không thui nó báo lỗi liền (Xem hình)

- Thứ tư: Nếu trong hàm sử dụng Hook, hay Subclass thì đặt các hàm, thủ tục SubClass trong 1 Module, không đặt trong một Class

Thế là xong, trên đây chỉ là các bước đơn giản để tạo 1 hàm sử dụng trong thư viện liên kết động (Bài viết này do em tự viết, có đôi chỗ dùng sai thuật ngữ tại em cũng học VB không hoàn chỉnh, làm tới đâu, học tới đó, nên có gì thiếu sót, mong các pác nhắc nhở
Các bạn có thể tham khảo 1 bộ thư viện liên kết động mà mình đã tạo: http://www.caulacbovb.com/forum/viewtopic.php?t=3129

Kỳ tiếp theo: Kỳ 3, sẽ hướng dẫn các bạn sử dụng các thư viện liên kết động, cách đăng ký, cách gọi các hàm đã viết, sao cho hiểu quả ...!
rubicolort3
(11 posts so far)
06/04/2008 4:07am (UTC)[quote]
Không ngờ bài tự viết của mình lại được mọi người tán đồng vậy, em xin Post tiếp kỳ 3 luôn, trong kỳ này, ta sẽ tham khảo cấu trúc chung của 1 Class, cách tạo thuộc tính cho Class (1 thành phần quan trọng, nòng cốt của thư viện liên kết động), ...
Để dễ theo dõi, mình sẽ chia kỳ này ra làm 2 mục nhỏ 3-I, 3-II

Kỳ thứ 3-I
Cấu trúc chung của 1 Class gồm các thành phần sau (chỉ mang tính tương đối, có thể không có:
* Từ khóa Public và Private rất quan trọng, nếu đặt từ khóa Public cho các biến, kiểu dữ liệu tự định nghĩa, hàm, thủ tục thì người ngoài có thể gọi và sử dụng nó, không thì nó sẽ ẩn đi

1. Phần khai báo biến, Hằng, các hàm API, các kiểu dữ liệu tự định nghĩa
VD:
[vb]
Const ABC = "ABC"

Public Type P
P1:Long
P2:String
End Type

'Chú ý, nếu tên có dấu cách thì phải đặt trong cặp dấu ngoặc vuông []
Public Enum E
E1 = 1
[E 2] = 2
End Enum

Private Declare Function API_A Lib "shell32.dll" (ByVal dwA As Long, lpData As P) As Long

Private A As String
' Giả sử bạn có đặt các thuộc tính cho Class thì nên khai báo các biến này
Private m_TT1 As String
Private m_TT2 As Font
Private m_TT3 As Long
' --
'Chú ý: nếu đặt khóa Public thì biến đó có thể coi như sử dụng như một thuộc tính của Class
Public B As Long
[/vb]
* Chú ý quan trọng: Trong phần 1, mình chỉ chú ý các bạn đến sự đồng bộ giữa từ khóa Private/Public trong phần khai báo và từ khóa Private/Public trong các hàm.
Giả dụ: Nếu bạn đặt từ khóa Public cho 1 hàm, bắt buộc các khai báo có liên quan phải Set Public
[vb]
Public Function Ham1(Byval So1 As E) As P
' ...
' Trong ví dụ này, khi khai báo, bắt buộc phải đặt từ khóa khai báo cho E và P là Public (mình đã đặt sẵn ở trên cho phù hợp với ví dụ này)
End Function
[/vb]

2. Phần khai báo các sự kiện thêm, riêng cho Class (giống như sự kiện trong ActiveX OCX - Usecontrol)

Event [Tên sự kiện](ThamSo1 As Integer, [Tham số 2] As [Kiểu dữ liệu])
Ví dụ (Lấy trong Class TraySystem của thư viện VietDLL cho rõ:
[vb]
Event BalloonClicked() ' Sự kiện xảy ra khi người dùng click lên Balloon
Event MouseUp(Button As Integer) ' Sự kiện xảy ra khi người dùng nhả chuột khi nhấn vào icon trên SystemTray, tham số truyền vào ở đây là Button cho biết chuột trái hay phải nhấn
[/vb]
Và cách gọi sự kiện cùng ý nghĩa các tham số của nó ta sẽ tham khảo sau, trong kỳ 3-II

3.Đặt thuộc tính cho Class
Giả dụ: ta có 1 số lệnh sau
[vb]
Dim A As New Class1 ' Class1 là tên Class mình đang làm
A.TT1 = Me.Caption ' Đây là lệnh sẽ đặt nội dung cho thuộc tính TT1 là chuỗi tiêu đề Form hiện hành
Set A.TT2 = Me.Font 'Đây là lệnh sẽ đặt nội dung cho thuộc tính TT2 là kiểu Font của Form hiện hành
Msgbox A.TT1 ' Đây là lệnh sẽ lấy nội dung thuộc tính TT1 của Class1 và thông báo
Msgbox A.Font.Name ' Đây là lệnh sẽ lấy nội dung thuộc tính TT2 của Class1 và thông báo
Msgbox A.TT3(1) ' Đây là lệnh sẽ lấy nội dung thuộc tính TT2 có chỉ số 1 của Class1 và thông báo
[/vb]
Có lẽ em giải thích hơi ấu trĩ nhỉ

Ở đây, em chỉ biết có 2 cách đặt là Let, Set, lấy thuộc tính là Get (còn những cái nào, hiện em chưa biết, lỡ có gì thiếu mong các pác chỉ giáo)
Đưới đây là các mẫu cấu trúc cho 3 từ khóa trên
[vb]
Public Property Get TT1() As String
' Nếu bạn chỉ để từ khóa Get, không để từ khóa Set hoặc Let thì người dùng chỉ có thể lấy nội dung của thuộc tính nhưng không được phép cập nhập, theo mình thì từ khóa Get phải có mặt
TT1 = m_TT1 ' Gán nội dung TT1 từ nội dung của biến m_TT1 đã khai báo trên
' các lệnh xử lý khác nếu có
End Property

Public Property Get TT2() As Font
Set TT2 = m_TT2
End Property

' Sử dụng tùy theo 2 thuộc tính Set và Let; chỉ dùng 1 trong 2 thui
Public Property Let TT1(V As String)
' ...
m_TT1 = V ' Đặt nội dung của V cho biến m_TT1
' Các lệnh xử lý khác nếu có, như
If V="" then Msgbox "Loi"
End Property

Public Property Set TT2(V As Font)
' ...
' Nếu người dùng đặt thuộc tính bằng từ khóa Set như ví dụ trên, bắt buộc phải dùng từ khóa Set
Set m_TT2 = V
' Các lệnh xử lý khác nếu có
End Property

Public Property Get TT3(Ind As Long) As Long
TT3 = m_TT3(Ind)
End Property
Public Property Let TT2(Ind As Long, V As Long)
' Chú ý ngoài biến V để gán dữ liệu, nếu ở trên trong thủ tục lấy có biến nào, thì thủ tục gán cũng có biến đó, ở đây ví dụ là biến Ind
End Property
[/vb]

* Chú ý:
- Nếu chỉ đơn giản là tạo thuộc tính để lưu trữ nội dung, không cần xử lý bằng các câu lệnh gì thêm thì ta có thể khai báo trực tiếp biến
VD: Ta sẽ khao báo trực tiếp biến TT1, TT2, TT3 thay cho các dòng GetLet trong mục 1
[vb]
Public TT1 As String ' nếu khai báo vậy thì ngầm hiểu rằng sử dụng Get và Let
Public TT2 As Font ' nếu khai báo vậy thì ngầm hiểu là sử dụng Get và Set
Public TT3(3) As Long
[/vb]
- Phải chú ý đồng bộ dữ liệu giữa 2 việc Get và Let (hoặc Set), Nếu Get mà trả về kiểu String, Let lại gán kiểu giá trị Long thì sẽ báo lỗi ngay

Bài viết trên là do em viết, có thể còn rất nhiều lỗi do hiểu chưa tốt, mong các pác đọc và nhắc nhở để em củng cố lại, sửa lại cho hoàn chỉnh ! Thank

Trên đây, chúng ta đã đi được nửa dặm đường rùi đấy !
Kỳ này tạm thời dùng ở đây, dài quá mọi người theo dõi hổng được, hẹn ở kỳ tiếp nhé (không biết rảnh để viết không nữa )
rubicolort3
(11 posts so far)
06/04/2008 4:07am (UTC)[quote]
Kỳ tiếp theo ...
Kỳ thứ 3-II
Ở kỳ 3-I, ta đã tham khảo một số cấu trúc mẫu của 1 Class trong 1 thư viện liên kết động
Trong kỳ 3-II này, mình sẽ hướng dẫn các phần còn lại!


4. Phần thuộc tính bắt buộc và chung của 1 Class

Các Class đều có 2 sự kiện chung là InitializeTerminate
+ Initialize: xảy ra khi bắt đầu thao tác với Class như chạy 1 hàm, lệnh trong Class, đặt các thuộc tính của Class như đã nêu trên, ...
Gợi ý: có thể dựa vào nó để thiết đặt các giá trị ban đầu cho toàn bộ Class, hoặc là nếu chương trình của bạn mang tính thương mại thì có thể kiểm tra đã đăng ký chưa
+ Terminate: xảy ra khi ứng dụng, Form liên kết với Class bị Kill (Unload) hoặc ta xóa Class khỏi bộ nhớ (Set [Tên Class] = Nothing). Nhưng chỉ khi sự kiện Initialize xảy ra rồi thì sự kiện Terminate mới có

Hai sự kiện này ta coi như nó giống như Load và Unload của Form đóa


Tôi lấy Ví dụ trong Class TraySystem để các bạn hiểu rõ hơn
[vb]
Private Sub Class_Initialize()
m_AutoTiengViet = True ' Mặc định là tự động gõ tiếng việt
CheckRegister ' Kiểm tra đăng ký sử dụng
End Sub

'...

Private Sub Class_Terminate()
' If the icon is still in the tray, remove it
If m_IconLoaded = True Then RemoveIcon ' Remove Icon trên SystemTray khi Unload Form --> tức là Unload Class
End Sub
[/vb]


5. Cách sử dụng các thuộc tính, các sự kiện đã khai báo ở trên

Ở mục 2, ta đã tham khảo cách khai báo các sự kiện thêm cho Class. Đó mới chỉ là cái vỏ bọc chứ chưa có cái hồn hay thực ra nó chưa hoạt động như là 1 sự kiện thật sự. Giờ ta sẽ quy định cho nó khi nào thì sẽ xảy ra sự kiện đã khai báo trên. Trước tiên ta phải xác định rõ ràng khi nào thì sự kiện xảy ra và các tham số phù hợp kèm theo của nó.
Sau đó dùng lệnh RaiseEvent [Tên sự kiện]([Gán các giá trị cho biến của sự kiện]) để bắt và kích hoạt sự kiện, khi nào các hàm nằm trong sự kiện đó sẽ chạy (giống như sự kiện của Control bất kỳ nào)


Và một ví dụ như sau, cũng trong SystemTray, với các sự kiện DoubleClick, MouseDown, MouseUp giả dụ đã khai báo ở trên

[vb]
' ***************************------------------------Khai bai cac su kien--------------------------------*******************************
Event MouseUp(Button As Integer) ' Button la bien cho ta biet Mouse nhan la trai hay phai
Event MouseDown(Button As Integer) ' Button la bien cho ta biet Mouse nhan la trai hay phai
Event DoubleClick(Button As Integer) ' Button la bien cho ta biet Mouse nhan la trai hay phai
' ***************************------------------------ket thuc khai bai cac su kien----------------------*******************************

Private Sub m_Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Msg As Long
If m_Form.ScaleMode = 1 Then
Msg = X / Screen.TwipsPerPixelX
Else
Msg = X
End If

Select Case Msg
' Bắt sự kiện DoubleClick với chuột trái là 0, phải là 1 và truyền vào biến Button
Case WM_LBUTTONDBLCLK: RaiseEvent DoubleClick(0)
Case WM_RBUTTONDBLCLK: RaiseEvent DoubleClick(1)

' Bắt sự kiện MouseDown với chuột trái là 0, phải là 1 và truyền vào biến Button
Case WM_LBUTTONDOWN: RaiseEvent MouseDown(0)
Case WM_RBUTTONDOWN: RaiseEvent MouseDown(1)

' Bắt sự kiện MouseUp với chuột trái là 0, phải là 1 và truyền vào biến Button
Case WM_LBUTTONUP: RaiseEvent MouseUp(0)
Case WM_RBUTTONUP: RaiseEvent MouseUp(1)
End Select

End Sub
[/vb]


Vậy là trong kỳ 3, ta đã tham khảo toàn bộ các cấu trúc và đặc tính của 1 Class, cũng như cách xây dựng hàm, thuộc tính, sự kiện của Class. Còn lại là công việc của bạn nữa thui, ai không hiểu phần nào, cứ Post, em sẽ giải đáp giùm cho, thấy khó khắn chỗ nào, nếu giúp được, em sẽ làm.
Các pác có thể down Source bên dưới minh họa việc tạo Class, Class SystemTray giúp đưa chương trình xuống khay hệ thống với Balloon TooltipText.
Và ở kỳ tiếp theo là sẽ hướng dẫn sử dụng thư viện theo 2 cách, và mỗi cách có 1 ưu nhược điểm riêng của nó !

PM: Các bạn mình viết vậy có dễ hiểu hay không để em rút kinh nghiêm ở những bài viết sau
Cảm ơn đã theo dõi bài viết của em
rubicolort3
(11 posts so far)
06/04/2008 4:12am (UTC)[quote]
Ví dụ về cách tạo Class DLL
http://rubicolort33.googlepages.com/VDtaoClass.zip

Answer:

Nickname:

 Text color:

 Font size:
Close tags



Total topics: 11
Total posts: 37
Total users: 24
Online now (registered users): Nobody crying smiley
 
Đánh giá  
 

Bạn thấy các phần mềm của mình như thế nào?
Rất hay và có ích
Bình thường thôi
Quá tệ

(View results)


 
Số người truy cập trong tháng này 114678 visitors (260662 hits)
This website was created for free with Own-Free-Website.com. Would you also like to have your own website?
Sign up for free