Vấn đề thuộc tính của Textbox/ Combobox

Liên hệ QC

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,720
Giới tính
Nam
Trong mấy cái Textbox/ Combobox của Window, tôi nhận thấy khi đặt con trỏ vào đó, nó tự phủ khối toàn bộ nội dung của chuỗi. Nhưng khi click chuột vào ký tự nào đó trong chuỗi thì con trỏ đặt đúng ký tự đó mà không phủ khối. Vậy có cách nào, thuộc tính nào để làm được như vậy không? Tôi làm code sau đây giải quyết được vấn đề phủ khối khi đặt trỏ, nhưng để đặt con trỏ đúng ký tự cho lần click thứ 2 trở đi thì nó vẫn cứ phủ khối, như vậy cũng không phải là giải pháp.
PHP:
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  With TextBox1
   .SelStart = 0: .SelLength = Len(.Text)
  End With
End Sub

Kính mong các Thầy, các cao thủ hướng dẫn. Xin cám ơn.
 

File đính kèm

Trong mấy cái Textbox/ Combobox của Window, tôi nhận thấy khi đặt con trỏ vào đó, nó tự phủ khối toàn bộ nội dung của chuỗi. Nhưng khi click chuột vào ký tự nào đó trong chuỗi thì con trỏ đặt đúng ký tự đó mà không phủ khối. Vậy có cách nào, thuộc tính nào để làm được như vậy không? Tôi làm code sau đây giải quyết được vấn đề phủ khối khi đặt trỏ, nhưng để đặt con trỏ đúng ký tự cho lần click thứ 2 trở đi thì nó vẫn cứ phủ khối, như vậy cũng không phải là giải pháp.
.
Nếu có từ 2 Control trở lên thì đơn giản là... chẳng cần code nào cả ---> Mổi lần bấm Tab để chuyển Focus thì nó sẽ tự tô khối toàn bộ Text, click chuột vào sẽ chuyển sang trạng thái Edit
 
Upvote 0
Nếu có từ 2 Control trở lên thì đơn giản là... chẳng cần code nào cả ---> Mổi lần bấm Tab để chuyển Focus thì nó sẽ tự tô khối toàn bộ Text, click chuột vào sẽ chuyển sang trạng thái Edit

Nếu như vậy thì em đâu hỏi làm gì đúng không Thầy? Giống như cái search web trên Explorer cũng vậy, chỉ cần chạm vào địa chỉ web là nó phủ khối toàn bộ, còn edit thì nó đặt đúng con trỏ vậy.

Dùng Form để đặt nhiều control, muốn tab thì phải chịu tác động của TabIndex còn mình muốn đặt vào bất cứ control nào cũng như vậy thì mới là vấn đề.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu như vậy thì em đâu hỏi làm gì đúng không Thầy? Giống như cái search web trên Explorer cũng vậy, chỉ cần chạm vào địa chỉ web là nó phủ khối toàn bộ, còn edit thì nó đặt đúng con trỏ vậy.

Dùng Form để đặt nhiều control, muốn tab thì phải chịu tác động của TabIndex còn mình muốn đặt vào bất cứ control nào cũng như vậy thì mới là vấn đề.
Chưa nghĩ ra đựoc cách nào đơn giản hơn nếu không dùng SetTimer
1> Trong Module
PHP:
Private Declare Function SetTimer Lib "user32" _
  (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Public iT As Long, hWnd As Long
PHP:
Private Sub ScanPointer()
  iT = iT + 1
End Sub
PHP:
Sub StartScan()
  StopScan
  iT = 0
  SetTimer hWnd, 1, 1, AddressOf ScanPointer
End Sub
PHP:
Sub StopScan()
  KillTimer hWnd, 1
  iT = 0
End Sub

2> Trong UserForm

PHP:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
PHP:
Private Sub TextBox1_Enter()
  StopScan
  iT = 0
End Sub
PHP:
Private Sub TextBox2_Enter()
  StopScan
  iT = 0
End Sub
PHP:
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  If iT = 0 Then
    With TextBox1
      .SelStart = 0: .SelLength = Len(.Text)
    End With
  End If
  StartScan
End Sub
PHP:
Private Sub TextBox2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  If iT = 0 Then
    With TextBox2
      .SelStart = 0: .SelLength = Len(.Text)
    End With
  End If
  StartScan
End Sub
PHP:
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
End Sub
PHP:
Private Sub UserForm_Terminate()
  StopScan
  iT = 0
End Sub
Hic... Test thử thế nào nhé
Nếu quá nhiều Control, e rằng phải dùng đến ClassModule để thu gom (rút gọn code) ---> Cái này bạn tham khảo bài viết về Class và tự làm nhé
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Wow, SetTimer giải quyết được nhiều vấn đề thú vị thật. Đúng là giải pháp em cần, Thầy đúng là ấn tượng!

Cám ơn Thầy rất nhiều! Em mới có học hỏi đến Module, giờ lại bước thêm vào quãng đường chông gai ClassModule đây! Càng học thấy mình càng tệ, chẳng hiểu sao!
 
Upvote 0
Wow, SetTimer giải quyết được nhiều vấn đề thú vị thật. Đúng là giải pháp em cần, Thầy đúng là ấn tượng!

Cám ơn Thầy rất nhiều! Em mới có học hỏi đến Module, giờ lại bước thêm vào quãng đường chông gai ClassModule đây! Càng học thấy mình càng tệ, chẳng hiểu sao!
Class chẳng khó như bạn nghĩ đâu ---> Càng học sẽ thấy... ghiền ngay!
-------------
Nói thêm 1 chút về GIỚI HẠN của code
- Ta khai báo iT là biến Long
- Ta biết biến Long có giới hạn Max khoảng 2,000,000,000
- Hàm ScanPointer hoạt động theo chu kỳ 1/1000 giây, mổi chu kỳ nó cộng iT thêm 1 đơn vị ----> Vị chi sau 2 triệu giây thì biến iT sẽ bị.. "tràn"
- 2 triệu giây gần tưong đưong với khoảng 24 ngày
- Vậy theo lý thuyết, nếu Form này mở liên tục trong 24 ngày thì sẽ bị lỗi
Ẹc... Ẹc... Phùùùùùùùùù --=0
 
Upvote 0
Class chẳng khó như bạn nghĩ đâu ---> Càng học sẽ thấy... ghiền ngay!
-------------
Nói thêm 1 chút về GIỚI HẠN của code
- Ta khai báo iT là biến Long
- Ta biết biến Long có giới hạn Max khoảng 2,000,000,000
- Hàm ScanPointer hoạt động theo chu kỳ 1/1000 giây, mổi chu kỳ nó cộng iT thêm 1 đơn vị ----> Vị chi sau 2 triệu giây thì biến iT sẽ bị.. "tràn"
- 2 triệu giây gần tưong đưong với khoảng 24 ngày
- Vậy theo lý thuyết, nếu Form này mở liên tục trong 24 ngày thì sẽ bị lỗi
Ẹc... Ẹc... Phùùùùùùùùù --=0

Một lần nữa em cám ơn Thầy. Em lại có một chút thắc mắc nữa nếu như load form lên em đã cho tô khối cái Textbox1, vậy khi chạm vào phải chạm đến 2 lần nó mới bình thường, vậy làm cách nào trong cái Form của Thầy hướng dẫn nó hiểu rằng khi đang tô khối thì chạm vào nó cho edit như setfocus?

PHP:
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  With TextBox1
    .SetFocus: .SelStart = 0: .SelLength = Len(.Text)
  End With
End Sub

"Được voi đòi hai bà Trưng" mong Thầy thông cảm!
 
Upvote 0
Một lần nữa em cám ơn Thầy. Em lại có một chút thắc mắc nữa nếu như load form lên em đã cho tô khối cái Textbox1, vậy khi chạm vào phải chạm đến 2 lần nó mới bình thường, vậy làm cách nào trong cái Form của Thầy hướng dẫn nó hiểu rằng khi đang tô khối thì chạm vào nó cho edit như setfocus?

PHP:
Private Sub UserForm_Initialize()
  hWnd = FindWindow("ThunderDFrame", Me.Caption)
  With TextBox1
    .SetFocus: .SelStart = 0: .SelLength = Len(.Text)
  End With
End Sub
"Được voi đòi hai bà Trưng" mong Thầy thông cảm!
Chưa nghĩ ra vấn đề này, có điều xin đơn giản code trên mà không cần SetTimer (nhiều lúc nghĩ xa xôi đam ra... NGU)
PHP:
Private isFocus As Boolean
PHP:
Private Sub TextBox1_Enter()
  isFocus = False
End Sub
PHP:
Private Sub TextBox2_Enter()
  isFocus = False
End Sub
PHP:
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  If isFocus = False Then
    With TextBox1
      .SelStart = 0: .SelLength = Len(.Text)
    End With
  End If
  isFocus = True
End Sub
PHP:
Private Sub TextBox2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  If isFocus = False Then
    With TextBox2
      .SelStart = 0: .SelLength = Len(.Text)
    End With
  End If
  isFocus = True
End Sub
PHP:
Private Sub UserForm_Initialize()
  isFocus = False
End Sub
Cái vụ bạn vừa hỏi, bạn tự nghiên cứu đi ---> IF éc gì gì đó
 
Upvote 0
Chắc tại em tệ quá mà IF cái kiểu gì nó cũng hỏng cho ra được Thầy ui. Chẳng hạn như:

PHP:
If TextBox1.SelStart = 0 And TextBox1.SelLength = Len(TextBox1.Text) Then Exit Sub

Nó không những trơ trơ ra, mà còn làm trái lại cái code ban đầu nữa chứ!
 
Upvote 0
Chắc tại em tệ quá mà IF cái kiểu gì nó cũng hỏng cho ra được Thầy ui. Chẳng hạn như:

PHP:
If TextBox1.SelStart = 0 And TextBox1.SelLength = Len(TextBox1.Text) Then Exit Sub
Nó không những trơ trơ ra, mà còn làm trái lại cái code ban đầu nữa chứ!
Làm biếng nghiên cứu quá (vì câu hỏi này... không hay)
Ẹc... Ẹc...
Bùn lắm thì vầy:
PHP:
Private isFocus As Boolean, st As Boolean
PHP:
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  If isFocus = False And st Then
    With TextBox1
      .SelStart = 0: .SelLength = Len(.Text)
    End With
  End If
  isFocus = True: st = True
End Sub
PHP:
Private Sub TextBox2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  If isFocus = False Then
    With TextBox2
      .SelStart = 0: .SelLength = Len(.Text)
    End With
  End If
  isFocus = True: st = True
End Sub
PHP:
Private Sub UserForm_Initialize()
  isFocus = False: st = False
  With TextBox1
    .SetFocus: .SelStart = 0: .SelLength = Len(.Text)
  End With
End Sub
Các đọan code còn lại giữ nguyên
 
Upvote 0
Web KT

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

Back
Top Bottom