Logo of Vovisoft

Tạo một control đơn giản dùng ActiveX Control Interface Wizard

Tiếp theo bài Làm thế nào để tạo một OCX control trong VB ?

Chúng ta hãy thử tạo một control đơn giản dùng ActiveX control Interface Wizard. Ðây là một wizard giúp chúng ta thiết kế dễ dàng và nhanh chóng. Control mà chúng ta sẽ tạo ra là một ComboBox cải tiến từ ComboBox control có sẵn trong VB ta có thể đặt tên cho nó oai là "SuperComboBox". Control này có đặc tính là khi bạn nhập một hay nhiều ký tự nó sẽ tự động tìm kiếm trong danh sách (list property) item có các ký tự đầu gần giống nhất và hiển thị dùm bạn lên ComboBox.

Thiết kế "Supper ComboBox" control

Bạn hãy làm theo các bước sau:

  1. Tạo ra một project mới thuộc loại ActiveX Control như hình vẽ.

         

    Ðặt tên cho control là "SupperComboBox" và vẽ một ComboBox lên control(giống như đang thiết kế trên form) đặt tên là cboCombo.

  2. Load ActiveX Control Wizard Addin bằng cách Click Add-Ins->Add-Ins Manager...->VB6 ActiveX Ctl Interface Wizard->Loaded như hình vẽ như sau:

         

    Ðây là một Add-Ins giúp ta tạo ra phần lớn code cho các default methods hay properties

  3. Chọn các Default Interface(tức Properties, Methods, Events) cho control bằng cách Click Add-Ins->ActiveX Control Interface Wizard như hình vẽ như sau:

         

    Nếu như bạn sử dụng Add-Ins này lần đầu bạn sẽ thấy một window giải thích cũng như giới thiệu về những gì mà Add-Ins này làm được. Click next sẽ được màn hình giống như trên. Ở bước này bạn chọn những properties, methods hay events(gọi chung là Interface) nào mà bạn cho là cần trong control của mình. Cụ thể trong bài này chúng ta làm một ComboBox cải tiến do đó trước hết nó phải thừa kế hầu hết Interface của một Combo thường. Do đó bạn phải liệt kê và tìm xem có bao nhiêu interface của combo thường mà mình cần rồi chọn vào danh sách bên phải.(Ví dụ như AddItem, ListIndex, List, ListCount, Text, ItemData.....Vì bài này chỉ mang tính hướng dẫn và giúp bạn có một khái niệm tạo một control dễ dàng như thế nào nên bạn không cần phải chọn tất cả interface của ComboBox mà chỉ chọn vài cái tiêu biểu mà thôi.)

  4. Click Next và tạo các Custom Interface cho control như hình vẽ như sau:

         

    Ðây là chỗ cho các bạn thêm các custom interface mà bạn muốn. Ðó là những interface mà control nguyên thủy không có. Cụ thể trong bài này ta tạo thêm một Property tên là "LimitToList". Property này là một Boolean. Khi giá trị của nó là True thì người User chỉ có thể chọn các item trong List property của Combo mà không thể nhập một item mới được.

  5. Click Next và Mapping Interface cho control như hình vẽ như sau:

         

    Trong bước này bạn sẽ map các interface của user control cho các control thành phần. Cụ thể trong bài này là chúng ta sẽ cố gắng map hầu hết các interface của Supper ComboBox cho cboCombo. Nói cho dễ hiểu là khi người user thay đổi giá trị các properties của SupperComboBox thì nó chỉ việc "kêu" cboCombo làm thay(tiếng Anh gọi là Delegate!). Ðể map tất cả interface của SupperComboBox cho cboCombo bạn chỉ việc chọn tất cả(Sellect All) bằng cách chọn interface đầu tiên, giữ phím Shift và chọn interface cuối cùng, sau đó bạn chọn Control cboCombo như hình vẽ

  6. Click Next và Set Attributes cho các Interface không map được ở bước trên như hình vẽ như sau:

         

    Sẽ có một số interface bạn không thể map được vào cboCombo vì interface đó không tồn tại trong cboCombo. Thông thường đó là những Custom interface. Bước này sẽ cho phép ta định nghĩa các custom interface như loại dữ liệu(data type) hay giá trị mặc định(default value) và property có được phép đọc hay viết lúc Run Time hay lúc Design Time. Cụ thể bài này ta chỉ định nghĩa LimitToList property là Boolean và giá trị ban đầu là 0 như hình vẽ. Các properties khác không quan trọng.

  7. Click Next và hoàn tất wizard như hình vẽ như sau:

         

    Nếu bạn chuyển sang phần Code Window bạn sẽ thấy Add-Ins trên đã viết phần lớn code cho chúng ta như thế nào. Bạn có thể cảm thấy "ngán" khi nhìn thấy một "rừng" code mà nó đã tạo ra. Nhưng nếu bạn quan sát kỹ sẽ thấy chúng tương tự như nhau mà thôi. Bây giờ chúng ta sẽ viết code đặt trưng cho SupperComboBox control.

  8. Chuyển sang phần viết code cho control và Copy and Paste đoạn code sau vào sau phần Declare variables

    'True if FindItem is running
    Private bFinding As Boolean 
    'Current cursor position within the text
    Private lPos As Long 
    'Index value of the last item selected
    Private lIndex As Long
    
    Private Sub FindItem() Dim lIdx As Long Dim sText As String Dim lLen As Long Dim bFound As Boolean bFinding = True lPos = cboCombo.SelStart sText = cboCombo.Text lLen = Len(sText) bFound = False For lIdx = 0 To cboCombo.ListCount If StrComp(sText, Left$(cboCombo.List(lIdx), lLen), vbTextCompare) = 0 Then cboCombo.ListIndex = lIdx bFound = True Exit For End If Next lIdx If m_LimitToList And Not bFound Then cboCombo.ListIndex = lIndex If lIndex = -1 Then cboCombo.Text = "" cboCombo.SelStart = lPos - 1 Else cboCombo.SelStart = lPos lIndex = cboCombo.ListIndex End If cboCombo.SelLength = Len(cboCombo.Text) bFinding = False End Sub
    Private Sub cboCombo_Change() If bFinding Then Exit Sub If Len(cboCombo.Text) = 0 Then lPos = 0 lIndex = -1 Else FindItem End If End Sub
    Cốt lõi của SupperComboBox là khi event _Change() xảy ra thì nó sẽ gọi FindItem tìm item nào có ký tự đầu tiên là những chữ mà user nhập vào và đặt sẵn lên Text property của combo Nếu LimitToList True thì nó sẽ không cho user nhập các item không có trong list.

Chạy thử chương trình

Ðể chạy thử chương trình và kiểm tra kết quả bạn cần có một standard Exe project tạo thành một project group như sau Click Files->Add Project->Standard Exe. Double-Click vào Supper ComboBox control nằm trên ToolBox để đặt một ComboBox lên Form của bạn. Sau đó chuyển sang phần viết code cho form và copy and paste đoạn code sau:

Private Sub Form_Load() 
   Dim Index As Long 
   Dim LenIndex As Long 
   Dim lLen As Long 
   Dim sText As String 
   For Index = 1 To 300 
      lLen = Rnd * 10 + 1 
      sText = "" 
      For LenIndex = 1 To lLen 
         sText = sText & Chr$(Rnd * 25 + 65) 
      Next LenIndex 
      SupperComboBox1.AddItem sText 
   Next Index 
End Sub 
Ðoạn code trên sẽ tạo ra 300 item một cách ngẫu nhiên.

Trước khi chạy bạn Right-Click vào Test Project và chọn Set As Start Up. Bây giờ bạn hãy bấm F5 để chạy thử chương trình. Thử nhập vào một vài ký tự trên ComboBox bạn sẽ thấy kết quả như hình vẽ sau:

     

Như vậy bạn đã biết qua làm thế nào để tạo một user control trong VB bằng Wizard. Phạm vi của bài này chỉ hướng dẫn bạn phần thực hành. Phần giải thích chi tiết cũng như đi sâu vào nguyên tắc hoạt động của User Control sẽ được trình bày trong các bài sau.
Bạn có thể download source code của program mẫu nầy
Bạn cũng có thể download SourceCode nguyên thủy và tương đối đầy đủ của nhà xuất bản Wrox tại đây.


  Học Microsoft Visual Basic 6.0