Xin chào mọi người trên 4r. Em có làm 1 form và khi di chuột vào botton trên form sẽ hiện thông tin ( Kiểu như comment trên cell vậy), Hiện tại em dang dùng Controltiptext nhưng có vấn đề là kiểu hiển thị này chỉ hiển thị trên 1 dòng, nếu thông tin dai thì sẽ rất khó xem, Mọi người chỉ em cách để hiển thị dưới dạng hình vuuông như comment trên cell được không ah
Xin chào mọi người trên 4r. Em có làm 1 form và khi di chuột vào botton trên form sẽ hiện thông tin ( Kiểu như comment trên cell vậy), Hiện tại em dang dùng Controltiptext nhưng có vấn đề là kiểu hiển thị này chỉ hiển thị trên 1 dòng, nếu thông tin dai thì sẽ rất khó xem, Mọi người chỉ em cách để hiển thị dưới dạng hình vuuông như comment trên cell được không ah
Cảm ơn anh đã hướng dẫn, nhưng có cách khác không ạ, bởi vì file của em có tất cả 26 botton và mỗi botton lịa tương ứng với ghi chú ở 1 cell nhất định, nếu dùng label thì phẩi thêm nhiều Label lắm.
File e gửi 4r là file ví dụ ạ
Cảm ơn anh đã hướng dẫn, nhưng có cách khác không ạ, bởi vì file của em có tất cả 26 botton và mỗi botton lịa tương ứng với ghi chú ở 1 cell nhất định, nếu dùng label thì phẩi thêm nhiều Label lắm.
File e gửi 4r là file ví dụ ạ
Thì cũng chỉ cần dùng một cái Label đó thôi chứ làm gì phải dùng đến 26 cái luôn dữ vậy?!
Với bài này, tôi nghĩ là nếu biết dùng đến ClassModule thì code sẽ gọn gàng, tiếc là tôi mù tịt món này.
Ý tưởng là: Đặt tên các CommandButton theo thứ tự, chẳng hạn Cmd1, Cmd2,..., tương ứng với các ô chứa thông tin Z1, Z2,... Sau đó dựa vào số thứ tự trong tên CommandButton để xác định địa chỉ ô chứa thông tin. Hoặc nếu không thể bố trí tương ứng thứ tự tên như vậy thì có thể sử dụng câu lệnh Select Case để quyết định lấy thông tin từ ô nào đưa vào Label1. Hoặc cũng có thể đưa địa chỉ ô chứa thông tin vào thuộc tính Tag của mỗi CommandButton này rồi dựa vào thuộc tính này để lấy thông tin.
Hi, e không rành về vụ này lắm, CommandButton và cell theo thứ tự tăng dấn từ 1 đến 26, anh có thể sửa lại code giúp e, hoặc giải thích kỹ hơn đc k, vì e chưa hiểu cách lấy dữ liệu vào Label1 như thế nào khi chuột chỉ và CommandButton thay đỏi
Thì cũng chỉ cần dùng một cái Label đó thôi chứ làm gì phải dùng đến 26 cái luôn dữ vậy?!
Với bài này, tôi nghĩ là nếu biết dùng đến ClassModule thì code sẽ gọn gàng, tiếc là tôi mù tịt món này.
Ý tưởng là: Đặt tên các CommandButton theo thứ tự, chẳng hạn Cmd1, Cmd2,..., tương ứng với các ô chứa thông tin Z1, Z2,... Sau đó dựa vào số thứ tự trong tên CommandButton để xác định địa chỉ ô chứa thông tin. Hoặc nếu không thể bố trí tương ứng thứ tự tên như vậy thì có thể sử dụng câu lệnh Select Case để quyết định lấy thông tin từ ô nào đưa vào Label1. Hoặc cũng có thể đưa địa chỉ ô chứa thông tin vào thuộc tính Tag của mỗi CommandButton này rồi dựa vào thuộc tính này để lấy thông tin.
Em thử test vào file của e thì có vấn đề như sau:
1. Vì độ dài ngắn ghi chú khác nhau dẫn đến Label hiển thị bị thay dổi rất xấu.
2. Label bị Button che khuất
3. Label không hiện thị ngay tại vị trí Button chỉ mouse
Thì cũng chỉ cần dùng một cái Label đó thôi chứ làm gì phải dùng đến 26 cái luôn dữ vậy?!
Với bài này, tôi nghĩ là nếu biết dùng đến ClassModule thì code sẽ gọn gàng, tiếc là tôi mù tịt món này.
Ý tưởng là: Đặt tên các CommandButton theo thứ tự, chẳng hạn Cmd1, Cmd2,..., tương ứng với các ô chứa thông tin Z1, Z2,... Sau đó dựa vào số thứ tự trong tên CommandButton để xác định địa chỉ ô chứa thông tin. Hoặc nếu không thể bố trí tương ứng thứ tự tên như vậy thì có thể sử dụng câu lệnh Select Case để quyết định lấy thông tin từ ô nào đưa vào Label1. Hoặc cũng có thể đưa địa chỉ ô chứa thông tin vào thuộc tính Tag của mỗi CommandButton này rồi dựa vào thuộc tính này để lấy thông tin.
Cảm ơn bạn, đúng cài mình cần, cho mình hỏi thêm là có thể Fix kích thước của Label khi hiển thị không nhỉ, Còn vụ Label hiển thị bị Button che khuất nũa bạn
Nếu không biết dùng ClassModule thì nó là như vậy, còn nếu biết dùng thì tất cả gom lại thành 1 sự kiện được khai báo trong ClassModule. Thú thật là nãy giờ tôi nghiên cứu topic này mà chưa "làm ăn" được gì với nó cả: Dùng Class Module để tạo sự kiện người dùng (như trên tôi đã nói là tôi mù tịt món này).
Em thử test vào file của e thì có vấn đề như sau:
1. Vì độ dài ngắn ghi chú khác nhau dẫn đến Label hiển thị bị thay dổi rất xấu.
2. Label bị Button che khuất
3. Label không hiện thị ngay tại vị trí Button chỉ mouse
1. Bạn nới rộng kích thước Label thêm cho phù hợp là được.
2. Bạn thêm câu lệnh .ZOrder vào trong câu lệnh With LblTip là được.
3. Không hiện ngay đó là do tôi đặt .Left = X + 50 : .Top = Y. Bạn chỉnh 2 câu lệnh này cho phù hợp là được.
Xin chào mọi người trên 4r. Em có làm 1 form và khi di chuột vào botton trên form sẽ hiện thông tin ( Kiểu như comment trên cell vậy), Hiện tại em dang dùng Controltiptext nhưng có vấn đề là kiểu hiển thị này chỉ hiển thị trên 1 dòng, nếu thông tin dai thì sẽ rất khó xem, Mọi người chỉ em cách để hiển thị dưới dạng hình vuuông như comment trên cell được không ah
Thiệt tình thì em không đủ trình để hiểu code trong file, nhưng mà em tải file về, mở Form lên, di chuyển chuột khắp nơi mà không thấy động tĩnh gì cả. Nhờ bác chỉ giúp cách khắc phục.
Cảm ơn bác!
à các anh cho e hỏi thêm chút, liệu có thể cho hiện ảnh thay vì chữ được không nhỉ ( trên cell là đường dẫn ảnh để tự load, hoặc chèn ảnh vào cell rùi load lên => Cái này e làm được, nên nếu được thì hướng dẫn em phần load lên trên form)
Thiệt tình thì em không đủ trình để hiểu code trong file, nhưng mà em tải file về, mở Form lên, di chuyển chuột khắp nơi mà không thấy động tĩnh gì cả. Nhờ bác chỉ giúp cách khắc phục.
Cảm ơn bác!
Không phải.
Nói nôm na thì như thế này. ToolTop có thể tạo bằng nhiều cách. Trước tiên phải tạo một cửa sổ và nó sẽ quản lý các tool. Những tool này phải thêm vào tập các tool quản lý bởi cái cửa sổ kia. Có nhiều cách tạo tool. Tôi dùng cách như sau:
Nếu trong vùng client area của một cửa sổ nào đó ta muốn hiển thị tooltip thì ta cho thuộc tính hWnd của cấu trúc tagTOOLINFOW = handle của cửa sổ đó. Tiếp theo ta thiết lập thuộc tính rc của cấu trúc trên = vùng hình chữ nhật trong client area (thiết lập tọa độ (x, y) của góc trái bên trên và góc phải bên dưới) của cửa sổ có handle là hWnd. Và thiết lập thuộc tính lpszText = text cần hiển thị. Sau đó ta thêm tool có các thuộc tính như thế vào tập tool quản lý bởi cửa sổ tạo ban đầu. Do có 3 thông tin là hWnd, rc và lpszText nên "người quản lý" tool biết là khi trỏ chuột "đi vào" vùng có tọa độ được xác định bởi rc trong cửa sổ có handle là hWnd thì nó phải hiển thị tooltip có text = lpszText. Và khi trỏ chuột "đi ra khỏi" vùng rc thì nó phải "tắt" tooltip.
Nếu ta cần hiển thị những text khác nhau khi trỏ chuột đi vào những vùng khác nhau trong client area của cửa sổ có handle là hWnd thì với mỗi vùng ta tạo và thêm 1 tool với rc (xác định vùng hình chữ nhật) và lpszText (text cần hiển thị) khác nhau.
UserForm có class là "ThunderDFrame" (Office >= 2000). Vùng client area lại có một cửa sổ con (con của cửa sổ "ThunderDFrame") và trên nó các CommandButton, ComboBox, Image được vẽ. Ta phải thiết lập handle của cửa sổ con này cho thuộc tính hWnd kể trên.
Tôi kiểm tra trên XP Home Edition và Excel 2007 thì cửa sổ con có class là "F3 Server 60000000"
Tôi cũng đã kiểm tra trên Excel 2007 nhưng Windows 7 Starter thì cửa sỗ con không có class là "F3 Server 60000000". Vì thế không tìm thấy cửa sổ con nếu ta tìm theo class "F3 Server 60000000". Kết quả là tool của ta không có giá trị.
Tôi kiểm tra thì với Excel 2007 + Windows 7 Starter thì cửa sổ con có class là "F3 Server 6a070000"
Nếu tìm cửa sổ con có class như thế thì tooltip hiển thị bình thường.
------------
Tôi sửa code: trước tiên tìm cửa sổ con có class là "F3 Server 60000000", nếu không tìm thấy thì tìm cửa sổ con có class là "F3 Server 6a070000"
Chỉ có một nỗi lo là class của cửa sổ con thay đổi liên tục thì rách việc quá. Lúc đó có lẽ không tìm theo class mà tìm "con đầu lòng" chăng?
Tôi đã gửi lại tập tin ở bài #11. Bạn và bạn nghiaphuc kiểm tra và thông báo cho tôi nhé.
Không phải.
Nói nôm na thì như thế này. ToolTop có thể tạo bằng nhiều cách. Trước tiên phải tạo một cửa sổ và nó sẽ quản lý các tool. Những tool này phải thêm vào tập các tool quản lý bởi cái cửa sổ kia. Có nhiều cách tạo tool. Tôi dùng cách như sau:
Nếu trong vùng client area của một cửa sổ nào đó ta muốn hiển thị tooltip thì ta cho thuộc tính hWnd của cấu trúc tagTOOLINFOW = handle của cửa sổ đó. Tiếp theo ta thiết lập thuộc tính rc của cấu trúc trên = vùng hình chữ nhật trong client area (thiết lập tọa độ (x, y) của góc trái bên trên và góc phải bên dưới) của cửa sổ có handle là hWnd. Và thiết lập thuộc tính lpszText = text cần hiển thị. Sau đó ta thêm tool có các thuộc tính như thế vào tập tool quản lý bởi cửa sổ tạo ban đầu. Do có 3 thông tin là hWnd, rc và lpszText nên "người quản lý" tool biết là khi trỏ chuột "đi vào" vùng có tọa độ được xác định bởi rc trong cửa sổ có handle là hWnd thì nó phải hiển thị tooltip có text = lpszText. Và khi trỏ chuột "đi ra khỏi" vùng rc thì nó phải "tắt" tooltip.
Nếu ta cần hiển thị những text khác nhau khi trỏ chuột đi vào những vùng khác nhau trong client area của cửa sổ có handle là hWnd thì với mỗi vùng ta tạo và thêm 1 tool với rc (xác định vùng hình chữ nhật) và lpszText (text cần hiển thị) khác nhau.
UserForm có class là "ThunderDFrame" (Office >= 2000). Vùng client area lại có một cửa sổ con (con của cửa sổ "ThunderDFrame") và trên nó các CommandButton, ComboBox, Image được vẽ. Ta phải thiết lập handle của cửa sổ con này cho thuộc tính hWnd kể trên.
Tôi kiểm tra trên XP Home Edition và Excel 2007 thì cửa sổ con có class là "F3 Server 60000000"
Tôi cũng đã kiểm tra trên Excel 2007 nhưng Windows 7 Starter thì cửa sỗ con không có class là "F3 Server 60000000". Vì thế không tìm thấy cửa sổ con nếu ta tìm theo class "F3 Server 60000000". Kết quả là tool của ta không có giá trị.
Tôi kiểm tra thì với Excel 2007 + Windows 7 Starter thì cửa sổ con có class là "F3 Server 6a070000"
Nếu tìm cửa sổ con có class như thế thì tooltip hiển thị bình thường.
------------
Tôi sửa code: trước tiên tìm cửa sổ con có class là "F3 Server 60000000", nếu không tìm thấy thì tìm cửa sổ con có class là "F3 Server 6a070000"
Chỉ có một nỗi lo là class của cửa sổ con thay đổi liên tục thì rách việc quá. Lúc đó có lẽ không tìm theo class mà tìm "con đầu lòng" chăng?
Tôi đã gửi lại tập tin ở bài #11. Bạn và bạn nghiaphuc kiểm tra và thông báo cho tôi nhé.
Lúc chiều em mở tập tin trước ở trên trường, xài Win XP và Excel 2010 thì chạy file lúc trước bình thường. Còn máy của em xài Win 7, Excel 2010 (cả 2 máy ở trường và ở nhà đều xài bản 32 bit) thì cả file trước và file này đều không thấy động tĩnh gì cả. Như vậy thì có lẽ là vấn đề ở chỗ "class của cửa sổ con" trong trường hợp này không phải là 2 giá trị "F3 Server 60000000" hay "F3 Server 6a070000".
Vậy làm cách nào để biết được giá trị này trong từng trường hợp cụ thể vậy bác?
Lúc chiều em mở tập tin trước ở trên trường, xài Win XP và Excel 2010 thì chạy file lúc trước bình thường. Còn máy của em xài Win 7, Excel 2010 (cả 2 máy ở trường và ở nhà đều xài bản 32 bit) thì cả file trước và file này đều không thấy động tĩnh gì cả. Như vậy thì có lẽ là vấn đề ở chỗ "class của cửa sổ con" trong trường hợp này không phải là 2 giá trị "F3 Server 60000000" hay "F3 Server 6a070000".
Vậy làm cách nào để biết được giá trị này trong từng trường hợp cụ thể vậy bác?
Dạ, cảm ơn bác, em gửi bài rồi mới đọc được bài #20. Em kiểm tra thì nó ra giá trị là "F3 Server 50140000". Em đã sửa lại và chạy được rồi, rất đẹp.
Xin cảm ơn bác nhiều!
Dạ cảm ơn Bác con dùng Win7 Ofice 2010 Bác ạ!
Vâng bác xem đoạn video chậm hơn nhé!
[video=youtube;IBXiLsy1aDs]https://www.youtube.com/watch?v=IBXiLsy1aDs&feature=youtu.be[/video]
Còn mấy bước trên để thực hiện con chưa hiểu lắm, con sẽ từ từ thực hiện như Bác hướng dẫn rồi thông tin lại cho Bác biết.
--------------
Nếu có bạn nào rành thì test giúp mình mà cách Bác Siwtom đã chỉ nhé!
Xin Cảm ơn!
Dạ, cảm ơn bác, em gửi bài rồi mới đọc được bài #20. Em kiểm tra thì nó ra giá trị là "F3 Server 50140000". Em đã sửa lại và chạy được rồi, rất đẹp.
Xin cảm ơn bác nhiều!
Bạn phải chạy file ReadClass.exe rồi mới rê chuột vào Form này, trong cửa sổ của ReadClass.exe sẽ hiện ra chuỗi này ở dòng thứ 2. Bạn gõ lại chuỗi này vào câu lệnh hChild = FindWindowEx(hForm, 0, "F3 Server 60000000", vbNullString), sẽ chạy được.
Bác siwtom ơi, vấn đề có vẻ như rắc rối rồi. Mỗi lần mở file ra, nó phát sinh một chuỗi khác nhau, vậy thì phải làm sao?
Lại gửi chậm nữa rồi! File mới #25 đã tốt rồi. Cảm ơn bác.
Bạn phải chạy file ReadClass.exe rồi mới rê chuột vào Form này, trong cửa sổ của ReadClass.exe sẽ hiện ra chuỗi này ở dòng thứ 2. Bạn gõ lại chuỗi này vào câu lệnh hChild = FindWindowEx(hForm, 0, "F3 Server 60000000", vbNullString), sẽ chạy được.
Bác siwtom ơi, vấn đề có vẻ như rắc rối rồi. Mỗi lần mở file ra, nó phát sinh một chuỗi khác nhau, vậy thì phải làm sao?
Có lẽ máy bạn xài Win XP nên file ở bài #11 (file ban đầu) đã có thể chạy bình thường rồi. Bạn thử chạy trên Win 7 xem nào, tôi tin là file ở bài #11 sẽ có thể chẳng có động tĩnh gì cả. Còn file ở bài #25 thì đã khắc phục được vấn đề này (thuật toán có hơi khác một chút so với file ở bài #11).
Còn vấn đề bạn hỏi, có lẽ phải chờ đến các cao thủ ra tay thôi, tôi thì chịu chết.
Trên cái Page, rê con trỏ qua nút lệnh trên page1, nó có tooltip, song chọn vào page2 rồi quay lại page1, rê con trỏ qua nút lệnh, nó không có tooltip. Thầy xem lại thử xem.
Trên cái Page, rê con trỏ qua nút lệnh trên page1, nó có tooltip, song chọn vào page2 rồi quay lại page1, rê con trỏ qua nút lệnh, nó không có tooltip. Thầy xem lại thử xem.
Trên cái Page, rê con trỏ qua nút lệnh trên page1, nó có tooltip, song chọn vào page2 rồi quay lại page1, rê con trỏ qua nút lệnh, nó không có tooltip. Thầy xem lại thử xem.
Ở điểm 3 bài #43 tôi có nói: "Code bổ sung để hiển thị cho cả ListBox, Frame"
Không phải vô cớ mà tôi không liệt kê MultiPage. Cũng có thể hiện được tooltip cho MultiPage nhưng chỉ khi trỏ chuột vào Page đang Active khi hiển thị Form. Khi chuyển sang Page khác rồi quay lại thì không còn tooltip nữa. ToolTip đặt trên Page cũng bị bệnh tương tự. Nguyên nhân là cửa sổ tạo ra cho mỗi Page (là cửa sổ con của MultiPage. MultiPage cũng là cửa sổ riêng biệt) được tạo ra một cách dynamic. Khi chuyển sang Page khác thì cửa sổ bị hủy và khi trở lại thì cửa sổ lại được tạo mới với Handle khác hẳn.
Vì nguyên nhân trên tôi không làm được cho Page.
Nếu cố tình làm thì phải bắt sự kiện "đổi Page" để làm cho Page vừa Active. Nhưng tôi không muốn làm. Bạn thử xem. Cũng chỉ là bắt sự kiện "đổi Page" và gọi AddTool cho CommandButton4 thôi mà. Đây là trường hợp riêng, mà code là tổng quát nên tôi không làm. Ai đó khi cần thì bắt sự kiện "đổi Page" và gọi AddTool. Cũng vì lẽ đó mà tôi tách AddTool ra riêng để lúc nào cần thì gọi.
Ở điểm 3 bài #43 tôi có nói: "Code bổ sung để hiển thị cho cả ListBox, Frame"
Không phải vô cớ mà tôi không liệt kê MultiPage. Cũng có thể hiện được tooltip cho MultiPage nhưng chỉ khi trỏ chuột vào Page đang Active khi hiển thị Form. Khi chuyển sang Page khác rồi quay lại thì không còn tooltip nữa. ToolTip đặt trên Page cũng bị bệnh tương tự. Nguyên nhân là cửa sổ tạo ra cho mỗi Page (là cửa sổ con của MultiPage. MultiPage cũng là cửa sổ riêng biệt) được tạo ra một cách dynamic. Khi chuyển sang Page khác thì cửa sổ bị hủy và khi trở lại thì cửa sổ lại được tạo mới với Handle khác hẳn.
Vì nguyên nhân trên tôi không làm được cho Page.
Nếu cố tình làm thì phải bắt sự kiện "đổi Page" để làm cho Page vừa Active. Nhưng tôi không muốn làm. Bạn thử xem. Cũng chỉ là bắt sự kiện "đổi Page" và gọi AddTool cho CommandButton4 thôi mà. Đây là trường hợp riêng, mà code là tổng quát nên tôi không làm. Ai đó khi cần thì bắt sự kiện "đổi Page" và gọi AddTool. Cũng vì lẽ đó mà tôi tách AddTool ra riêng để lúc nào cần thì gọi.
Không thấy bạn Hoàng Trọng Nghĩa viết code gì nên tôiviết thêm.
1. Code chính có sửa chút để không SetFocus những Page không là active, đang ẩn.
2. Khi có MultiPage mà muốn có tooltip cho các control trên nó thì thêm code MultiPage1_Change mà tôi đã viết trong code của UserForm trong tập tin ví dụ. Cũng có thể sửa để chỉ gọi AddTool cho những control nằm trên Page đang active. Gọi cho tất cả cũng được nhưng code AddTool sẽ chỉ thêm tool cho những control nằm trên Page active.
3. Các control chắc chắn có quyền có tooltip là: ListBox, Frame, CommandButton, ComboBox, Image. Mọi người tự thử cho những standard control khác.
----------
Có 1 lỗi nhỏ.
Các tooltip không hiển thị icon và tiêu đề "Balloon tip của siwtom"
Nguyên nhân? Tôi thêm một số control và thêm cho chúng text hiển thị ở Sheet1. Vì thế text tiêu đề trước đó đang ở dòng 11 bị đẩy xuống dòng 14 (do tôi thêm dòng trống để nhập text cho các control). Tôi quên không sửa trong code ví dụ.
Không thấy bạn Hoàng Trọng Nghĩa viết code gì nên tôiviết thêm.
1. Code chính có sửa chút để không SetFocus những Page không là active, đang ẩn.
2. Khi có MultiPage mà muốn có tooltip cho các control trên nó thì thêm code MultiPage1_Change mà tôi đã viết trong code của UserForm trong tập tin ví dụ. Cũng có thể sửa để chỉ gọi AddTool cho những control nằm trên Page đang active. Gọi cho tất cả cũng được nhưng code AddTool sẽ chỉ thêm tool cho những control nằm trên Page active.
3. Các control chắc chắn có quyền có tooltip là: ListBox, Frame, CommandButton, ComboBox, Image. Mọi người tự thử cho những standard control khác.
----------
Có 1 lỗi nhỏ.
Các tooltip không hiển thị icon và tiêu đề "Balloon tip của siwtom"
Nguyên nhân? Tôi thêm một số control và thêm cho chúng text hiển thị ở Sheet1. Vì thế text tiêu đề trước đó đang ở dòng 11 bị đẩy xuống dòng 14 (do tôi thêm dòng trống để nhập text cho các control). Tôi quên không sửa trong code ví dụ.
Định thắc mắc, nhưng khi Test lại thì quá tuyệt vời! Khi Form đặt sát trên cùng màn hình thì cái "góc" hướng về Control nó cũng tự đão chiều xuống dưới! Quá hay luôn! Thank Thầy siwtom!
Private Type [COLOR=#ff0000][B]tagInitCommonControlsEx[/B][/COLOR]
dwSize As Long
dwICC As Long
End Type
và:
Mã:
Sub CreateTipsWindow(form As Object, ByVal hIcon As Long, ByVal Title As String)
Dim iccex As tagInitCommonControlsEx
iccex.dwSize = Len([COLOR=#ff0000][B]tagInitCommonControlsEx[/B][/COLOR])
'....
Tại sao cũng có thể đo chiều dài của chuỗi lên một Type được vậy ạ? Nhưng rõ ràng, iccex.dwSize nếu có kết quả nó cũng bằng 0, vì thế không cần câu này (iccex.dwSize = Len(tagInitCommonControlsEx)) cũng được mà?
Nhờ Thầy giải thích việc này giúp em ạ! Xin cám ơn.
Định thắc mắc, nhưng khi Test lại thì quá tuyệt vời! Khi Form đặt sát trên cùng màn hình thì cái "góc" hướng về Control nó cũng tự đão chiều xuống dưới! Quá hay luôn! Thank Thầy siwtom!
Tôi không hiểu câu hỏi. Tại sao dùng LEN? LEN đâu có chỉ dùng với STRING?
Returns a Long containing the number of characters in a string or the number of bytes required to store a variable
... Type CustomerRecord ' Define user-defined type.
ID As Integer ' Place this definition in a
Name As String * 10 ' standard module.
Address As String * 30
End Type
Dim Customer As CustomerRecord ' Declare variables.
Dim MyInt As Integer, MyCur As Currency
Dim MyString, MyLen
MyString = "Hello World" ' Initialize variable.
MyLen = Len(MyInt) ' Returns 2.
MyLen = Len(Customer) ' Returns 42.
MyLen = Len(MyString) ' Returns 11.
MyLen = Len(MyCur) ' Returns 8.
Nếu em muốn hiện tooltip khi drag chuột trên shapes hoặc trên các button của form controls hoặc ActiveX Controls trực tiếp của Sheet mình sửa đoạn code trên lại chỗ nào vậy chú Switom. Không biết có phải viết lại toàn bộ hay không vậy Chú? Vì e có biết cách dùng Hyperlink của form controls hoặc insert comment cho vừa ô chứa shapes, form controls,ActiveX cũng có thể tạo Tooltip như nó không được hay cho lắm!
Xin cảm ơn./.
Nếu em muốn hiện tooltip khi drag chuột trên shapes hoặc trên các button của form controls hoặc ActiveX Controls trực tiếp của Sheet mình sửa đoạn code trên lại chỗ nào vậy chú Switom. Không biết có phải viết lại toàn bộ hay không vậy Chú? Vì e có biết cách dùng Hyperlink của form controls hoặc insert comment cho vừa ô chứa shapes, form controls,ActiveX cũng có thể tạo Tooltip như nó không được hay cho lắm!
Xin cảm ơn./.
Nếu em muốn hiện tooltip khi drag chuột trên shapes hoặc trên các button của form controls hoặc ActiveX Controls trực tiếp của Sheet mình sửa đoạn code trên lại chỗ nào vậy chú Switom. Không biết có phải viết lại toàn bộ hay không vậy Chú? Vì e có biết cách dùng Hyperlink của form controls hoặc insert comment cho vừa ô chứa shapes, form controls,ActiveX cũng có thể tạo Tooltip như nó không được hay cho lắm!
Xin cảm ơn./.
Tôi không hiểu cái drag của bạn. Nếu bạn nhấn chuột phải vd. shape và kéo shape sang chỗ khác thì tôi hiểu là drag. Nhưng ở đây có lẽ bạn không kéo gì cả. Bạn chỉ muốn khi trỏ chuột đi vào shape thì sẽ có tooltop hiển thị?
Làm việc trong Excel rất khó vì các control không có handle, không là các window theo cách hiểu của Windows. Một số còn không có cả MouseMove. Sheet cũng không có MouseMove. Ở đây hơi khác với UserForm vì các control trên Form thường không thay đổi tọa độ của mình trong hệ tọa độ của Form. Trên sheet ta có thể cuộn sheet lên xuống, phải trái. Tôi chưa rõ sẽ có ảnh hưởng gì.
Nếu em muốn hiện tooltip khi drag chuột trên shapes hoặc trên các button của form controls hoặc ActiveX Controls trực tiếp của Sheet mình sửa đoạn code trên lại chỗ nào vậy chú Switom. Không biết có phải viết lại toàn bộ hay không vậy Chú? Vì e có biết cách dùng Hyperlink của form controls hoặc insert comment cho vừa ô chứa shapes, form controls,ActiveX cũng có thể tạo Tooltip như nó không được hay cho lắm!
Xin cảm ơn./.
Do bạn không phản hồi nên tôi tự thiết kế tập tin.
Hiện thời tôi dùng hook mouse để theo dõi chuột và tùy theo nó có vào và vào shape nào để hiển thị hoặc ẩn tooltip. Tôi dùng hook mouse do những Forms controls không có mousemove.
Text hiển thị cho từng control được nhập vào AlternativeText
Thực tình là tôi không thích hook. Nhất là hook từ khi mở tập tin cho tới tận khi đóng tập tin. Trong suốt quá trình đó user có thể thao tác rất nhiều, ở nhiều cửa sổ, hộp thoại, vào VBE v...v. Ngoài ra làm trong Excel thì phụ thuộc vào Excel, khó làm chủ code hoàn toàn được. Khi ta viết phần mềm thì ta viết code từ A đến Z nên ta chủ động được. Còn đây là chạy nhờ code trong Excel. Hook là trò chơi cao cấp nhưng chỉ cần sơ xuất nhỏ thì phần mềm bị treo ngay.
Nếu tôi tìm được cách khác như tooltip trên Form thì tôi sẽ thông báo. Code trên Form là code an toàn. Cùng lắm nếu có sự cố thì tooltip không hiển thị. Thế thôi
Chú Switom viết rất đúng ý con, đúng nhưng CHú nói khi thao tác liên quan tới hộp thoại, vào VBE, hoặc Design Form thì Excel có thể bị lỗi khỏi động lại hoặc không hiện Tooltip có lẽ liên quan tới Hook
Nếu tôi tìm được cách khác như tooltip trên Form thì tôi sẽ thông báo. Code trên Form là code an toàn. Cùng lắm nếu có sự cố thì tooltip không hiển thị. Thế thôi
Nếu được thì CHú chỉ giúp còn không được mình dùng cái khác vì thấy chủ đề này hiện tooltip thấy hay và liên quan tới hàm API thấy hay nên con muốn học hỏi thêm
Nói cho cùng thì cái ta cần là tạo ra sự kiện MouseMove cho Shape, có sự kiện ấy rồi, muốn gì chả được
Em đã Test thử sao nó hiện đen thui thấy cũng lạ, khi chế biến thành công em sẽ gửi lên diễn đàn tham khảo . Anh NDU xem giúp em file đính kèm không biết có sai chỗ nào không
Em đã Test thử sao nó hiện đen thui thấy cũng lạ, khi chế biến thành công em sẽ gửi lên diễn đàn tham khảo . Anh NDU xem giúp em file đính kèm không biết có sai chỗ nào không
Em cũng test giống anh như mà khi con trỏ chuột đi chỗ khác là nó đen textbox? Vậy mình có thể sửa chỗ nào, các đoạn code trên đã đáp ứng được yêu cầu tooltip chỉ còn vài vướn mắc nhỏ có thể bị reset lại excel e sẽ cải thiện lại.
Em cũng test giống anh như mà khi con trỏ chuột đi chỗ khác là nó đen textbox? Vậy mình có thể sửa chỗ nào, các đoạn code trên đã đáp ứng được yêu cầu tooltip chỉ còn vài vướn mắc nhỏ có thể bị reset lại excel e sẽ cải thiện lại.
Private Sub MyShapeEvents_ShapeExit(Sh As Shape)
Select Case Sh.Name
Case "Rectangle 1"
Sh.Fill.ForeColor.SchemeColor = 64
Sh.TextFrame.Characters.Text = ""
Sh.Line.Weight = 1#
Sh.Line.ForeColor.SchemeColor = 64
End Select
End Sub
Cái này hay thật bởi nó bắt được sự kiện MouseMove trên shape nên sẽ xử lý trực tiếp khi có sự kiện MouseMove xảy ra.
Theo mình thì đen thui tại vì đoạn
Cái này hay thật bởi nó bắt được sự kiện MouseMove trên shape nên sẽ xử lý trực tiếp khi có sự kiện MouseMove xảy ra.
Private Sub MyShapeEvents_ShapeExit(Sh As Shape)
Select Case Sh.Name
Case "Rectangle 1"
Sh.Fill.ForeColor.SchemeColor = 40
Sh.TextFrame.Characters.Text = "This is a shape"
Sh.Line.Weight = 6#
Sh.Line.ForeColor.SchemeColor = 40
End Select
End Sub
Nếu File bài #56 của bạn nmhung49 mở trên máy của bạn không bị lỗi thì lỗi bạn nêu tại bài #63 thì tôi không rõ nguyên nhân bởi dòng Code lỗi đó đều lấy từ Class bài #56
dhn46 cũng chỉ "mò" thôi chứ có hiểu API đâu.
Đọc Code bài bác Siwtom nhận ra rằng sub CreateTipsWindow để tạo Tooltip dựa trên hWnd của đối tượng sau đó truyền tham số vào ti.hwnd
Việc lấy hWnd của đối tượng được thông qua hàm WindowFromPoint dựa trên vị trí con chuột khi move trên đối tượng trong khi Code bài #56 bắt được sự kiện Move chuột qua đối tượng trên Form => Chắp vá code theo nguyên tắc:
- Bước 1: Lấy hWnd của đối tượng để truyền vào sub CreateTipsWindow như vậy cần khai báo 2 hàm
WindowFromPoint và GetCursorPos. Edit sub CreateTipsWindow của bác Siwtom 1 chút để phù hợp với đối tượng trên Sheet
- Bước 2: Gọi sub CreateTipsWindow khi xảy ra sự kiện move chuột qua Object => chính là sự kiện MyShapeEvents_ShapeEnter
- Bước 3 hủy Tooltip khi Move chuột ra khỏi Object => sử dụng DestroyToolTip của bác Siwtom
Nói tóm lại: Code bài #61 dựa trên yếu tố "mò" là chủ yếu chứ dhn46 chưa có hiểu ^^. Thôi bạn đợi các cao thủ khác trả lời nhé.
Nếu File bài #56 của bạn nmhung49mở trên máy của bạn không bị lỗi thì lỗi bạn nêu tại bài #63 thì tôi không rõ nguyên nhân bởi dòng Code lỗi đó đều lấy từ Class bài #56
Nếu ta cần bao nhiêu tool thì phải thêm vào bấy nhiêu tool (SendMessage ToolTipsHandle, TTM_ADDTOOLW, 0, ti). Trong bài #45 cứ mỗi control trên Form thì ta thêm 1 tool.
1. Kỹ thuật trong bài #45
Ta thiết lập cho mỗi tool cần thêm vào:
Sau khi đã thêm các tool thì control tooltip sẽ chịu trách nhiệm theo dõi vị trí của trỏ chuột. Nếu trỏ chuột ở trong cửa sổ có handle đỏ đỏ và đồng thời đi vào vùng nào đó đã được định nghĩa thì control tooltip sẽ hiển thị tool được gán cho vùng đó. Khi control tooltip phát hiện trỏ chuột sau đó đi ra khỏi vùng thì nó sẽ ẩn tool trước đó được hiển thị do trỏ chuột đi vào vùng.
Nói ngắn gọn thì ta định nghĩa các vùng cần hiển thị tooltip còn việc theo dõi trỏ chuột đi vào vùng nào, ra khỏi vùng nào để hiển thị hoặc ẩn tip thì do control tooltip đảm nhiệm.
2. Kỹ thuật trong bài #54
Trong kỹ thuật này thì ta không định nghĩa vùng nào cả. Dĩ nhiên trong trường hợp này thì control tooltip không theo dõi trỏ chuột. Thậm chí nếu muốn thì nó cũng không biết phải theo dõi vùng nào. Trong trường hợp này tự ta phải hiển thị và ẩn tooltip. Nhưng cũng do vậy mà ta có nhiều lựa chọn hơn: hiển thị bất cứ khi nào ta muốn, bất cứ tại đâu trên màn hình, không nhất thiết phải ở vị trí trỏ chuột.
Trong tập tin đính kèm tôi dùng kỹ thuật ở bài #54 nhưng code cần thiết tôi để riêng trong 1 module.
Khi mở tập tin thì nhấn nút "Create tooltip". Sau đó nhấn nút "Show tip" liên tục để thấy là cứ mỗi lần nhấn thì tooltip hiển thị ở một vị trí ngẫu nhiên trên màn hình. Khi nào mỏi tay thì nhấn "Destroy tooltip" để dọn đồ chơi.
--------------
Trong trường hợp của bạn thì
0. Thêm module1 có trong tập tin đính kèm.
1. Tạo control tooltip 1 lần, vd. khi mở tập tin.
Mã:
CreateToolTip 1, tiêu đề
2. Hủy control 1 lần, vd khi đóng tập tin
Mã:
DestroyToolTip
3. Trong sự kiện Enter (thay cho nhấn nút "Show tip")
Mã:
ShowTip text, x, y, TRUE
Bạn sẽ hiển thị tại vị trí trỏ chuột nên sẽ dùng hàm GetCursorPos để đọc tọa độ x, y
4. Trong sự kiện Exit
Mã:
ShowTip text, x, y, FALSE
text, x, y tùy ý vì không dùng tới. Vd. gọi ShowTip "", 0, 0, FALSE
--------------
Về tiêu đề của tooltip thì nếu tiêu đề = "" thì tip hiển thị không có tiêu đề. Icon dù có nhập thì cũng chỉ hiển thị khi có tiêu đề.
Nếu File bài #56 của bạn nmhung49mở trên máy của bạn không bị lỗi thì lỗi bạn nêu tại bài #63 thì tôi không rõ nguyên nhân bởi dòng Code lỗi đó đều lấy từ Class bài #56
dhn46 cũng chỉ "mò" thôi chứ có hiểu API đâu.
Đọc Code bài bác Siwtom nhận ra rằng sub CreateTipsWindow để tạo Tooltip dựa trên hWnd của đối tượng sau đó truyền tham số vào ti.hwnd
Việc lấy hWnd của đối tượng được thông qua hàm WindowFromPoint dựa trên vị trí con chuột khi move trên đối tượng trong khi Code bài #56 bắt được sự kiện Move chuột qua đối tượng trên Form => Chắp vá code theo nguyên tắc:
- Bước 1: Lấy hWnd của đối tượng để truyền vào sub CreateTipsWindow như vậy cần khai báo 2 hàm
WindowFromPoint và GetCursorPos. Edit sub CreateTipsWindow của bác Siwtom 1 chút để phù hợp với đối tượng trên Sheet
- Bước 2: Gọi sub CreateTipsWindow khi xảy ra sự kiện move chuột qua Object => chính là sự kiện MyShapeEvents_ShapeEnter
- Bước 3 hủy Tooltip khi Move chuột ra khỏi Object => sử dụng DestroyToolTip của bác Siwtom
Nói tóm lại: Code bài #61 dựa trên yếu tố "mò" là chủ yếu chứ dhn46 chưa có hiểu ^^. Thôi bạn đợi các cao thủ khác trả lời nhé.
Dạ đúng rồi bác Siwtom,dhn46 mới chỉ biết biến đổi bài #45 chút xíu để vooc API một chút chứ chưa có tìm hiểu. Cái này chắc còn phải tìm hiểu dài dài ^^ bác nhỉ? Qua những bài viết trên diễn đàn và đặc biệt là những bài của bác dhn46 đã biết cách biến đổi một số Code phục vụ công việc của mình, hy vọng là tương lai sẽ biết biến đổi nhiều hơn nữa.