Hỏi về sự kiện Click 1 Control trên 1 UserForm (1 người xem)

Liên hệ QC

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

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,970
Thông thường để chạy 1 code nào đó khi click vào 1 Control trên UserForm, ta dùng sự kiện Click
Ở đây tôi muốn 1 code nào đó sẽ chạy khi ta click bất kỳ control nào có trong UserForm thì ta dùng sự kiện gì?
Ví dụ:
- Form gồm 2 Command Button, 1 TextBox
- Tôi muốn khi tôi click vào UserForm hay Command Button hay TextBox... vân vân... thì 1 code nào đó sẽ chạy
Nhờ các cao thủ chỉ giáo!
 
Bác chỉ cần 1 thủ tục chung. Sau đó bất kỳ sự kiện Click nào là Call thủ tục đó thôi.
 
Upvote 0
vâng! Cái này mình biết ---> Có điều UserForm gồm vài chục Control thì code dài quá...

Bác thử dùng sự kiện UserForm_MouseDown xem sao, cứ bấm chuột vào bất kỳ trong Form là chạy.
Còn các thủ tục khác sẽ truy cập đến biến trong sự kiện trên.
 
Lần chỉnh sửa cuối:
Upvote 0
Bác thử dùng sự kiện UserForm_MouseDown xem sao, cứ bấm chuột vào bất kỳ trong Form là chạy.
Vâng! Nãy giờ tôi đang thử, nhưng không hiệu quả lắm ---> Bấm đúng vào UserForm thì code mới có tác dụng ---> Bấm vào 1 Control khác nằm trên UserForm này nó chẳng ép phê gì cả
Tôi có thể nói sơ qua về ý tưởng, chắc các bạn đều biết chương trình Lạc Việt từ điển:
- Khi cửa sổ chương trình Active thì giao diện sẽ hiện rõ... Còn ngược lại, khi chương trình Deactive thì nó trở nên trong suốt
- Với Lạc Việt từ điển thì bạn bấm bất cứ nơi đâu trong cửa sổ chương trình, nó đều Active và hiện rõ
Không biết họ dùng thuật toán gì nhỉ?
 
Upvote 0
Không được anh Hướng à, nếu dùng sự kiện của chuột của Form thì khi di trên các đối tượng thì mất tác dụng. Mình thấy VBA của Excel thiếu quá nhiều các sự kiện hỗ trợ của Form. Phải chi ở đây có On_Current thì hay biết mấy.
 
Upvote 0
Không được anh Hướng à, nếu dùng sự kiện của chuột của Form thì khi di trên các đối tượng thì mất tác dụng. Mình thấy VBA của Excel thiếu quá nhiều các sự kiện hỗ trợ của Form. Phải chi ở đây có On_Current thì hay biết mấy.
On_Current cũng không giải quyết được yêu cầu bài toán đặt ra đâu! Khi click chuột vào 1 object nào đó thì không liên quan gì đến On_Current cả! Ngay khi click chuột thì VBA đã chuyển control cho object đó, không liên quan đến Form chính nữa. Để hiểu rõ vấn đề này thì anh xem cách vận hành trên Switchboard của Access sẽ rõ.

@ndu: nếu anh muốn code không dài thì anh định nghĩa trước bằng 1 Sub tổng hợp các sự kiện/kịch bản sẽ xảy ra. Ví dụ:
[highlight=VB]
Private Sub KeyAction(mKey as Interger)
'mKey = 1 to n (n = số object trên Form)
Select Case mkey
Case 1: Làm cái gì đó
Case 2: .................
Case 3: .................
..........
Case n-1: .................
Case else: ...............
End Select
End Sub
[/highlight]Và ứng với mỗi sự kiện Click trên từng Object anh cho chạy Sub này, đại khái:
[highlight=VB]Private Sub mObject_Z_Click()
'Với Z là thứ tự object do anh định nghĩa
Call KeyAction(Z)
End Sub
[/highlight]Ngoài cách này ra, vẫn có thể làm được bằng cách bỏ hết các commandbutton đi, thay vào đó là 1 listbox. Anh xem file đính kèm nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vâng! Nãy giờ tôi đang thử, nhưng không hiệu quả lắm ---> Bấm đúng vào UserForm thì code mới có tác dụng ---> Bấm vào 1 Control khác nằm trên UserForm này nó chẳng ép phê gì cả
Tôi có thể nói sơ qua về ý tưởng, chắc các bạn đều biết chương trình Lạc Việt từ điển:
- Khi cửa sổ chương trình Active thì giao diện sẽ hiện rõ... Còn ngược lại, khi chương trình Deactive thì nó trở nên trong suốt
- Với Lạc Việt từ điển thì bạn bấm bất cứ nơi đâu trong cửa sổ chương trình, nó đều Active và hiện rõ
Không biết họ dùng thuật toán gì nhỉ?

Nếu có thể, bác cho sự kiện UserForm_Activate() để khi tải, nó thi hành luôn.

Còn Lạc Việt có lẽ lập trên chương trình lập trình chuyên nghiệp.
 
Upvote 0
Tìm giúp bạn được cái này trên PSC không biết đúng ý không.
 

File đính kèm

Upvote 0
Đây! Tôi có file này bắt chước kiểu "ứng xử" của Lạc Việt từ điển nhưng không hoàn hảo lắm ---> Vì phải chọn vào đúng UserForm thì Form mới hiện rỏ
Các cao thủ xem cách nào viết code ngắn gọn nhất để khi tôi chọn bất cứ Control nào trên UserForm thì Form cũng hiện rõ (Transparency =255)
Sorry cadafi ---> Mình vẫn chưa biết áp dụng giải thuật của bạn vào file này như thế nào --> Giúp mình với
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đây! Tôi có file này bắt chước kiểu "ứng xử" của Lạc Việt từ điển nhưng không hoàn hảo lắm ---> Vì phải chọn vào đúng UserForm thì Form mới hiện rỏ
Các cao thủ xem cách nào viết code ngắn gọn nhất để khi tôi chọn bất cứ Control nào trên UserForm thì Form cũng hiện rõ (Transparency =255)
Thì ra là yêu cầu này.
Code này chép vào Module
[highlight=VB]
Public Sub RealTrans()
SetWindowLong hWnd, -20, &H80000
SetLayeredWindowAttributes hWnd, 0, 255, 2
End Sub
[/highlight]


Anh chép code này vào form nhé! Thay cho sự kiện UserForm_MouseDown
[highlight=VB]
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Call RealTrans
End Sub
[/highlight]
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thì ra là yêu cầu này.
Code này chép vào Module
[highlight=VB]
Public Sub RealTrans()
SetWindowLong hWnd, -20, &H80000
SetLayeredWindowAttributes hWnd, 0, 255, 2
End Sub
[/highlight]


Anh chép code này vào form nhé! Thay cho sự kiện UserForm_MouseDown
[highlight=VB]
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Call RealTrans
End Sub
[/highlight]
Chắc đành phải làm vậy thôi ---> Lúc đầu tôi cũng có dự định với MouseMove nhưng vẫn rất cân nhắc ---> Lý do là khi rà chuột vào thì code sẽ.. chạy hoài ---> Liệu có ảnh hưởng đến tốc độ tính toán không ta?
Hic...
 
Upvote 0
Chắc đành phải làm vậy thôi ---> Lúc đầu tôi cũng có dự định với MouseMove nhưng vẫn rất cân nhắc ---> Lý do là khi rà chuột vào thì code sẽ.. chạy hoài ---> Liệu có ảnh hưởng đến tốc độ tính toán không ta?
Hic...
Em thấy Form của anh đâu có tính toán gì đâu, với lại sự kiện này chỉ thay đổi mức độ trong suốt của form thôi mà!? Nếu có tính thì mình có thể control được các bước tính này mà, ví dụ click nút thì nó mới tính, đây phải lúc nào cũng tính đâu anh!
Dù gì mình cũng đã thực hiện sự kiện Selection_Change trên sheet! Em đâu có thấy chậm đâu! Thì Mousemove trên Form cũng vậy thôi!

Em đang xem tại sao mình bỏ sự kiện Selection_Change trên sheet thì lại không có tác dụng nữa!?
 
Lần chỉnh sửa cuối:
Upvote 0
Em thấy Form của anh đâu có tính toán gì đâu, với lại sự kiện này chỉ thay đổi mức độ trong suốt của form thôi mà!? Nếu có tính thì mình có thể control được các bước tính này mà, ví dụ click nút thì nó mới tính, đây phải lúc nào cũng tính đâu anh!
Dù gì mình cũng đã thực hiện sự kiện Selection_Change trên sheet! Em đâu có thấy chậm đâu!
Tạm chấp nhận vậy (dù chưa hài lòng lắm)... cảm ơn cadafi nhiều
Quả thật học hỏi nó vô cùng tận ---> Được cái này lại muốn thêm cái khác ---> Biết thêm 1 tí về VBA lại cảm thấy nó dường như có rất nhiều thiếu sót (về các Control và sự kiện).. và lại muốn biết thêm thứ khác
Hy vọng 1 ngày không xa, GPE sẽ có thêm chuyên mục về các ngôn ngữ lập trình (về C chẳng hạn)
Ẹc... Ẹc... Và hy vọng sẽ còn.. nhức đầu dài dài
 
Upvote 0
Mình nghiên cứu thử xem có cách nào bỏ luôn sự kiện Selection_Change của sheet đi, và khi con trỏ chuột vượt ra ngoài khung của Form trong 1 khoản thời gian nào đó (ví dụ 1/4 giây) là tự động form nó trong suốt luôn!? Ẹc Ẹc...
 
Upvote 0
Mình nghiên cứu thử xem có cách nào bỏ luôn sự kiện Selection_Change của sheet đi, và khi con trỏ chuột vượt ra ngoài khung của Form trong 1 khoản thời gian nào đó (ví dụ 1/4 giây) là tự động form nó trong suốt luôn!? Ẹc Ẹc...
Tôi cũng đã có nghĩ qua (bằng cách tính X và Y)... nhưng sự kiện MouseMove tỏ ra không "nhạy" lắm nên rất khó thực hiện yêu cầu này Kiệt à!
---------------
Các bác hãy dùng kỹ thuật viết Class (không hiểu sao trên GPE này không thấy mọi người viết Class). Tôi đã viết vài ví dụ ở link dưới đây.
http://www.giaiphapexcel.com/forum/showthread.php?t=3868
Nếu Tuân có thời gian, xin hãy viết sơ qua về Class ---> Muốn học nhưng còn thấy mù mờ quá
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Thêm 1 ý tưởng nữa, xử lý rất đơn giản nhưng chưa hoàn hảo lắm.
1. Dùng 1 Label transparent phủ lên toàn bộ form
2. Điều khiển thuộc tính Visibled của Label cho phù hợp
3. Bắt sự kiện click của Label này và xử lý.
Nhưng rất tiếc là riêng với ListBox thì nó lại alway on top so với các control khác mà không chịu nằm dưới nên không có tác dụng với ListBox
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom