Ẩn và hiện mầu cho các control

Liên hệ QC

nguyennb

Thành viên hoạt động
Tham gia
23/10/07
Bài viết
103
Được thích
32
Mình có một form chứa nhiều textbox, combobox. Mình muốn khi con trỏ nhảy tới control nào thì control đó có nền màu vàng. Sau khi nhập dữ liệu xong và nhảy sang control khác thì control cũ trở về mầu bình thường. Mình đã làm thử viết code để thay đổi màu nền cho từng control ứng với sự kiện enter và exit của control đó. Các bạn có cách khác ngắn gọn hơn không ?
 
Mình có một form chứa nhiều textbox, combobox. Mình muốn khi con trỏ nhảy tới control nào thì control đó có nền màu vàng. Sau khi nhập dữ liệu xong và nhảy sang control khác thì control cũ trở về mầu bình thường. Mình đã làm thử viết code để thay đổi màu nền cho từng control ứng với sự kiện enter và exit của control đó. Các bạn có cách khác ngắn gọn hơn không ?
Tôi nghĩ có lẽ sẽ dùng sự kiện MouseMove cho các Object... Bạn nghiên cứu xem
 
Upvote 0
Mình có một form chứa nhiều textbox, combobox. Mình muốn khi con trỏ nhảy tới control nào thì control đó có nền màu vàng. Sau khi nhập dữ liệu xong và nhảy sang control khác thì control cũ trở về mầu bình thường. Mình đã làm thử viết code để thay đổi màu nền cho từng control ứng với sự kiện enter và exit của control đó. Các bạn có cách khác ngắn gọn hơn không ?
Nếu dùng sự kiện rê chuột thì bạn có thể tham khảo đoạn code này để làm cho nền text box có màu vàng khi trỏ chuột vào.
PHP:
Private Sub TextBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Me.TextBox1.BackColor = &HFFFF&
End Sub
 
Upvote 0
Bạn cũng có thể dùng sự kiện GotFocus và LostFocus:
Mã:
Private Sub TextBox1_GotFocus()
Me.TextBox1.BackColor = &HFFFF&
End Sub

Private Sub TextBox1_LostFocus()
Me.TextBox1.BackColor = &HFFFFFF
End Sub
 
Upvote 0
Hình như mọi người vẫn chưa hiểu đúng ý tác giả, các cách này thì vẫn phải viết các event cho từng control, mà như thế thì vẫn như tác giả đã nêu ra rồi, có ngắn gọn hơn được chút nào đâu.
 
Upvote 0
Theo tôi nên để code chuyển màu trong 1 sự kiện nào đó mà mình dùng đến, ví dụ như:
keydown/ keyup/ movemouse/ ....
Ví dụ như:
HTML:
' Sau khi textbox1 nhận forcus, ở trong 1 sự kiên nào đó (load form/ ta xem như textbox1 là control đầu tiên của form nhận forcus 
private sub ....  (chăng hạn form initiall)
     ......
     Me.textbox1.setforcus
     Me.TextBox1.BackColor = &HC0FFFF 'mau vàng
     ......
end sub
'Va sau đó ở sự kiện:
private sub textbox1_keydown(....)
    '.....code
    Me.textbox1.value= "....."
    ' Truoc khi textbox1 mat forcus
    Me.textbox1.BackColor = &HE0E0E0        'xam
    Me.textbox2.setforcus
    'Sau khi textbox2 nhan forcus
    Me.TextBox2.BackColor = &HC0FFFF           'vang nhat
    '......
end sub
 
Upvote 0
Hình như mọi người vẫn chưa hiểu đúng ý tác giả, các cách này thì vẫn phải viết các event cho từng control, mà như thế thì vẫn như tác giả đã nêu ra rồi, có ngắn gọn hơn được chút nào đâu.
Vậy có cách nào dùng vòng lập duyệt qua toàn bộ các Control không? Tôi cũng đã nghĩ qua nhưng mà... Khó quá (hỏng làm nổi)
Bạn giúp dùm vụ này xem!
 
Upvote 0
Vậy có cách nào dùng vòng lập duyệt qua toàn bộ các Control không? Tôi cũng đã nghĩ qua nhưng mà... Khó quá (hỏng làm nổi)
Bạn giúp dùm vụ này xem!
Vòng lặp duyệt qua các Control thì không khó, nhưng vấn đề ở đây không phải là vòng lặp này, mà là phải gắn với sự kiện nào?Tôi cũng chưa nghĩ ra là phải gắn với sự kiện nào vì khi con trỏ ở trong 1 Control hoặc click vào 1 Control thì đó lại là sự kiện của Control chứ không phải là sự kiện của Form. Mà sự kiện của Control thì lại quay lại vấn đề cũ. Ở Access thì Form có 1 thuộc tính là Key Preview rất hay, rất tiếc Form của Excel lại không có +-+-+-+
 
Upvote 0
Trên 1 Form thường có rất nhiều Control nhận Focus để nhập dữ liệu. Vậy ta không nên viết cho mỗi Control 1 đoạn đổi màu như vậy mà viết riêng 1 sub đổi màu thôi. Mỗi Control nhận Focus thì gọi sub này 1 lần là xong

Có 2 cách xác đinh Control đổi màu căn cứ vào thuộc tính Name hay Active .Ví dụ:

for each ctr in Controls
if ctr.Name=ten then
......dổi màu
else
......reset mau
end if


Trong đó ten là tên Control gọi sub, ví dụ trong sự kiện actice của ô Txt_diachi
ta viết
Call doimau("Txt_diachi")

Hoặc đơn giản hơn tại các Control chỉ cần gọi sub doimau thôi còn tên xác định như sau:
sub doimau()
dim ten as string
ten = Me.ActiveControl.Name
for each ctr in Controls
if ctr.Name=ten then
......dổi màu
else
......reset mau
end if
end sub

Mình đã làm nhưng không nhớ chính xác các bạn lựa theo điều kiện và sử câu lệnh cho chính xác, mình mới nêu ý tưởng thôi. Thông cảm nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi mình đính chính là gắn vào sự kiện Enter. Mình gửi kèm file ví dụ
 

File đính kèm

Upvote 0
Mình nghĩ trong Excel không làm được điều này vì bạn đã kiểm hết các sự kiện của Form đều không hợp lý giải quyết. TrongVB hay Access sự kiện của Form nó có sự kiện Current() sẽ sử lý tốt vụ này.
 
Upvote 0
Vòng lặp duyệt qua các Control thì không khó, nhưng vấn đề ở đây không phải là vòng lặp này, mà là phải gắn với sự kiện nào?Tôi cũng chưa nghĩ ra là phải gắn với sự kiện nào vì khi con trỏ ở trong 1 Control hoặc click vào 1 Control thì đó lại là sự kiện của Control chứ không phải là sự kiện của Form. Mà sự kiện của Control thì lại quay lại vấn đề cũ. Ở Access thì Form có 1 thuộc tính là Key Preview rất hay, rất tiếc Form của Excel lại không có +-+-+-+
Ban đầu tôi cũng hiểu sai ý của tác giả. Quả thực để xác đinh 1 sự kiện của form ví dụ như: Form_initialze() chảng hạn là khó.
Nếu duyệt qua các ctr rồi gán màu cho ctr đang active thì ôi thôi form nhìn như bị ghẻ vậy.
 
Upvote 0
Cảm ơn sealand và mọi người đã quan tâm. Tôi xin giải thích rõ hơn. Tất cả các textbox và combobox đều có tabstop=false. Mỗi khi nhập dữ liệu xong ở một control nào đó, ấn phím Enter thì sẽ nhảy sang control tiếp theo có taborder lớn hơn liền kể. Tôi muốn hỏi mọi người có cách nào chỉ viết một Sub là có thể đổi màu được, ví dụ : duyệt qua toàn bộ control, nếu cái nào đang có con trỏ nhấp nháy thì cho màu vàng, nếu không thi cho màu trắng. Không cần viết chi tiết cho sự kiện Enter của tất cả các controls
 
Upvote 0
Bạn thử tham khảo file này xem được không nhé. Trong file này mình mới xử lý cho TextBox, với Combo mình nghĩ có thể làm tương tự được. Có điều mình chưa xử lý cho trường hợp người dùng chuyển Focus bằng chuột.
 

File đính kèm

Upvote 0
Mình không rõ là là bạn sử dụng lệnh gì và ở sự kiện nào để dịch chuyển con trỏ giữa các Controls, nhưng đấy là cơ sở để bạn gài lệnh gọi sub thiết lập màu. Bạn soát toàn bộ điều khiển trên Form (Trừ Label, CommandB..) cái nào Active thì đổi màu vàng và ngược lại.
 
Upvote 0
Mình không rõ là là bạn sử dụng lệnh gì và ở sự kiện nào để dịch chuyển con trỏ giữa các Controls, nhưng đấy là cơ sở để bạn gài lệnh gọi sub thiết lập màu. Bạn soát toàn bộ điều khiển trên Form (Trừ Label, CommandB..) cái nào Active thì đổi màu vàng và ngược lại.
Chuyển Focus qua các điều khiển thì bằng phím Enter và phím Tab. Nhưng code của mình không thực hiện theo cách mỗi khi chuyển Focus thì duyệt hết các Control trên Form đâu, mà nó xử lý ngay tại Control Chuyển Focus bằng sự kiện KeyDown và Control nhận Focus bằng sự kiện KeyUp. Trong ví dụ này mình chưa xử lý cho Chuột, nhưng nếu sử lý cho chuột thì chắc phải duyệt Control thì phải. Nhưng khi duyệt mình dùng thuộc tính tag chứ không dùng kiểu điều khiển trên Form như cách của bạn.
 
Upvote 0
Vậy thì sau câu lệnh set focus bạn thêm 1 dòng gọi sub doimau là xong (Phù hợp với tất cả sử lý dịch chuyển bằng Enter, Tab, mũi tên, chuột).Nói thật cách giải quyết của bạn cũng khá là cồng kềnh, cách của mình không phải là do mình nghĩ ra đâu mà mình tham khảo ví dụ mẫu của Access đấy.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy thì sau câu lệnh set focus bạn thêm 1 dòng gọi sub doimau là xong (Phù hợp với tất cả sử lý dịch chuyển bằng Enter, Tab, mũi tên, chuột)
Nói như bạn thì lại quay lại cái vòng luẩn quẩn mà mọi người đã thảo luận, vì mỗi Control lại phải viết thêm 2 sự kiện chuyển focus và nhận focus. Vấn đề là ý tác giả topic này muốn ko phải viết code cho từng Control. Trong file ví dụ của tôi, bạn có thể thêm các Textbox khác lên Form, đặt thuộc tính tag là "ChangeColor" thì control đó tự động đổi màu nền mà bạn không phải viết thêm sự kiện nào cho control đó.

Nếu là trên Access thì bài toán này đã được giải quyết đơn giản hơn rất nhiều rồi. Bạn đọc kỹ yêu cầu của chủ Topic rồi có thể đưa ra 1 phương án đỡ cồng kềnh hơn không? Mình chưa nghĩ ra được cách nào khác cho trường hợp này.
Cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
To rollover79.
Mình đọc code trong file của bạn nhưng không hiểu lắm. Code của bạn giúp mình có thêm các hướng đi mới giải quyết các vấn đề khác nên rất muốn hiểu rõ, phiền bạn thêm các chú thích để giải thích rõ hơn được không
 
Upvote 0
Web KT

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

Back
Top Bottom