Vấn đề sự kiện Enter và SetFocus (1 người xem)

Liên hệ QC

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

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,725
Giới tính
Nam
Tại sao khi Enter vào Textbox2, khi Textbox1 không chứa dữ liệu thì Textbox1 không thể SetFocus mà chuyển con trỏ qua Textbox3?
Có cách nào khắc phục được đúng ý của mình không (SetFocus về Texbox1) ?

PHP:
Private Sub TextBox2_Enter()
  If TextBox1 = "" Then MsgBox "Hay dien vao Textbox1": TextBox1.SetFocus: Exit Sub
End Sub

Cảm ơn rất nhiều!
 

File đính kèm

Tôi cũng đã thử dùng sự kiện Exit mà cũng không SetFocus cho nó vào Textbox1 được khi nhấn phím Enter (nó vẫn chuyển con trỏ xuống textbox kế tiếp)
PHP:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If TextBox1 = "" Then MsgBox "Hay dien vao Textbox1": TextBox1.SetFocus: Exit Sub
End Sub
 
Upvote 0
Bạn làm thế này được:

Mã:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Me.TextBox1 = "" Then Cancel = True: MsgBox "Hay dien vao Textbox1"
End Sub
 
Upvote 0
Bạn làm thế này được:

Mã:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Me.TextBox1 = "" Then Cancel = True: MsgBox "Hay dien vao Textbox1"
End Sub

Em cám ơn anh Sealand rất nhiều, còn một thắc mắc nữa muốn hỏi anh là: Nếu chưa điền gì vào Textbox1, con trỏ đang ở đó, khi thoát Form, nó cũng thông báo (em không muốn thông báo khi thoát Form), vậy khắc phục nó bằng cách nào vậy anh?
 
Upvote 0
Em cám ơn anh Sealand rất nhiều, còn một thắc mắc nữa muốn hỏi anh là: Nếu chưa điền gì vào Textbox1, con trỏ đang ở đó, khi thoát Form, nó cũng thông báo (em không muốn thông báo khi thoát Form), vậy khắc phục nó bằng cách nào vậy anh?

Bác thay dòng lệnh trên bằng các dòng lệnh này, nhớ khai báo biến Thoat ở dòng trên cùng:

Dim Thoat As Boolean
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Me.TextBox1 = "" And Thoat = False Then
Cancel = True
MsgBox "Hay dien vao Textbox1"
End If
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Thoat = True
End Sub
 
Upvote 0
Tôi cũng đã thử dùng sự kiện Exit mà cũng không SetFocus cho nó vào Textbox1 được khi nhấn phím Enter (nó vẫn chuyển con trỏ xuống textbox kế tiếp)

Minh Thien có nhớ câu chuyện ve thuốc "Phúc thống phục nhân sâm tắc tử" (Đau bụng cho uống nhân sâm chắc chết). Hai chữ tắc tử sang trang sau. Ông thày vừa bốc thuốc vừa tra sách vớ được câu "Phúc thống phục nhân sâm" là bốc liền. Khi hậu quả mới ngã ngửa.
Ở đây, Minh Thiện không để ý thấy cái hay nhất của Event Exit() là nó có tham số ByVal Cancel As MSForms.ReturnBoolean
Nếu kiểm tra không thoả mãn thì thiết lập Cancel=True. Nó có nghĩa là xoá bỏ sự kiện, mà bỏ sự kiện tức không thoát khỏi Textbox.===>Không đi đâu cả thì hô quay về làm gì?
Tóm lại, bạn chỉ cần Cancel=True là OK. Trong ví dụ bạn nêu thiếu đút khoản này mà lại thừa đoạn kêu quay lại
 
Upvote 0
Các bác cho em hỏi. Giờ em có 1 Textbox:
Khi em nhập vào Text box giá trị 6 sau đó nhấn Space sẽ tự chuyển sang textbox 2 và Chọn toàn bộ text đã có sẵn trong Textbox 2 (bôi đen)
Cám ơn !
 
Upvote 0
Các bác cho em hỏi. Giờ em có 1 Textbox:
Khi em nhập vào Text box giá trị 6 sau đó nhấn Space sẽ tự chuyển sang textbox 2 và Chọn toàn bộ text đã có sẵn trong Textbox 2 (bôi đen)
Cám ơn !

Cho hỏi, chỉ với giá trị khi nhập vào TextBox1 là 6 thì nhấn SpaceBar nó mới chuyển sang TextBox2, còn những số khác, hoặc giá trị khác thì không thực hiện như thế phải không?
 
Upvote 0
Upvote 0
Chính xác rồi. dữ liệu sẽ kết thúc bằng SpaceBar

OK, vậy cũng không là vấn đề:

Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 32 And TextBox1 = "6" Then
        KeyCode = 0
        With TextBox2
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
        End With
    End If
End Sub

Nếu kết thúc nhập là 6, tức là dù trước đó là số gì không biết, nhưng số cuối cùng là 6 thì bạn sửa lại tí:

Mã:
If KeyCode = 32 And Right(TextBox1, 1) = "6" Then
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi vì chưa giải thích rõ. Kết thúc bằng số bất kỳ và khi nhấn Spacebar sẽ chuyển sang textbox2. Và sẽ chọn toàn bộ dữ liệu có sẵn trong Textbox2 (bôi đen)
 
Upvote 0
Xin lỗi vì chưa giải thích rõ. Kết thúc bằng số bất kỳ và khi nhấn Spacebar sẽ chuyển sang textbox2. Và sẽ chọn toàn bộ dữ liệu có sẵn trong Textbox2 (bôi đen)

Chắc là vầy chăng:
Mã:
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 32 Then
    With TextBox2
      .SetFocus
      .SelStart = 0
      .SelLength = Len(.Text)
    End With
  End If
End Sub
 
Upvote 0
Chắc là vầy chăng:
Mã:
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 32 Then
    With TextBox2
      .SetFocus
      .SelStart = 0
      .SelLength = Len(.Text)
    End With
  End If
End Sub

Thầy ơi, phải như thế này mới chuẩn ạ:

Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 32 Then
        [COLOR=#ff0000][B]KeyCode = 0[/B][/COLOR]
        With TextBox2
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
        End With
    End If
End Sub

Nếu không có cái màu đỏ, thì giá trị ở TextBox2 sẽ bị thay thế bằng dấu space ạ!
 
Upvote 0
Thầy ơi, phải như thế này mới chuẩn ạ:

Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 32 Then
        [COLOR=#ff0000][B]KeyCode = 0[/B][/COLOR]
        With TextBox2
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
        End With
    End If
End Sub

Nếu không có cái màu đỏ, thì giá trị ở TextBox2 sẽ bị thay thế bằng dấu space ạ!

Thử chưa mà nói vậy trời?
Đồng chí xài sự kiện KeyDown, tôi xài KeyUp ---> Đâu có giống
 
Lần chỉnh sửa cuối:
Upvote 0
Thử chưa mà nói vậy trời?
Đồng chí xài sự kiện KeyDown, tôi xài KeyUp ---> Đâu có giống

Với sự kiện này thì không dùng được KeyUp, bởi vì sau khi TextBox1 đã được nhập ký tự trắng, thì mới xảy ra sự kiện, như thế thì thừa 1 khoảng trắng!

Với trường hợp này chỉ được sử dụng KeyDown (hoặc KeyPress) mà thôi.
 
Upvote 0
Với sự kiện này thì không dùng được KeyUp, bởi vì sau khi TextBox1 đã được nhập ký tự trắng, thì mới xảy ra sự kiện, như thế thì thừa 1 khoảng trắng!

Không dùng được là không được thế nào nhỉ?
Tác giả có nói gì về cái vụ thừa khoảng trắng đâu trời? Mà thừa thì đã làm sao? Cùng lắm tôi cắt bỏ nó cũng có vấn đề gì chứ?
 
Upvote 0
Không dùng được là không được thế nào nhỉ?
Tác giả có nói gì về cái vụ thừa khoảng trắng đâu trời? Mà thừa thì đã làm sao? Cùng lắm tôi cắt bỏ nó cũng có vấn đề gì chứ?
Trời ơi, gượng ép không hạnh phúc đâu Thầy ơi! ặc ... ặc ...
 
Upvote 0
Gì mà gượng ép
Ví dụ: Nghĩa xài KeyDown thì vẫn phải tốn dòng KeyCode = 0 đấy thôi
(tức là đàng nào cũng phải tốn)

Khác hẳn Thầy ơi, KeyCode = 0 tức là nó thuộc KeyCode Constant, số 0 có nghĩa là vbKeyCancel nó hủy tín hiệu của key trước khi nhập vào TextBox.

Thầy thử một thí nghiệm nho nhỏ sẽ thấy:

1) Dùng thủ tục của Thầy, cho load form, gõ gì vào TextBox1, bôi đen TextBox1 đó, bấm Space, ra kết quả là tất cả những gì đã ghi được thay thế bằng ký tự khoảng trắng rồi mới focus đến TextBox2

2) Dùng thủ tục của em, cũng làm như thế, sẽ ra sao? TextBox1 vẫn còn nguyên vẹn và focus đến TextBox2
 
Upvote 0

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

Back
Top Bottom