Thuộc tính Setfocus không tác dụng (1 người xem)

Liên hệ QC

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

Quang_Hải

Thành viên gạo cội
Tham gia
21/2/09
Bài viết
6,070
Được thích
7,994
Nghề nghiệp
Làm đủ thứ
1. Khi ta cố tình bỏ trống Tbox1 và nhấn Enter tại TBox2
Lẽ ra xuất hiện thông báo 1 và con trỏ sẽ nhấp nháy tại TB1
Nhưng thông báo 1 luôn xuất hiện 2 lần và con trỏ biến mất
2. Khi ta cố tình bỏ trống Tbox2 và nhấn Enter tại TBox2
Thông báo 2 xuất hiện 1 lần nhưng con trỏ cũng biến mất

Các anh chị xem dùm xem sai thế nào vậy

PHP:
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If Me.TextBox1 = "" Then
    MsgBox "Thieu thong tin 1"
    Me.TextBox1.SetFocus
   ElseIf Me.TextBox2 = "" Then
    MsgBox "Thieu thong tin 2"
    Me.TextBox2.SetFocus
  Else
    MsgBox "OK"
  End If
End Sub
 
Lần chỉnh sửa cuối:
1. Khi ta cố tình bỏ trống Tbox1 và nhấn Enter tại TBox2 Lẽ ra xuất hiện thông báo 1 và con trỏ sẽ nhấp nháy tại TB1 Nhưng thông báo 1 luôn xuất hiện 2 lần và con trỏ biến mất 2. Khi ta cố tình bỏ trống Tbox2 và nhấn Enter tại TBox2 Thông báo 2 xuất hiện 1 lần nhưng con trỏ cũng biến mất Các anh chị xem dùm xem sai thế nào vậy
PHP:
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)   
If Me.TextBox1 = "" Then     
MsgBox "Thieu thong tin 1"     
Me.TextBox1.SetFocus    
ElseIf Me.TextBox2 = "" Then     
MsgBox "Thieu thong tin 2"    
 Me.TextBox2.SetFocus   
Else     
MsgBox "OK"   
End If 
End Sub

Chào anh,
Khi kyo test thì kyo thấy không có hiện tượng như anh nói, tức là nếu như bỏ trống ở textbox1 thì hiện thông báo 1 lần và dấu nháy ở ngay textbox1, và khi bỏ trống textbox2 thì hiện thông báo 1 lần (ok) nhưng dấu nháy thì không xuất hiện ở textbox2 mà nó sẽ tô đen đoạn text có trong textbox1.
Kyo.
 
Upvote 0
Chào anh,
Khi kyo test thì kyo thấy không có hiện tượng như anh nói, tức là nếu như bỏ trống ở textbox1 thì hiện thông báo 1 lần và dấu nháy ở ngay textbox1, và khi bỏ trống textbox2 thì hiện thông báo 1 lần (ok) nhưng dấu nháy thì không xuất hiện ở textbox2 mà nó sẽ tô đen đoạn text có trong textbox1.
Kyo.

Kyo test thử cái file này sẽ biết. Mình mày mò mãi mà không hiểu nổi tại sao cái Setfocus không tác dụng
 

File đính kèm

Upvote 0
Mình đã sửa lại, bạn coi thử được không?
Mã:
Option Explicit
Private Sub CommandButton1_Click()
    If Me.TextBox1 = "" Then
        MsgBox "Thieu thong tin 1"
        Me.TextBox1.SetFocus
    ElseIf Me.TextBox2 = "" Then
        MsgBox "Thieu thong tin 2"
        Me.TextBox2.SetFocus
    Else
        MsgBox "OK"
        Unload Me
    End If
End Sub
Private Sub UserForm_Activate()
    Me.TextBox1 = ""
    Me.TextBox2 = ""
    Me.TextBox1.SetFocus
End Sub
 

File đính kèm

Upvote 0
Mỗi textbox phải làm 1 lần code _Exit. Không cần setFocus, mà gán Cancel = True:

PHP:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If Me.TextBox1 = "" Then
  Cancel = True
    MsgBox "Thieu thong tin 1"
  End If
End Sub

Có bao nhiêu textbox/combobox, phải làm bấy nhiêu sub. Nếu nhiều, nên dùng class.
Đây là cách ngăn chặn bỏ trống ngay từ khi bỏ trống bất kỳ 1 control nào. Cháy 1 thùng hàng thì phải chữa cháy ngay thùng hàng đó.

Còn cách của thanhlanh là chờ cháy hết kho hàng mới chữa một lượt.

Nói thêm, Nếu code đơn giản như trên thì khi người dùng muốn hủy việc nhập liệu, cũng phải điền đầy mọi control mới đóng form được. Cho nên, cần có chỗ cho người dùng cancel (phải cháy cho cháy)

PHP:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If Me.TextBox1 = "" Then
    If MsgBox("Thieu thong tin 1", vbOKCancel) = vbOK Then
        Cancel = True
    Else
        Exit Sub
    End If
  End If
End Sub
 
Upvote 0
Mỗi textbox phải làm 1 lần code _Exit. Không cần setFocus, mà gán Cancel = True:

Có bao nhiêu textbox/combobox, phải làm bấy nhiêu sub. Nếu nhiều, nên dùng class.
...
Hay quá, cám ơn Bác PTM nhiều.
Nhờ Bác cụ thể cho việc dùng class với nhiều txtBox.
 
Upvote 0
Nói chung, mọi sub có tham số phải biết tận dụng tham số.
Còn class thì ThuNghi tham khảo game trúc xanh của Kyo, hoặc nhờ Kyo, Kyo đang lấp ló.
 
Lần chỉnh sửa cuối:
Upvote 0
Nói chung, mọi sub có tham số phải biết tận dụng tham số.
Còn class thì ThuNghi tham khảo game trúc xanh của Kyo, hoặc nhờ Kyo, Kyo đang lấp ló.
Tiện thì bác hướng dẫn luôn, làm file có 2 TxtBox đã.
Bác cón bắt em mở cái file kia ra thì quá tội em luôn.
Chấn thành hậu tạ 1 chai Vodka Hà Nội nhỏ.
 
Upvote 0
Nói chung, mọi sub có tham số phải biết tận dụng tham số.
Còn class thì ThuNghi tham khảo game trúc xanh của Kyo, hoặc nhờ Kyo, Kyo đang lấp ló.

Kyo vẫn còn mù mờ về class lắm, hồi đó chỉ được hướng dẫn cái button nên giờ gặp cái textbox thấy mụ mị luôn, chú Mỹ chỉ kyo với, hì hì
 
Upvote 0
Hay quá, cám ơn Bác PTM nhiều.
Nhờ Bác cụ thể cho việc dùng class với nhiều txtBox.
Class cho TextBox trên UserForm cũng hơi căng, vì nó hổng có sự kiện Exit (chỉ có KeyDown hoặc KeyPress thôi)
Nếu dùng KeyDown bắt phím Enter nhưng người dùng lại không Enter (mà dùng chuột để di chuyển) thì sao?
 
Upvote 0
Thực sự mà nói thì mình cũng không rành class lắm, nó hơi trừu tượng. Nhưng hình như khi định nghĩa 1 class là object nào, thì class sẽ có tất cả property, method, và event của object đó. Cái này phải hỏi siêu cao thủ.

ndu rảnh xem thử có sự kiện LostFocus không?
 
Upvote 0
ndu rảnh xem thử có sự kiện LostFocus không?
Hổng có sư phụ à (chỉ có mấy cái liên quan đến Key và Mouse thôi)
Em ví dụ dùng KeyDown nhé:
1> Code trong Class1:
PHP:
Public WithEvents tbx As MSForms.TextBox
Private Sub tbx_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Then
    If tbx.Text = "" Then
      MsgBox "Nhap thieu thong tin", vbOKOnly
    Else
      Exit Sub
    End If
  End If
End Sub
2> Code trong UserForm:
PHP:
Dim tbox() As New Class1
Private Sub UserForm_Initialize()
  Dim Ctrl As Control, n As Long
  For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.TextBox Then
      n = n + 1
      ReDim Preserve tbox(1 To n)
      Set tbox(n).tbx = Ctrl
    End If
  Next
End Sub
Và code này chỉ hoạt động khi bấm phím Enter thôi (di chuyển bằng chuột ráng chịu)
----------------
Mà nghĩ lại thấy cũng đúng:
- Sự kiện Exit hoặc LostFocus thì phải có cái gì đó làm mốc (control ta đang active)
- Dùng Class thu gom chúng thành 1 "cục". Vậy thì Exit nghĩa là sao? Một cái đang Active có nghĩa là là những cái còn lại đang Exit?
Không có mấy sự kiện ấy trong Class cũng là điều dễ hiểu
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom