텍스트 상자가 활성화되면 내용을 선택하는 방법은 무엇입니까?
나는 이 간단한 사용자 양식을 가지고 있으며, 나는 단지 가지고 있습니다.TextBox1
그리고.TextBox2
저는 두 가지 모두에 텍스트를 입력합니다.( 커이점있다가다초고안정합니에가서▁TextBox2
가 릭클시를 TextBox1
이 컨트롤의 전체 텍스트를 강조 표시(선택)합니다.따라서 다음 코드를 사용합니다.
Private Sub TextBox1_Enter()
With TextBox1
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
MsgBox "enter event was fired"
End Sub
이 .MsgBox
로드된 끝에 이벤트가 작동한다는 것을 의미합니다.그러나 텍스트는 강조 표시되지 않습니다.어떻게 고칠까요?
나는 사용합니다.Enter
t to the 벤트를않습다니싶.MouseDown
이벤트, 왜냐하면 나는 또한 작동하기 위해 코드가 필요하기 때문입니다.TextBox1
프로그램적으로 활성화되어 있습니다. 그래서 저는 느낍니다.Enter
두 경우 모두 발사되기 때문에 최고의 선택이 되는 이벤트!의 또 MouseDown
이벤트는: 내가 두 번째로 클릭했을 때입니다.TextBox1
포커스가 첫 번째 클릭에 설정되어 있고 동일한 컨트롤을 두 번째 클릭한 후에도 변경되지 않았기 때문에 더 이상 전체 텍스트가 강조 표시되지 않을 것으로 예상합니다. 따라서 이 경우 커서가 정상적으로 작동하기를 원합니다(텍스트를 계속 표시하지 않음).
▁▁on▁once를 한 번 했을 때.TextBox1
과 같은 결과를 합니다: 다과같결기대합니다를과은음다.
다시 클릭하면 강조 표시가 제거되고 커서가 클릭된 위치에 배치됩니다.
이보다 더 간단한 것은...
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
텍스트 상자를 클릭하든 탭을 클릭하든 원하는 대로 됩니다.텍스트 선택을 취소하려면 화살표 키를 사용합니다.
설명.
만약 당신이 코드를 디버그한다면 당신은 당신이 말했다 하더라도 그것을 볼 것입니다..SetFocus
텍스트 상자에 포커스가 없습니다. .SetFocus
에서 TextBox1_Enter()
나머지 코드가 작동하려면 집중력이 필요합니다.그래서 나의 대안은...
대안
또한 이 버전을 좋아할 수도 있습니다 :) 이것은 텍스트 상자에서 마우스를 사용하는 것의 한계를 극복합니다.
Dim boolEnter As Boolean
Private Sub TextBox1_Enter()
boolEnter = True
End Sub
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
If boolEnter = True Then
With TextBox1
.SelStart = 0
.SelLength = Len(.Text)
End With
boolEnter = False
End If
End Sub
Pff, 시간이 좀 걸렸어요.실제로 코드는 작동하지만 클릭 이벤트가 발생하기 전에 텍스트를 강조 표시합니다.따라서 상자를 클릭하면 코드에 의해 생성된 선택 항목이 즉시 재정의됩니다.지연된 선택지를 사용했는데 효과가 있습니다. 좀 역겹긴 하지만...
텍스트 상자의 코드:
Private Sub TextBox1_Enter()
Application.OnTime Now + TimeValue("00:00:01"), "module1.SelectText1"
End Sub
Private Sub TextBox2_Enter()
Application.OnTime Now, "module1.SelectText2"
End Sub
{+TimeValue("00:00:01")} 부분이 없어도 작동하지만 이론적으로 작동이 중지될 수 있습니다.흠, 다시 생각해 보니, 그냥 그것을 빼놓으세요.그것이 문제를 일으킬지 의심스럽습니다.
이제 모듈 1의 코드:
Sub SelectText1()
UserForm1.TextBox1.SelStart = 0
UserForm1.TextBox1.SelLength = Len(UserForm1.TextBox1.Text)
End Sub
Sub SelectText2()
UserForm1.TextBox2.SelStart = 0
UserForm1.TextBox2.SelLength = Len(UserForm1.TextBox2.Text)
End Sub
이것이 당신에게도 효과가 있기를 바랍니다.흥미로운 문제입니다.:) 건배!
다음에 오는 마우스다운 및 마우스업 이벤트가 선택 항목을 다소 재설정하고 있기 때문에 Enter 이벤트에서 텍스트를 선택/강조하지 못했습니다.
당신이 원하는 것을 성취하는 가장 적절한 방법은 다음과 같습니다.
' if you want to allow highlight more then once, reset the variable LastEntered prior to call SelectTboxText:
' LastEntered = ""
' SelectTboxText TextBox2
Dim LastEntered As String
' Button to select Textbox1
Private Sub CommandButton1_Click()
SelectTboxText TextBox1
End Sub
' Button to select Textbox2
Private Sub CommandButton2_Click()
SelectTboxText TextBox2
End Sub
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
SelectTboxText TextBox1
End Sub
Private Sub TextBox2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
SelectTboxText TextBox2
End Sub
Public Sub SelectTboxText(ByRef tBox As MSForms.TextBox)
If LastEntered <> tBox.Name Then
LastEntered = tBox.Name
With tBox
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
End If
End Sub
따라서 프로그래밍 방식으로 텍스트 상자 중 하나를 활성화할 때마다 하위 SelectTboxText를 호출해야 합니다. 이는 IMO를 성가시게 하지 않습니다.예를 들어 이것을 위해 두 개의 버튼을 만들었습니다.
이것은 @vacip이 게시한 내용을 다소 개선한 것입니다.각 새 텍스트 상자에 대해 모듈에 별도의 방법을 추가할 필요가 없습니다.
사용자 양식의 다음 코드:
'===== User Form Code ========
Option Explicit
Private Sub TextBox1_Enter()
OnTextBoxEnter
End Sub
Private Sub TextBox2_Enter()
OnTextBoxEnter
End Sub
Private Sub TextBox3_Enter()
OnTextBoxEnter
End Sub
모듈에 포함되는 코드는 다음과 같습니다.
'===== Module Code ========
Sub SelectAllText()
SendKeys "{HOME}+{END}", True
End Sub
Sub OnTextBoxEnter()
Application.OnTime Now + 0.00001, "SelectAllText", Now + 0.00002
End Sub
Private Sub UserForm_Initialize()
TextBox1.SetFocus
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1.Text)
End Sub
양식 코드에 추가
이것이 시대에 뒤떨어진 것이라는 것을 알지만, 제 입장에 있는 누군가에게 도움이 될 경우를 대비해 이것을 여기에 두고 갑니다.
제가 원하는 것은:
- 상자를 처음 클릭하는 경우: 모든 텍스트 선택
- 나중에 클릭한 경우: 마우스가 있는 위치에 커서를 놓고 마우스를 사용하여 하위 문자열을 선택할 수 있습니다.
먼저 텍스트 상자에 탭할 때 "모든 텍스트 선택"이 기본 동작이고 텍스트 상자를 클릭할 때 "여기에 커서 놓기"가 기본 동작이므로 마우스가 무엇을 하고 있는지만 걱정하면 됩니다.
이를 위해 활성 컨트롤을 추적할 수 있지만 마우스가 텍스트 상자 위로 이동하는 동안만(즉, 클릭 전)
코드:
Private m_ActiveControlName As String
Private Sub Text1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
m_ActiveControlName = Me.ActiveControl.Name
End Sub
Private Sub Text1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If m_ActiveControlName <> Me.Text1.Name Then
Call Text1_Enter 'we don't have to use Text1_Enter for this, any method will do
Exit Sub 'quit here so that VBA doesn't finish doing its default Click behaviour
End If
End Sub
Private Sub Text1_Enter()
With Text1
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub
싯다르트가 제시한 해결책 외에 또 다른 해결책이 있습니다.
편집: 하지만 의 버그가 있습니다. 그래서 제가 아래에서 제안하는 해결책은 싯다스 해결책보다 훨씬 더 좋지 않습니다.언젠가 버그가 수정될 경우를 대비해서 보관합니다.
그것은 재산에 의존합니다.EnterFieldBehavior
TextBox 필드에 있습니다.이 속성은 키를 눌러 해당 필드를 입력하고 이 속성이fmEnterFieldBehaviorSelectAll
전체 필드 텍스트가 자동으로 선택됩니다.
따라서 폼이 표시될 때 필드 간에 더미 캐럿을 이동하면 기능이 자동으로 활성화됩니다.예를 들어 다음 필드로 이동하려면 를 누르고 이전 필드로 이동하려면 +를 눌러 Tab원래 필드로 이동하면 됩니다.
Private Sub UserForm_Activate()
SendKeys "{TAB}+{TAB}"
End Sub
이 솔루션의 장점은 속성을 수동으로 편집하여 사용자 양식을 조정할 수 있다는 것입니다.EnterFieldBehavior
,TabIndex
,TabKeyBehavior
그리고.TabStop
VBA 코드를 더 이상 변경하지 않고 초기 포커스가 있는 필드에서 "모두 선택"을 설정합니다.
간단히 말해서, 위의 VBA 코드는 속성을 고려하라고 말합니다.EnterFieldBehavior
사용자 양식이 표시될 때 초기 포커스가 있는 필드입니다(물론 TextBox 또는 ComboBox 필드인 경우).
이것을 사용합니다.
Private Sub TextBox1_Enter()
With TextBox2
.ForeColor = vbBlack
.Font.Bold = False
End With
With TextBox1
.ForeColor = vbRed
.Font.Bold = True
End With
End Sub
Private Sub TextBox2_Enter()
With TextBox1
.ForeColor = vbBlack
.Font.Bold = False
End With
With TextBox2
.ForeColor = vbRed
.Font.Bold = True
End With
End Sub
구현하려는 동작이 이미 기본 제공됩니다.TextBox
텍스트 상자의 왼쪽 위로 마우스를 이동하면 마우스 포인터가 오른쪽을 가리킵니다.클릭하면 필드의 모든 텍스트가 선택됩니다.다른 곳을 클릭하면 텍스트가 선택 취소됩니다.
이 작업을 하나의 Sub에서 수행할 수 있는지 확인하기 위해 몇 가지 다른 전략을 시도해 보겠습니다.
다과같 사용드코와 같은 를 사용해 .TextBox1_MouseDown
있을 .그건 작동할 거야.
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
With TextBox1
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
MsgBox "Text in TextBox1 is selected"
End Sub
언급URL : https://stackoverflow.com/questions/30117252/how-to-select-the-contents-of-a-textbox-once-it-is-activated
'programing' 카테고리의 다른 글
python/matplotlib을 사용하여 3D 플롯에 대한 "카메라 위치"를 설정하는 방법은 무엇입니까? (0) | 2023.06.09 |
---|---|
Vuex getter는 항상 null을 반환합니다. (0) | 2023.06.09 |
인덱스 변수 없이 N번 무언가를 하는 파이썬적인 방법? (0) | 2023.06.04 |
소스에서 R 패키지를 설치하려면 어떻게 해야 합니까? (0) | 2023.06.04 |
커밋에 모든 파일을 나열하려면 어떻게 해야 합니까? (0) | 2023.06.04 |