programing

텍스트 상자가 활성화되면 내용을 선택하는 방법은 무엇입니까?

css3 2023. 6. 9. 22:15

텍스트 상자가 활성화되면 내용을 선택하는 방법은 무엇입니까?

나는 이 간단한 사용자 양식을 가지고 있으며, 나는 단지 가지고 있습니다.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로드된 끝에 이벤트가 작동한다는 것을 의미합니다.그러나 텍스트는 강조 표시되지 않습니다.어떻게 고칠까요?

나는 사용합니다.Entert 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

싯다르트가 제시한 해결책 외에 또 다른 해결책이 있습니다.

편집: 하지만버그가 있습니다. 그래서 제가 아래에서 제안하는 해결책은 싯다스 해결책보다 훨씬 더 좋지 않습니다.언젠가 버그가 수정될 경우를 대비해서 보관합니다.

그것은 재산에 의존합니다.EnterFieldBehaviorTextBox 필드에 있습니다.이 속성은 키를 눌러 해당 필드를 입력하고 이 속성이fmEnterFieldBehaviorSelectAll전체 필드 텍스트가 자동으로 선택됩니다.

따라서 폼이 표시될 때 필드 간에 더미 캐럿을 이동하면 기능이 자동으로 활성화됩니다.예를 들어 다음 필드로 이동하려면 를 누르고 이전 필드로 이동하려면 +를 눌러 Tab원래 필드로 이동하면 됩니다.

Private Sub UserForm_Activate()
    SendKeys "{TAB}+{TAB}"
End Sub

이 솔루션의 장점은 속성을 수동으로 편집하여 사용자 양식을 조정할 수 있다는 것입니다.EnterFieldBehavior,TabIndex,TabKeyBehavior그리고.TabStopVBA 코드를 더 이상 변경하지 않고 초기 포커스가 있는 필드에서 "모두 선택"을 설정합니다.

간단히 말해서, 위의 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