1 Mục lục 1 2 Làm quen với visual basic 0 9


Cung cấp help cùng với ứng dụng



tải về 1.69 Mb.
trang18/39
Chuyển đổi dữ liệu09.10.2016
Kích1.69 Mb.
#32631
1   ...   14   15   16   17   18   19   20   21   ...   39

9.3Cung cấp help cùng với ứng dụng


Bước cuối cùng trong việc thêm Help vào ứng dụng là chắc chắn rằng nó sẽ đến tay người sử dụng. Các yêu cầu cho việc cung cấp Help cùng với ứng dụng có hơi khác giữa WinHelp và HTML Help.

9.3.1Cung cấp WinHelp


Bởi vì mọi hệ thống Windows đều có cài đặt sẵn Trình xem Trợ giúp của Windows (Windows Help Viewer), ta chỉ còn phải cung cấp tập tin Help (.hlp). Trình đóng gói và Triển khai (Package and Deployment Wizard) tự động thêm các phần phụ thuộc cho tập tin Help được tham chiếu bởi ứng dụng. Nếu ta tạo ra phần cài đặt bằng các công cụ khác, ta phải bảo đảm rằng tập tin.hlp được đưa vào và được cài đặt vào đúng vị trí (thường là trong cùng thu mục với ứng dụng hoặc là thư mục Windows\Help).

9.3.2Cung cấp HTML Help


HTML Help là một kỹ thuật tương đối mới, do đó, ta không thể giả định rằng mọi người sử dụng đề có những tập tin cần thiết để xem HTML Help. Trình đóng gói và Triển khai (Package and Deployment Wizard) sẽ thêm các phần liên quan đối với tập tin HTML Help (.chm) được tham chiếu bởi ứng dụng; nhưng nó không thêm tất cả các phần liên quan đến tập tin HTML Help Viewer. Ta cần phải sửa lại phần cài đặt để đưa các tập tin này vào. Tra cứu các tài liệu cho công cụ HTML Help để hiểu thêm về các tập tin nào được yêu cầu trong một tình huống cho trước.

10Lập trình hướng đối tượng

10.1 Giới thiệu về đối tượng


Từ đầu quyển đến giờ, chúng ta chỉ sử dụng biến để chứa những dữ liệu tạm thời trong ứng dụng, chẳng hạn như những giá trị do người sử dụng nhập vào qua giao diện. Tuy nhiên, đây chỉ là một phần nhỏ của VB. VB 6 thực chất là một công cụ lập trình hướng đối tượng rất mạnh.

Bạn có thể cho rằng kỹ thuật này vượt quá khả năng một người mới học lập trình VB. Tuy nhiên, không hẳn như vậy. Lập trình hướng đối tượng (Object Oriented Programming – OOP) giúp lập trình dễ dàng hơn.

Các ví dụ dùng trước đây được lập trình theo kiểu lập trình cổ điển. Điều này không có gì sai bởi vì đây là những chương trình nhỏ và việc sử dụng OOP cho chúng cũng không phù hợp. Với kiểu lập tình cổ điển, còn gọi là Phát triển phần mềm theo cấu trúc (Structured Software Development), ta phải xác định dữ liệu cũng như cách thức để xử lý dữ liệu trong ứng dụng. Một giao diện người sử dụng được cung cấp để hiển thị và nhận dữ liệu từ người sử dụng, sau đó, các hàm và thủ tục con được xây dựng để thực sự xử lý dữ liệu. Điều này có vẻ đơn giản. Để giải quyết một vấn đề lớn, ứng dụng chia thành nhiều vấn đề nhỏ để giải quyết một vấn đề lớn, ứng dụng chia thành nhiều vấn đề nhỏ để giải quyết trong các hàm / thủ tục.

OOP hơi khác một chút. Với lập trình có cấu trúc, cách thức xây dựng ứng dụng, cách chúng kết hợp ở mức chương trình rất khác biệt với thực tế cuộc sống. Lấy một ứng dụng tính lương làm ví dụ. Khi nhân viên được nhận vào làm việc, các thông tin về nhân viên đó sẽ được nhập vào hệ thống tính lương. Sử dụng kỹ thuật lập trình có cấu trúc, ta sẽ dùng một biểu mẫu để chứa các thông tin của nhân viên và viết chương trình để copy tất cả thông tin đã nhập vào biểu mẫu đó vào CSDL chứa ở đâu đó trên mạng công ty. Để tạo ra phiếu trả lương, ta cần có một biểu mẫu in phiếu trả lương cho phép NSD chương trình chọn một nhân viên sẽ trả lương, rồi viết chương trình để thu thập tất cả thông tin từ CSDL và định dạng nó rồi đưa ra máy in.

Ta có thể thấy rằng, giải pháp này nặng về kỹ thuật và nghiêng về xử lý máy tính hơn là cách thực hiện trong thực tế cuộc sống. Lập trình hướng đối tượng sẽ làm cho mọi chuyện trở nên đơn giản hơn nhiều.

Với OOP, ta viết một chương trình dựa trên các đối tượng của thực tế cuộc sống. Ví dụ, nếu ta đang viết một ứng dụng tính lương, đối tượng mà ta cần làm việc sẽ là phòng bannhân viên. Mỗi đối tượng này có các thuộc tính: ví dụ, một nhân viên có tên và số; một phòng ban có vị trítrưởng phòng. Thêm vào đó, có một số phương thức để phòng phát lương áp dụng cho các đối tượng trên - mỗi tháng một lần, nó quyết định áp dụng phương thức phát lương cho các đối tượng nhân viên. Lập trình OOP cũng tương tự như thế: Ta quyết định đối tượng nào là cần thiết, đối tượng có những thuộc tính nào, và ta sẽ áp dụng những phương thức nào cho đối tượng.

Ta có thể thấy rằng, đây là giải pháp hết sức gần gũi với những vấn đề của thực tế cuộc sống mà ta thường xuyên gặp phải. Nhân viên được xem là đối tượng trong một ứng dụng, và phòng ban là đối tượng có liên quan với nhân viên.

Với lập trình có cấu trúc, ta có xu hướng xem dữ liệu và cách thức xử lý dữ liệu là hai phần tách biệt nhau, hoàn toàn khác với các đối tượng và cách xử lý trong thực tế cuộc sống mà ta vẫn thường làm. Với OOP, ta đóng gói dữ liệu và các chức năng xử lý dữ liệu trong một đối tương (Object) giống hệt với đối tượng trong thực tế cuộc sống. Nhân viên có tênđịa chỉ, vì vậy, đây sẽ là các thuộc tính của đối tượng Nhân viên - dữ liệu. Nhân viên có thể được nhận việcbị đuổi việc, vì vậy, đây sẽ là các phương thức của đối tượng Nhân viên – chức năng.

Bằng cách chia ứng dụng thành nhiều đối tượng và phát triển trên các đối tượng, kỹ thuật này gần gũi hơn với đời sống. Nó giúp tạo ra những chương trình dễ đọc dễ bảo trì. Kỹ thuật này cũng là chọn lựa của nhiều công ty lớn phát triển trong phần mềm.


10.1.1Đối tượng trong VB


Như vậy các lý thuyết trình bày trên đây thể hiện như thế nào trong VB? Khi ta quyết định đặt một hộp văn bản vào biểu mẫu, ta có phải gọi thủ tục con để tạo hộp văn bản, một thủ tục con khác để đặt hộp văn bản vào vị trí, rồi gọi một thủ tục con khác nữa để định giá trị khởi động? Ta có phải luôn gọi một hàm mỗi khi người sử dụng nhập một giá trị bất kỳ vào hộp văn bản? Dĩ nhiên không phải như vậy.

Những gì ta cần làm là kéo và thả một đối tượng (hay một điều khiển), chẳng hạn như hộp văn bản vào biểu mẫu, rồi dùng các thuộc tính để sửa đổi cách thể hiện chúng. Khi người sử dụng nhập dữ liệu vào hộp văn bản, hộp văn bản sẽ thông báo cho ta biết thông qua các sự kiên Change và sự kiện KeyPress. Mặc dù trước đây, bạn không nhận ra điều này, nhưng ở một mức độ nào đó, bạn đã thực hiện lập trình hướng đối tượng rồi đó.

Ngoài các đối tuợng hay điều khiển được cung cấp sẵn, VB còn cho phép lập trình viên tạo ra các đối tượng thông qua cơ chế modul lớp (Class module). Trong lớp Modul, ta định nghĩa các thuộc tính và phương thức của một đối tượng. Sau khi hoàn tất, để sử dụng đối tượng, trước hết, ta tạo ra đối tượng và gọi các hàm / thủ tục trong modul lớp.

Các đối tượng này có một số đặc tính chung:



  • Từng đối tượng phải có chức năng tổng quát, được định nghĩa vừa đủ để hiểu nhưng khá mềm dẻo để có thể sử dụng được; nhưng cho phép phát triển thêm tuỳ theo yêu cầu. Ví dụ, một nút lệnh phải có chức năng chung là nhấn vào để thi hành một công việc gì đó. Tuy nhiên, cách thể hiện và hoạt động của nó trong từng trường hợp có thể thay đổi chút ít tuỳ theo cách ta cài thuộc tính và viết code cho phương thức để phản ánh với sự kiện.

  • Đối tượng giao tiếp bên ngoài thông qua thuộc tính, phương thức, và sự kiện được định nghĩa trước cho nó. Tổ hợp của 3 khái niệm này gọi là giao diện (Interface). Đó là những yếu tố cần biết về một đối tượng để sử dụng chúng.

  • Có thể sử dụng nhiều đối tượng trong một đề án, ta cũng có nhiều thể hiện khác nhau của một kiểu đối tượng.

  • Người sử dụng đối tượng không cần quan tâm đến cách lập trình bên trong đối tượng.

  • Bởi vì người sử dụng chỉ thấy đối tượng điều khiển, ta có thể thay đổi hoạt động bên trong của đối tượng sao cho những thay đổi này không ảnh hưởng đến ứng dụng đang dùng, nghĩa là không thay đổi Interface.

10.1.2Modul Lớp


Khuôn mẫu để tạo đối tượng là modul lớp. Sau này, modul lớp còn được dùng để tạo điều khiển ActiveX, một kỹ thuật cao hơn của lập trình hướng đối tượng.

Trong bước lập trình căn bản với VB, ta dung modul để chứa các hàm hay thủ tục. Tuỳ theo tầm hoạt động của hàm / thủ tục này, ta có thể gọi chúng trực tiếp từ modul.

Nhưng modul lớp thì không bao giờ được gọi trực tiếp. Để sử dụng một lớp, ta phải tạo đối tượng từ lớp thông qua lệnh New.

Ở đây đối tượng được tạo từ lớp MyClass, còn biến đối tượng MyObject cung cấp một tham chiếu đến đối tượng.

Dim MyObject As New myClass

Dòng lệnh trên tạo một đối tượng gọi là MyObject theo mô tả của lớp MyClass. Hành động này gọi là tạo một Instance từ lớp.Trong cửa sổ Properties, ta có thể phân biệt tên lớp và tên đối tượng. Combo1 là tên đối tượng, trong khi ComboBox là tên lớp.

Ta có thể tạo ra vô số Instance từ một lớp. Mỗi Instance có thể khác nhau một chút tuỳ theo cách ta quy định thuộc tính và sử dụng phương thức.

10.1.2.1Thuộc tính và phương thức của lớp


Bên trong một lớp, ta có thủ tục phương thức (Method Procedures) và thủ tục thuộc tính (Property Procedures). Quy định một thuộc tính, nghĩa là ta đang gọi hàm xử lý sự kiện Property Let.

Trong VB4, modul lớp còn rất thô sơ. Đến VB5, nó bắt đầu hỗ trợ gần gũi hơn cho lập trình hướng đối tượng. Ví dụ: ta có thể tạo ra những điều khiển có thể kết hợp trong môi trường phát triển VB (và những ngôn ngữ khác). Thuộc tính của chúng hiển thị trong cửa sổ Properties, những sự kiện của chúng xuất hiện trong danh sách thả xuống chứa trong cử sổ Code.

Trong VB6, phiên bản ProfessionalEnterprise hỗ trợ Trình xây dựng Lớp (Class Builder) giúp lập trình viên làm việc rất dễ dàng với lớp. Nó cung cấp một loạt các hộp thoại, hướng dẫn ta từng bước để tạo lớp. Tuy nhiên, trong ví dụ này, để hiểu tổ chức một lớp, ta sẽ tạo bằng tay.


  • Ví dụ mẫu - Thiết kế lớp có chức ăng di chuyển hộp trên màn hình:

  1. Tạo đề án mới, kiểu Standard EXE.

  2. Từ menu Project, chọn Add Class Module.

  3. Chọn Class Module và nhấn Open. Cửa sổ Code sẽ hiển thị. Nếu nhìn vào cửa sổ Project Explorer, ta sẽ thấy một lớp mới xuất hiện.

  4. Vì ta muốn tạo một lớp Box, nên ta đổi tên lớp Class1 sao cho gợi nhớ: clsBox. Cụm từ “cls” thể hiện đây là lớp, nhờ đó, chương trình trở nên dễ đọc hơn. Để thực hiện điều này, tìm lớp Class1 trong cửa sổ Properties, đổi thuộc tính Name của nó thành clsBox.
10.1.2.1.1Thuộc tính của Lớp – Public và Private

Lớp Box có 4 thuộc tính là toạ độ góc trái trên (X,Y), chiều cao (Height) và chiều rộng (Width). Bây giờ ta cần khai báo các thuộc tính trên là Public hay Private.

Khi một thuộc tính được khai báo là Public trong một lớp, nó sẽ được sử dụng bởi bất kỳ đoạn chương trình nào có sử dụng lớp này. Trái lại, nếu thuộc tính là Private trong một lớp thì nó sẽ không được truy cập bởi bất cứ đoạn chương trình nào khác.

Ta thử tìm hiểu về thuộc tính Public. So sánh cách khai báo của một thuộc tính Public với một biến Public. Ở đây, biến Public trong một lớp giống như một biến Public bất kỳ nào khác, chỉ có điều là khi ta xử lý nó trong chương trình thì giống như ta đang xử lý với một thuộc tính.

Ví dụ, nếu ta khai báo thuộc tính X là một biến Public, sau đó, khai báo một đối tượng gọi là MyBox dựa trên lớp này, ta có dòng lệnh sau:

MyBox.X = 1000

Tham chiếu đến X tương tự như khi ta xử lý với một thuộc tính thông thường trên các đối tượng hoặc điều khiển bất kỳ khác. Nhưng những gì chúng ta làm là cho phép người sử dụng đối tượng của chúng ta đổi X thành giá trị mà họ mong muốn.

Bây giờ ta sẽ khai báo X là thuộc tính Public, nó cũng tương tự. Nhưng nó cũng không giống hẳn. Đối với thuộc tính Public, mỗi khi nó bị đổi giá trị, một đoạn chương trình bên trong lớp sẽ thi hành. Trong đoạn chương trình này, ta có thể quyết định ta muốn giá trị nào đó mà người sử dụng chỉ ra, và nếu không thì làm một tác vụ gì đó. Do đó, sự khác nhau giữa biến và thuộc tính là: thuộc tính luôn có một đoạn chương tình chạy bên trong mỗi khi nó được truy cập.

Dùng thuộc tính thay cho biến cũng hạn chế khả năng sai sót vì giá trị truyền vào lớp được kiểm nghiệm nhờ đoạn chương trình kiểm tra bên trong lớp.

Trong thực tế, thuộc tính hữu dụng hơn biến vì đôi khi ta cần một xử lý hơn là chỉ gán giá trị. Ví dụ, đổi thuộc tính Color của một hộp văn bản hiệu chỉnh làm nó đổi màu trên màn hình. Đây là một tác vụ không thể thực hiện được với biến. Đoạn chương trình bên trong sẽ gọi một phương thức để thi hành tác vụ này.


    Ví dụ mẫu – Thêm thuộc tính vào lớp.

  1. Ta khai báo biến để chứa giá trị thuộc tính

Option Explicit

Private mvarX As Integer

Biến này có tầm hoạt động bên trong modul lớp.


  1. Thêm chương trình vào thuộc tính X:

Public Property Let X(ByVal vData As Integer)

mvarX = vData

End Property

Public Property Get X() As Integer

X = mvarX

End Property

Đoạn chương trình này không thi hành trực tiếp trừ phi nó được gọi thông qua thuộc tính đối tượng.

Dim MyBox As New clsBox

MyBox.X = 100

Khi ta gán giá trị 100 cho thuộc tính X, thực chất, ta đang gọi thủ tục Property Let X:

Public Property Let X(ByVal vData As Integer)

mvarX = vData

End Property

Giá trị 100 truyền cho tham số vData. Sau đó, nó được gán cho biến cục bộ mvarX, nghĩa là thuộc tính đã được thay đổi và chứa vào đối tượng. Để xem giá trị thuộc tính, ta gọi:

New_Position = MyBox.X

Nghĩa là thủ tục Property Get X thi hành:

Public Property Get X() As Integer

X = mvarX

End Property


  • Thủ tục Property Let được gọi khi đổi giá trị thuộc tính. Giá trị đổi sẽ được chứa vào một biến cục bộ bên trong lớp.

  • Thủ tục Property Get được gọi khi cần đọc giá trị thuộc tính. Giá trị chứa trong biến cục bộ được trả về Property Get.

Tuy nhiên, hai thủ tục thuộc tính này chỉ làm việc với các kiểu dữ liệu cơ bản như Variant, String, Integer...Đối với thuộc tính chứa đối tượng, thay vì dùng Property Let, ta dùng Property Set. Ví dụ:

Public Property Set Font (Byval New_Font As stdFont)

Set mvarFont = New_Font

End Property

Để định thuộc tính Font của đối tượng MyObject từ ứng dụng, ta gửi cho nó đối tượng Font myFont. Tuy nhiên, để đảm bảo VB dùng thủ tục Property Set, ta đặt từ khoá Set trước thuộc tính:

Dim myFont As New StdFont

myFont.Name=”Courier”

myFont.Bold=True

Set MyObject.Font = myFont

Tương tự, ta hoàn tất các thuộc tính còn lại của lớp clsBox.



  1. Trong phần General Declarations, thêm các biến cục bộ.

Option Explicit

Private mvarY As Integer

Private mvarWidth As Integer

Private mvarHeight As Integer



  1. Thêm các thủ tục tiếp theo:

Public Property Let Y(ByVal vData As Integer)

mvarY = vData

End Property
Public Property Get Y() As Integer

Y = mvarY

End Property
Public Property Let Width(ByVal vData As Integer)

mvarWidth = vData

End Property
Public Property Get Width() As Integer

Width = mvarWidth

End Property
Public Property Let Height(ByVal vData As Integer)

mvarHeight = vData

End Property
Public Property Get Height() As Integer

Height = mvarHeight

End Property


  1. Lưu modul thành tập tin clsBox.cls

  2. Đến đây, ta cần 2 phương thức nữa là vẽ hộp (DrawBox) và xoá hộp (ClearBox). Cả 2 phương thức có một tham số truyền là đối tượng để vẽ hộp lên. Nó có thể là biểu mẫu, hộp hình...
10.1.2.1.2Phương thức của Lớp

  • Ví dụ mẫu – Thêm phương thức cho lớp

  1. Thêm đoạn chương trình sau vào modul lớp:

Public Sub DrawBox(Canvas As Object)

Canvas.Line (mvarX, mvarY)-(mvarX + mvarWidth, mvarY + mvarHeight),, B

End Sub

Đoạn chương trình này sử dụng phương thức Line của đối tượng Canvas. Phương thức Line sẽ vẽ một hộp trên biểu mẫu nếu ta đưa vào tham số cuối cùng B (B có nghĩa là hộp – box).



  1. Kế đến, ta thêm ClearBox vào Lớp:

Public Sub ClearBox(Canvas As Object)

Canvas.Line (mvarX, mvarY)-(mvarX + mvarWidth, mvarY + _

mvarHeight), Canvas.BackColor, B

End Sub


  1. Lưu modul với tên clsBox.cls

Vì 2 thủ tục này sẽ được dùng làm phương thức của đối tượng, nên chúng được khai báo Public, nghĩa là chúng có thể được gọi từ bên ngoài modul.

10.1.2.2Tạo Instance cho lớp


  • Ví dụ mẫu - Tạo hoạt hình với đối tượng hộp

  1. Nếu bạn đang mở đề án trong ví dụ trước, chỉ cần nhấn đúp chuột lên biểu mẫu để mở cửa sổ Code. Nếu không, tạo đề án mới kiểu Standard EXE. Từ menu Project, chọn Add Class Module; sau đó, chọn tab Existing trong hộp thoại và chọn clsBox.cls.

  2. Tìm sự kiện Click trong hộp danh sách và đưa đoạn chương trình sau vào:

Dim A_Box As New clsBox

Biến đối tượng A_Box sẽ giữ một Instance của lớp. Từ kháo New rất quan trọng, nếu thiếu nó, VB sẽ cho rằng ta muốn tạo một bản sao của đối tượng clsBox hiện hành. Khi tham chiếu đến nó, ta sẽ gặp lỗi.



  1. Đưa đoạn chương trình sử dụng đối tượng:

Private Sub Form_Click()

Dim A_Box As New clsBox

Dim nIndex As Integer

With A_Box

.Y = 0

.Width = 1000



.Height = 1000

For nIndex = 0 To 1000

.ClearBox Me

.X = nIndex

.DrawBox Me

Next


End With

End Sub


  1. Thi hành chương trình. Nhấn chuột vào biểu mẫu, ta sẽ thấy hộp trượt dọc theo biểu mẫu.
10.1.2.2.1Kiểm tra giá trị thuộc tính

Trong thủ tục thuộc tính Property Let X, nếu ta truyền vào chuỗi ký tự “Hello World”, trình biên dịch sẽ báo lỗi.

Public Property Let X(ByVal vData As Integer)

mvarX = vData

End Property

Tuy nhiên, nếu ta truyền vào số -7983, hộp chắc chắn sẽ không hiển thị trên biểu mẫu. Ta có thể cấm điều nằy bằng cách:

Public Property Let X(ByVal vData As Integer)

if vData >0 Then mvarX = vData

End Property

Đối tượng sẽ bỏ qua giá trị âm truyền vào.

10.1.2.2.2Thuộc tính chỉ được đọc (Read – Only)

Đối với thuộc tính chỉ được đọc, ta không thể thay đổi giá trị thuộc tính. Muốn vậy, ta chỉ cần loại bỏ thủ tục Property Let trong modul lớp.

10.1.3Tham số tuỳ chọn


Ta có thể sử dụng tham số tuỳ chọn trong các phương thức, thậm chí các thủ tục của thuộc tính. Ví dụ, ta có thể thêm tham số màu cho phương thức DrawBox. Khi đó, chỉ với phương thức DrawBox, ta có thể vẽ hoặc xoá hộp mà không cần gọi ClearBox.

    Ví dụ mẫu – Dùng tham số tuỳ chọn

  1. Dừng chương trình. Trong cửa sổ Project Explorer, nhấn đúp chuột lên clsBox để mở cửa sổ Code.

  2. Tìm phương thức ClearBox, đánh dấu khối thủ tục và nhấn phím Delete để xoá nó đi.

  3. Sửa phương thức DrawBox để thêm vào tham số tuỳ chọn màu:

Public Sub DrawBox(Canvas As Object, Optional lColor As Long)

If IsMissing(lColor) Then

Canvas.Line (mvarX, mvarY)-(mvarX + mvarWidth, mvarY + _

mvarHeight),, B

Else

Canvas.Line (mvarX, mvarY)-(mvarX + mvarWidth, mvarY + _



mvarHeight), lColor, B

End If


End Sub

  1. Đến đây, chương trình chưa thể biên dịch, vì vẫn còn một dòng lệnh tham chiếu đến phương thức ClearBox.

.DrawBox Me

Xoá dòng này và thay thế bằng dòng lệnh

.DrawBox Me, Me.BackColor


  1. Thi hành chương trình. Không có thay đổi trong kết quả.

Từ khoá Optional cho biết tham số phía sau nó không nhất thiết phải truyền khi gọi phương thức. Để biết được khi nào có tham số được truyền, ta dùng hàm IsMissing. Hàm này trả về giá trị True/False. Nếu không có tham số truyền, nó trả về True; nếu có, nó trả về False. Tuỳ theo trường hợp mà ta có xử lý tương ứng. Ở đây, khi có tham số truyền, ta gọi hàm Line có chỉ định màu.

Lưu ý rằng tham số tuỳ chọn phải là tham số cuối cùng trong danh sách được truyền. Ví dụ, dòng lệnh sau đây không được chấp nhận:

Public Sub MyRoutine (Optional sName As String, nAge As Integer)

Ta phải sửa thành:

Public Sub MyRoutine (nAge As Integer, Optional sName As String)

Thận trọng:

Mặc dù tham số tuỳ chọn có tính linh hoạt, giúp ta giảm số dòng chương trình, nhưng nó cũng cho ta những rắc rối kèm theo.

Một trong những lý do để chuyển từ lập trình theo cấu trúc sang lập tình hướng đối tượng là làm cho chương tình dễ đọc, dễ hiểu, dễ xây dựng và dễ bảo trì. Tham số tuỳ chọn làm giảm tính an toàn và tăng độ phức tạp của chương trình khi ta cần gỡ rối.

Tham số tuỳ chọn cung cấp tính năng tái sử dụng chương trình, giúp tạo ra các đối tượng hay thành phần đa mục đích nhưng ta phải cẩn thận và tự hỏi: thêm vào thì có lợi ích gì cho thủ tục của ta, hay là chương trình sẽ tốt hơn nếu ta không dùng nó?


10.1.4Sự kiện của lớp


Định nghĩa sự kiện cho lớp đã có trong VB5. Nó vẫn hữu dụng với VB6. Chẳng hạn ta muốn mỗi lần hộp được vẽ trên màn hình, sự kiện Draw gây ra hoạt động cập nhật trên màn hình.

    Ví dụ - Định nghĩa và kích hoạt sự kiện

  1. Định nghĩa sự kiện Draw. Một trong những thông tin cần cập nhật là toạ độ (x,y) của hộp. Mở cửa sổ Code và thêm dòng lệnh sau vào phần General Declarations:

Public Event Draw(X As Integer, Y As Integer)

Tuy nhiên, dòng lệnh này chưa thể hiện lúc nào thì sự kiện được kích hoạt.



  1. Ta muốn sự kiện Draw được sinh ra mỗi khi hộp được vẽ trên biểu mẫu. Tìm phương thức DrawBox và thêm dòng lệnh in đậm vào cuối của phương thức này:

Public Sub DrawBox(Canvas As Object, Optional lColor As Long)

If IsMissing(lColor) Then

Canvas.Line (mvarX, mvarY)-(mvarX + mvarWidth, mvarY + _

mvarHeight),, B

Else

Canvas.Line (mvarX, mvarY)-(mvarX + mvarWidth, mvarY + _



mvarHeight), lColor, B

End If


RaiseEvent Draw(mvarX, mvarY)

End Sub


  1. Tìm thủ tục xử lý sự kiện Click của biểu mẫu. Tìm và xoá dòng lệnh tạo đối tượng A_Box và thêm một dòng vào phần General Declarations:

Private WithEvents A_Box As clsBox

Private Sub Form_Click()

Dim nIndex As Integer

With A_Box

.Y = 0

.Width = 1000



.Height = 1000

For nIndex = 0 To 1000

.DrawBox Me, Me.BackColor

.X = nIndex

.DrawBox Me

Next


End With

End Sub


  1. Thêm một dòng vào sự kiện Form_Load:

Private Sub Form_Load()

Set A_Box = New clsBox

End Sub


  1. Chọn A_Box từ danh sách trong cửa sổ Code. Chọn sự kiện Draw từ danh sách các sự kiện.

  2. Trong sự kiện này, ta dùng lệnh Print để in ra toạ độ của hộp trong cửa sổ gỡ rối (hay còn gọi là cửa sổ Immediate)

Private Sub A_Box_Draw(X As Integer, Y As Integer)

Debug.Print "The box just got drawn at " & X & ", " & Y

End Sub


  1. Thi hành chương trình. Nhấn chuột trên biểu mẫu, ta thấy hộp trượt qua màn hình. Đồng thời trong cửa sổ Immediate, ta thấy các dòng văn bản hiển thị toạ độ hiện hành của hộp.

Ở đây, ta dùng phương thức RaiseEvent để yêu cầu VB phát ra sự kiện Draw, và truyền 2 giá trị của 2 biến thuộc tính mvarXmvarY chứa toạ độ (x, y) của hộp cho sự kiện Draw mới.

Để có thể xử lý các sự kiện của một đối tượng tự tạo, ta cần khai báo đối tượng hơi khác một chút. Trước hết, nó phải được khai báo là Private trong biểu mẫu (hoặc modul), thay vì là Private trong một thủ tục. Sau đó, ta phải dùng từ WithEvents thay vì Dim:

Private WithEvents A_Box As clsBox

Từ khóa WithEvents báo cho VB biết ta đang khai báo một đối tượng có sự kiện, và ta dự định viết chương trình để xử lý những sự kiện này.

Chú ý từ khoá New bị loại bỏ trong dòng lệnh WithEvents. Khi ta viết:

Dim A_Box As New clsBox

Nghĩa là không chỉ thông báo cho VB rằng ta sắp sử dụng một đối tượng dựa theo lớp clsBox, ta còn yêu cầu VB cấp phát vùng nhớ cho đối tượng và tạo nó. Tuy nhiên, do hạn chế của VB, điều này không được thực hiện với từ khoá WithEvents. Thay vào đó, ta phải tạo đối tượng riêng, bằng cách thêm dòng lệnh vào sự kiện Form_Load.

Tóm lại, đối với sự kiện, ta cần nhớ:



  • Khai báo sự kiện dùng Public Event.

  • Phát sự kiện dùng RaiseEvent

  • Tạo đối tượng với Dim WithEvents, không dùng New.

  • Tạo đối tượng như sau:

Set <đối tượng> = New

  • Viết chương trình để bắt sự kiện tương tự xử lý sự kiện của điều khiển.

10.1.5Huỷ đối tượng


Sau khi sử dụng một đối tượng và không cần dừng nữa, ta cần huỷ nó đi. Điều này đặc biệt quan trọng khi ta sử dụng nhiều đối tượng trong ứng dụng. Nếu không huỷ đối tượng, sự hao hụt vùng nhớ sẽ làm giảm khả năng hoạt động của ứng dụng. Ta dùng dòng lệnh sau:

Set <đối tượng> = Nothing

Nơi lý tưởng để huỷ một đối tượng là trong sự kiện Unload của biểu mẫu.

Ví dụ:


Private Sub Form_Unload (Cancel As Integer)

Set A_Box = Nothing

End Sub



tải về 1.69 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   14   15   16   17   18   19   20   21   ...   39




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương