• Thứ Hai, 05/01/2004 11:52 (GMT+7)

    Tạo "đồ nghề gắn thêm" với VB

    Visual Basic cho phép bạn tạo 'đồ nghề gắn thêm' (add-in) bổ sung cho môi trường phát triển. Bài viết này minh họa cách thức tạo add-in để đưa thêm menu tự tạo vào hệ thống menu của VB (xem hình).
    Trước hết bạn tạo một project ActiveX Dll, sau đó thêm module vào. Thứ tự đặt tên như sau:
    Basic Module : AddIn.bas
    Class Module : AddInClass.cls
    Project : AddInProject.vbp

    Tham chiếu tới 2 thư viện sau (chọn Project\References):
    - Microsoft Office 10.0 Object Library (số hiệu phiên bản Office có thể khác)
    - Microsoft Visual Basic 6.0 Extensibility
    Trong AddIn.bas, bạn nhập đoạn mã sau:
    DeclareFunctionWritePrivateProfileString& Lib _
    'kernel32' Alias 'WritePrivateProfileStringA' _
    (ByVal AppName$, ByVal KeyName$, ByVal _
    keydefault$, ByVal FileName$)

    Sub AddToINI()
      
    Dim rc As Long
      
    rc = WritePrivateProfileString('Add-Ins32','AddInProject.AddInClass', '0', 'VBADDIN.INI')
      
    MsgBox 'Da ghi Add-in vao noi dung file VBADDIN.INI '
    End Sub

    Trong AddInClass.cls, bạn nhập đoạn mã sau:
    Implements IDTExtensibility
    Public VBI As VBIDE.VBE
     
    Public mcbMenuCommandBarCtrl As
      Office.CommandBarPopup
      
    Private MenuItem(3) As Object
     
    Private SubMenuItem(2) As Command-
      BarButton
    Public WithEvents MenuHandler As CommandBarEvents
    Sub IDTExtensibility_
     OnConnection(ByVal _
     
    VBInst As Object, ByVal ConnectMode
     As _
     
    VBIDE.vbext_ConnectMode, ByVal AddInInst As _
     
    VBIDE.AddIn, custom() As Variant)

    'Gán môi trường VB hiện hành
    Set VBI = VBInst
    'Thêm một menu mới vào hệ thống vốn có trong môi trường VB (File, Edit...)
    'ONACTION dùng để xác định vị trí chèn menu của bạn vào môi trường VB
    'BeginGroup dùng để tạo 1 vạch chia cắt dạng Separator
    'PasteFace dùng để lấy 1 Icon cho 1 menu Item
    Set mcbMenuCommandBarCtrl = _
    VBI.CommandBars(1).Controls.Add(Type:=msoControlPopup, before:=1, Temporary:=True)
    mcbMenuCommandBarCtrl.Caption ='Khủng long béo Menu'
    'Các MenuItem của menu chính
               
    Set MenuItem(0) = mcbMenuCommandBarCtrl.Controls.Add(Type:=msoControlButton)

                 MenuItem(0).OnAction = 1

                 MenuItem(0).Caption = 'Xin chào các bạn '

                 Set MenuItem(1) = mcbMenuCommandBarCtrl.Controls.Add(Type:=msoControlPopup)

                 MenuItem(1).OnAction = 1

                 MenuItem(1).Caption = 'Bạn có thể chèn menu của mình trong:'

                 MenuItem(1).BeginGroup = True

     

    'Các submenu của MenuItem(2)

         Set SubMenuItem(0) = MenuItem(1).Controls.Add(Type:=msoControlButton)

         SubMenuItem(0).Caption = 'Microsoft Word'

         SubMenuItem(0).OnAction = 1

         Set SubMenuItem(1) = MenuItem(1).Controls.Add(Type:=msoControlButton)

        SubMenuItem(1).Caption = 'Microsoft Excel'

        SubMenuItem(1).OnAction = 1

        Set SubMenuItem(2) = MenuItem(1).Controls.Add(Type:=msoControlButton)

        SubMenuItem(2).Caption = 'Microsoft FrontPage và một số ứng dụng khác'

        SubMenuItem(2).OnAction = 1

        SubMenuItem(2).FaceId = 0

        
    Set MenuItem(2) = mcbMenuCommandBarCtrl.Controls.Add(Type:=msoControlButton)

        MenuItem(2).OnAction = 1

        MenuItem(2).Caption = 'Bạn có thể thử sự kiện nhấn menu ở đây'

        MenuItem(2).BeginGroup = True

        'Liên kết 1 handle cho sự kiện Click của 1 menuitem

        Set MenuHandler = VBI.Events.CommandBarEvents(MenuItem(2))

    End Sub

    'Nếu loại bỏ Add-Ins thì loại bỏ Menu

    Sub IDTExtensibility_OnDisconnection(ByVal RemoveMode As VBIDE.vbext_DisconnectMode, _
    custom() As Variant
              
    mcbMenuCommandBarCtrl.Delete
    End Sub

    Sub IDTExtensibility_OnStartupComplete (custom() As Variant)

    End Sub

    Sub IDTExtensibility_OnAddInsUpdate (custom() As Variant)

    End Sub

    'Thủ tục xử lí cho sự kiện click lên 1 menuitem
    Sub MenuHandler_Click(ByVal CommandBarControl As Object, handled As Boolean, _
    CancelDefault As Boolean)
                MsgBox 'Bạn vừa nhấn vào menu-
    Item có số thứ tự là 4'
    End Sub
    'Kết thúc mã

    Sau khi nhập đoạn mã trên xong, việc kế tiếp là bạn cần đăng kí Add-In này vào hệ thống (Registry). Sau khi biên dịch thành file AddInProject.dll, bạn thực hiện đăng kí dll này bằng chương trình regsvr32.exe (nằm trong thư mục Windows\System32).
    Vào hộp thoại Run và gõ lệnh sau:
          
    regsvr32  <đường_dẫn>\AddInProject.dll
            
    (để gỡ bỏ dll này khỏi registry, bạn thêm tham số  '/u' vào lệnh trên)

    Sau đó, quay lại môi trường thiết kế của AddInProject và nhấn Ctrl+G để hiện cửa sổ Immediate, bạn dòng AddToINI rồi nhấn Enter để đưa vào danh sách Add-Ins chứa trong file VBADDIN.INI. Thoát khỏi chương trình.

    Tiếp theo, bạn tạo 1 project Standard EXE mới, chọn Menu Add-Ins\Add-In Manager, chọn mục AddInProject.AddInClass, đánh dấu chọn Loaded/Unloaded (nếu muốn mỗi lần khởi động VB tự động thêm menu của bạn vào thì chọn thêm Load on Startup).

    Vậy là bạn đã thực hiện xong việc đưa thêm menu tự tạo vào hệ thống menu của VB.

    Nguyễn Hoàng Linh
    khunglongbeo@hotmail.com

     

    ID: A0312_98