Hỏi: Hiển thị thông tin khi chỉ chuột vào CommandButton (1 người xem)

  • Thread starter Thread starter pro8x
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

pro8x

Thành viên hoạt động
Tham gia
3/11/11
Bài viết
142
Được thích
24
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
 

File đính kèm

1. Tôi tách CreateTipsWindow cũ thành 2 sub: sub CreateTipsWindow và sub AddTool
2. Trong UserForm_Initialize bạn phải gọi CreateTipsWindow để tạo cửa sổ quản lý các tool. Tiếp theo cần hiển thị tooltip cho Control nào thì gọi AddTool và truyền Control đó
Trước khi gọi AddTool thì phải nhập các text cần hiển thị vào Tag của control. Nói cho cùng có thể gọi AddTool cho tất cả các control trên UserForm nhưng chỉ có những control có Tag <> "" mới được thêm tool.
3. Code bổ sung để hiển thị cho cả ListBox, Frame. Tôi không thêm được cho TextBox.
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.
 
Upvote 0
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.
 
Upvote 0
em xin cảm ơn mọi người đã quân tâm và hướng đãn, Hi file đúng với file của em rùi đáy bác siwtom ah.thank
 
Upvote 0
Ở đ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ụ.

Sửa lại trong UserForm_Initialize dòng

Mã:
CreateTipsWindow Me, 1, Sheet1.Range("A[COLOR=#ff0000]11[/COLOR]").Value

thành

Mã:
CreateTipsWindow Me, 1, Sheet1.Range("A[COLOR=#ff0000]14[/COLOR]").Value
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
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ụ.

Sửa lại trong UserForm_Initialize dòng

Mã:
CreateTipsWindow Me, 1, Sheet1.Range("A[COLOR=#ff0000]11[/COLOR]").Value

thành

Mã:
CreateTipsWindow Me, 1, Sheet1.Range("A[COLOR=#ff0000]14[/COLOR]").Value
Đị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!
 
Lần chỉnh sửa cuối:
Upvote 0
Em có một thắc mắc:

Mã:
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.
 
Upvote 0
Đị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!

1. Có một chút nhầm lẫn. Phải là
Mã:
iccex.dwSize = Len(iccex)

Tôi nhầm vì quen bên Delphi.
Trong Delphi thì
Mã:
iccex.dwSize := SizeOf([COLOR=#ff0000]tagINITCOMMONCONTROLSEX[/COLOR]);

và

Mã:
iccex.dwSize := SizeOf([COLOR=#ff0000]iccex[/COLOR]);

đều được.

2. Tôi xác định dwSize do thói quen làm bài bản thôi. Trong rất nhiều khi gọi hàm API và có thông số là cấu trúc thì trước khi gọi phải thiết lập một loạt trường của cấu trúc đó mà dwSize, tức độ lớn của cấu trúc, thường phải thiết lập.

3.
Tại sao cũng có thể đo chiều dài của chuỗi lên một Type được vậy ạ?

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.

4.
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!

Thì thằng tooltip vốn nó là thế. Nó luôn xác định chỗ trống để hiển thị. Nếu có nhiều khả năng thi nó sẽ chọn "bên trên bên phải"
 
Upvote 0
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./.
 
Lần chỉnh sửa cuối:
Upvote 0
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./.

Riêng với ActiveX Control, ta dùng sự kiện MouseMove để hiện TooltipText là đơn giản nhất
 
Upvote 0
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ì.

Tốt nhất là bạn gửi tập tin có những shape bạn cần và text tooltip của từng shape. Từ nay tới chủ nhật nếu có nhiều thời gian rỗi thì tôi sẽ nghiên cứu.
 
Upvote 0
Cái này em sẽ nghiên cứu, vậy với shapes và Form controls thì sao anh em nghĩ code trên chỉ cần chế biến lại sẽ được vì hàm API hơi khó đói với em ;;;;;;;;;;;

Tôi thì luôn thích cái gì đơn giản và code phải "vừa tầm" với ứng dụng
Đối với Shape ta có thể dùng tí "mẹo" như topic này:

http://www.giaiphapexcel.com/forum/showthread.php?86052-L%C3%A0m-th%E1%BA%BF-n%C3%A0o-%C4%91%E1%BB%83-bi%E1%BA%BFt-%C4%91%C6%B0%E1%BB%A3c-t%C3%AAn-Label-%28ActiveX-Control%29-khi-Mousemove-%C4%91%E1%BA%BFn-Label&highlight=

Hoặc cao cấp hơn chút, có thể tham khảo bài này:
http://www.mrexcel.com/forum/excel-questions/194053-changing-shape-fill-color-mouseover.html
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
 
Lần chỉnh sửa cuối:
Upvote 0
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
 

File đính kèm

Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
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.
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
 
Upvote 0
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

Tôi test bình thường nha:


[video=youtube;KBYXXGhwHEk]https://www.youtube.com/watch?v=KBYXXGhwHEk&feature=youtu.be[/video]
 
Upvote 0
Tôi test bình thường nha:
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.
 
Upvote 0
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.
Theo mình thì đen thui tại vì đoạn
Mã:
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.
 
Upvote 0
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.
Cảm ơn dhn chép vào mà không đọc code ặc...ặc...Tóm lại mình nghĩ bắt được MouseMove là sẽ làm gì cũng được bây giờ có thể chế biến code khác được rồi
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom