• Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)
  • Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)

    ongke0711 > 20-12-19, 03:31 PM

    Chào các bạn,

    Theo nhu cầu thực tế của một số bạn về việc đổi Tên + Icon của một Nút lệnh tuỳ theo hiện trạng xử lý của Form, nên tôi tạo riêng cái chủ đề này để các bạn tham khảo cách làm cũng như dễ dàng tìm kiếm chủ đề sau này.

    ĐỔI TÊN (Caption) + ICON CỦA 1 NÚT LỆNH TUỲ THEO HIỆN TRẠNG XỬ LÝ FORM 
    (Một nút lênh 2 chức năng)

    --------------------------------------------------------------------------------------------------------------------------------------------------------

    Chú ý: chỉ áp dụng cho Access 2007 trở lên. Access 2003 trở về trước chỉ hỗ trợ Nút lệnh (Command button) có hình (icon) hoặc chữ (caption) chứ không hỗ trợ hiển thị vừa Icon vừa chữ trên một nút lênh như Access 2007 trở về sau.

    Việc thay đổi Tên và Icon nút lênh cũng có nhiều cách như: 
    - Tạo thêm một nút khác để ẩn/ hiện khi click gọi tới.
    - Tạo sẳn nút (hoặc Label) phụ khác chỉ để tham chiếu đến Caption của control này.
    - Thay đổi Caption trực tiếp trong code VBA. Cách này gặp hạn chế với các tên tiếng Việt có dấu thanh mà VBA không hiểu như: Sửa, Lưu... Bên cạnh đó cũng không đổi được Icon. Nếu tham chiếu icon đến file ảnh bên ngoài thì lại phải đính kèm file icon khi phân phối ứng dụng, cũng phiền phức.

    Để khắc phục mấy điểm bất tiện trên thì tôi dùng giải pháp là tạo riêng 1 table lưu thông tin "Tên" nút lệnh và Icon cho nó luôn. File icon (ảnh) sẽ được lưu trực tiếp luôn vào Table dưới dạng mã nhị phân (Binary) ở cột có dữ liệu kiểu OLE Object. Vì file iocn có kích thước nhỏ (khoảng 16px x 16px, chừng 500 bytes) nên việc lưu thẳng vào Table cũng không chiếm dung lượng bao nhiêu.

    Để lưu ảnh vào table dưới dạng nhị phân vào Field dạng Long Binary Data, tôi dùng phương thức Field.AppendChunk.


    [Hình: 49246305606_c97fb33060_z.jpg]


    Khi bấm nút lênh, muốn đổi Tên + Icon thì chỉ cần dùng hàm DLookup() để lấy Tên và hình ảnh đưa vào nút lênh.
    Ví dụ: Khi bấm nút [Chỉnh sửa] lần thứ nhất thì nút này sẽ đổi tên thành [Bỏ qua] và đổi luôn Icon

    Mã PHP:
    Private Sub cmdChinhSua_Click()
        Static blnView As Boolean
        Dim intID 
    As Integer
        
        blnView 
    Not blnView
        
    If blnView Then
            intID 
    1  'Nút [Sua]
        Else
            intID = 4  '
    Nút [Bo qua]
        End If
        
        Me
    .cmdChinhSua.PictureData DLookup("IconNutLenh""tblNutLenhIcon""ID = " intID)
        Me.cmdChinhSua.Caption DLookup("TenNutLenh""tblNutLenhIcon""ID = " intID)
        
    End Sub 

    Bên cạnh đó tôi cũng demo cho các bạn cách tận dụng thuộc tính .Tag của các Control để tham chiếu tới trong code, phục vụ một công việc cụ thể nào đó. Trong demo này là dùng Tag để xác định nút lênh đang ở trạng thái nào? Thêm hay Lưu (cùng 1 nút).
    Tag: nó như là đính thêm 1 cái thẻ tên cho một control cụ thể như textbox, command button...Khi code chạy sẽ lật cái thẻ này lên đọc và xác định nó là gì để thực thi code tương ứng vậy thôi.

    Tôi mượn cái file dữ liệu của bạn longkd_bvct@yahoo.com.vn để làm demo nhé.

    Link demo: http://www.mediafire.com/file/mdz05k0tmr...accdb/file

    [Hình: DoiTenNutLenh.gif]

    [Hình: 49246652097_276114e74b_o.png]
  • RE: Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)

    bvchauthanh > 21-12-19, 05:28 PM

    Cám ơn thớt vì bài viết khá hay và hữu ích! Sẵn đây cho mình hỏi, nếu muốn tạo report để in dữ liệu có kiểu OLE Object thì làm thế nào, mong được giúp đỡ, thanks!


    P/s: đơn giản là mình muốn lưu cái logo công ty, trên các biểu mẫu in hiện luôn cái logo đó! Với cách làm như trên, mình đã lưu lại cái logo được rồi, còn việc hiện lên form mình chưa ngâm cứu ra, mong được giúp đỡ từ các tiền bối.
  • RE: Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)

    ongke0711 > 21-12-19, 06:13 PM

    (21-12-19, 05:28 PM)bvchauthanh Đã viết: P/s: đơn giản là mình muốn lưu cái logo công ty, trên các biểu mẫu in hiện luôn cái logo đó! Với cách làm như trên, mình đã lưu lại cái logo được rồi, còn việc hiện lên form mình chưa ngâm cứu ra, mong được giúp đỡ từ các tiền bối.

    Nếu bạn đã lưu file Logo vào table dưới dạng Binary (cột OLE Object) thì trong từng Report, bạn vẫn phải thiết kế 1 cái Image control trên nó và khi Report Open sẽ Dlookup cái file Logo đó từ table.
    Vd:
    Bạn có thể viết cái Sub để Load Logo vào Image control trên Report
    ----------------------------------------------------------------

    Public Sub LoadLogo(ctlLogo As Image)

        ctlLogo.PictureData = DLookup("ImageData", "tblLuuHinh", "ID =1")
    End Sub

    Private Report_Open()
        LoadLogo Me.imgLogo
    End Sub

    ----------------------------------------------------------------

    Trong code trên:
    - ctlLogo: là Name của cái Image Control trên Report của bạn.
    - ID=1: số 1 là dòng bạn lưu hình Logo trong table tblLuuHinh trong đó [ImageData] là cột OLE object lưu file ảnh
  • RE: Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)

    mrsiro > 21-12-19, 08:31 PM

    bạn ongke làm bên y tế à.
  • RE: Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)

    bvchauthanh > 22-12-19, 01:27 PM

    một lần nữa xin cám ơn bạn nhé! Mình làm được rồi, có điều khi in ra chất lượng ảnh ko được đẹp lắm, hjhj dù sao đi nữa mình cũng học được thứ mình cần, tks nhiều nhá!
  • RE: Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)

    ongke0711 > 22-12-19, 02:29 PM

    (22-12-19, 01:27 PM)bvchauthanh Đã viết: một lần nữa xin cám ơn bạn nhé! Mình làm được rồi, có điều khi in ra chất lượng ảnh ko được đẹp lắm, hjhj dù sao đi nữa mình cũng học được thứ mình cần, tks nhiều nhá!

    Chất lượng file logo tùy thuộc file ảnh của bạn. Bạn nâng độ phân giải  ảnh cỡ 256 x 256 px trở lên là được rồi.
  • RE: Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)

    ongke0711 > 22-12-19, 07:00 PM

    (21-12-19, 08:31 PM)mrsiro Đã viết: bạn ongke làm bên y tế à.

    007  Không bạn. Tôi kinh doanh hàng tiêu dùng. Cái demo là mượn của một bạn khác trên diễn đàn.
  • RE: Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)

    yamakashi2003 > 05-05-20, 03:41 PM

    (20-12-19, 03:31 PM)ongke0711 Đã viết: Chào các bạn,

    Theo nhu cầu thực tế của một số bạn về việc đổi Tên + Icon của một Nút lệnh tuỳ theo hiện trạng xử lý của Form, nên tôi tạo riêng cái chủ đề này để các bạn tham khảo cách làm cũng như dễ dàng tìm kiếm chủ đề sau này.

    ĐỔI TÊN (Caption) + ICON CỦA 1 NÚT LỆNH TUỲ THEO HIỆN TRẠNG XỬ LÝ FORM 
    (Một nút lênh 2 chức năng)

    --------------------------------------------------------------------------------------------------------------------------------------------------------

    Chú ý: chỉ áp dụng cho Access 2007 trở lên. Access 2003 trở về trước chỉ hỗ trợ Nút lệnh (Command button) có hình (icon) hoặc chữ (caption) chứ không hỗ trợ hiển thị vừa Icon vừa chữ trên một nút lênh như Access 2007 trở về sau.

    Việc thay đổi Tên và Icon nút lênh cũng có nhiều cách như: 
    - Tạo thêm một nút khác để ẩn/ hiện khi click gọi tới.
    - Tạo sẳn nút (hoặc Label) phụ khác chỉ để tham chiếu đến Caption của control này.
    - Thay đổi Caption trực tiếp trong code VBA. Cách này gặp hạn chế với các tên tiếng Việt có dấu thanh mà VBA không hiểu như: Sửa, Lưu... Bên cạnh đó cũng không đổi được Icon. Nếu tham chiếu icon đến file ảnh bên ngoài thì lại phải đính kèm file icon khi phân phối ứng dụng, cũng phiền phức.

    Để khắc phục mấy điểm bất tiện trên thì tôi dùng giải pháp là tạo riêng 1 table lưu thông tin "Tên" nút lệnh và Icon cho nó luôn. File icon (ảnh) sẽ được lưu trực tiếp luôn vào Table dưới dạng mã nhị phân (Binary) ở cột có dữ liệu kiểu OLE Object. Vì file iocn có kích thước nhỏ (khoảng 16px x 16px, chừng 500 bytes) nên việc lưu thẳng vào Table cũng không chiếm dung lượng bao nhiêu.

    Để lưu ảnh vào table dưới dạng nhị phân vào Field dạng Long Binary Data, tôi dùng phương thức Field.AppendChunk.


    [Hình: 49246305606_c97fb33060_z.jpg]


    Khi bấm nút lênh, muốn đổi Tên + Icon thì chỉ cần dùng hàm DLookup() để lấy Tên và hình ảnh đưa vào nút lênh.
    Ví dụ: Khi bấm nút [Chỉnh sửa] lần thứ nhất thì nút này sẽ đổi tên thành [Bỏ qua] và đổi luôn Icon

    Mã PHP:
    Private Sub cmdChinhSua_Click()
        Static blnView As Boolean
        Dim intID 
    As Integer
        
        blnView 
    Not blnView
        
    If blnView Then
            intID 
    1  'Nút [Sua]
        Else
            intID = 4  '
    Nút [Bo qua]
        End If
        
        Me
    .cmdChinhSua.PictureData DLookup("IconNutLenh""tblNutLenhIcon""ID = " intID)
        Me.cmdChinhSua.Caption DLookup("TenNutLenh""tblNutLenhIcon""ID = " intID)
        
    End Sub 

    Bên cạnh đó tôi cũng demo cho các bạn cách tận dụng thuộc tính .Tag của các Control để tham chiếu tới trong code, phục vụ một công việc cụ thể nào đó. Trong demo này là dùng Tag để xác định nút lênh đang ở trạng thái nào? Thêm hay Lưu (cùng 1 nút).
    Tag: nó như là đính thêm 1 cái thẻ tên cho một control cụ thể như textbox, command button...Khi code chạy sẽ lật cái thẻ này lên đọc và xác định nó là gì để thực thi code tương ứng vậy thôi.

    Tôi mượn cái file dữ liệu của bạn longkd_bvct@yahoo.com.vn để làm demo nhé.

    Link demo: http://www.mediafire.com/file/mdz05k0tmr...accdb/file

    [Hình: DoiTenNutLenh.gif]

    [Hình: 49246652097_276114e74b_o.png]
    Em chào bác ạ,
    Bác có thể chỉ rõ cách làm "Để lưu ảnh vào table dưới dạng nhị phân vào Field dạng Long Binary Data,  dùng phương thức Field.AppendChunk." 
    giúp em đươc không ạ,
    em xin cảm ơn
  • RE: Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)

    ongke0711 > 05-05-20, 04:39 PM

    (05-05-20, 03:41 PM)yamakashi2003 Đã viết: Bác có thể chỉ rõ cách làm "Để lưu ảnh vào table dưới dạng nhị phân vào Field dạng Long Binary Data,  dùng phương thức Field.AppendChunk." 
    giúp em đươc không ạ,

    Trong file demo ở trên đã có code dùng Append Chunk để lưu file ảnh (icon) vào table rồi đó bạn.

    Trích dẫn:File icon (ảnh) sẽ được lưu trực tiếp luôn vào Table dưới dạng mã nhị phân (Binary) ở cột có dữ liệu kiểu OLE Object. Vì file iocn có kích thước nhỏ (khoảng 16px x 16px, chừng 500 bytes) nên việc lưu thẳng vào Table cũng không chiếm dung lượng bao nhiêu.

    Để lưu ảnh thì field phải là kiểu OLE Object (có thể lưu bất kỳ file gì như Excel, chart, text, pdf v.v..). Bạn đọc lại cơ bản các kiểu dữ liệu trong Table nhé.
    - File ảnh Bitmap thì Access sẽ lưu vào Table dưới dạng chuỗi nhị phân (Long Binarry).
    - Trên Form Access, có một control là Image control mà các bạn hay dùng để hiển thị ảnh. Image control có thuộc tính ".PictureData" thì cái PictureData này chính là dữ liệu được chuyển sang Binary của bức ảnh.
    - Tôi chỉ việc copy cái PictureData này lưu vào một Field OLE Object nào đó là coi như copy cái bức ảnh đó rồi.
    - Để lưu dữ liệu dạng Binary thì trong thư viện DAO có phương thức AppendChunk, GetChunk lưu và lấy dữ liệu dạng binary. Do đó trong file tôi có câu lệnh:

    rst.Fields("IconNutLenh").AppendChunk Me.imgIcon.PictureData  -> lấy dữ liệu binary cái hình đang trong imgIcon lưu xuống Table.
  • RE: Đổi Tên + Icon + Chức năng của 1 Nút lênh (Command Button)

    yamakashi2003 > 06-05-20, 11:31 AM

    (05-05-20, 04:39 PM)ongke0711 Đã viết:
    (05-05-20, 03:41 PM)yamakashi2003 Đã viết: Bác có thể chỉ rõ cách làm "Để lưu ảnh vào table dưới dạng nhị phân vào Field dạng Long Binary Data,  dùng phương thức Field.AppendChunk." 
    giúp em đươc không ạ,

    Trong file demo ở trên đã có code dùng Append Chunk để lưu file ảnh (icon) vào table rồi đó bạn.

    Trích dẫn:File icon (ảnh) sẽ được lưu trực tiếp luôn vào Table dưới dạng mã nhị phân (Binary) ở cột có dữ liệu kiểu OLE Object. Vì file iocn có kích thước nhỏ (khoảng 16px x 16px, chừng 500 bytes) nên việc lưu thẳng vào Table cũng không chiếm dung lượng bao nhiêu.

    Để lưu ảnh thì field phải là kiểu OLE Object (có thể lưu bất kỳ file gì như Excel, chart, text, pdf v.v..). Bạn đọc lại cơ bản các kiểu dữ liệu trong Table nhé.
    - File ảnh Bitmap thì Access sẽ lưu vào Table dưới dạng chuỗi nhị phân (Long Binarry).
    - Trên Form Access, có một control là Image control mà các bạn hay dùng để hiển thị ảnh. Image control có thuộc tính ".PictureData" thì cái PictureData này chính là dữ liệu được chuyển sang Binary của bức ảnh.
    - Tôi chỉ việc copy cái PictureData này lưu vào một Field OLE Object nào đó là coi như copy cái bức ảnh đó rồi.
    - Để lưu dữ liệu dạng Binary thì trong thư viện DAO có phương thức AppendChunk, GetChunk lưu và lấy dữ liệu dạng binary. Do đó trong file tôi có câu lệnh:

    rst.Fields("IconNutLenh").AppendChunk Me.imgIcon.PictureData  -> lấy dữ liệu binary cái hình đang trong imgIcon lưu xuống Table.
    Em cám ơn bác, Bác cho em hỏi trong đoan code
    .....
    With rst
                If .EOF And .BOF Then Exit Sub
                .Edit
                .Fields("TenNutLenh") = Me.txtTenNutLenh
                .Fields("IconNutLenh").AppendChunk Me.imgIcon.PictureData
                .Update
                .Close
            End With
    ......
     câu : If .EOF And .BOF Then Exit Sub này có nghĩa gì ạ
    Em xin cảm ơn