VB6中如何让很多独立文本框中的某一个获得焦点时选中其全部内容

Auguk_Hdp 2012-09-20 02:09:52
寻求帮助:窗体中有很多独立文本框控件,按照TabIndex的顺序逐个选择,希望在选择其中每一个文本框控件时(该文本框获得焦点),选中该文本框中全部内容。

已经试过的方法:1) Form_KeyUp(KeyCode As Integer, Shift As Integer),失败,按Tab是不会触发KeyUp事件
2)
Private Sub Text2_GotFocus()
Text2.SelStart = 0
Text2.SelLength = Len(Text2.Text)
End Sub
因为文本框控件很多,希望能用子程序得到想要的结果,而不是对每一个文本框控件都加上这一段代码。

本人学习VB不久,还请大家不吝赐教,谢谢!
...全文
947 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-07-25
  • 打赏
  • 举报
回复
高手都写类 超过6个字啦
楚狂歌 2013-11-22
  • 打赏
  • 举报
回复
javamy001 2013-09-07
  • 打赏
  • 举报
回复
好帖子啊,学习啦!!
致追风 2013-05-15
  • 打赏
  • 举报
回复
学习了.我本来想写一个过程,就 是将所有的textbox控件的key_up事件里加一组代码,实现用户按回车键时,焦点转移到下一个textbox,也就是将tab键的功能转移到Enter键上.要实现这个功能可能全复制粘贴一堆的相同代码,过会儿用yachong(蚜虫)的代码试试,看能不能实现.
Auguk_Hdp 2012-09-29
  • 打赏
  • 举报
回复
谢谢大家的回答,我使用了yachong(蚜虫),建立一个类模块的方法,可以解决我的问题。另外,我也想使用控件数组,不过在实际中确实有办法使用控件数组。谢谢!
Auguk_Hdp 2012-09-29
  • 打赏
  • 举报
回复
谢谢大家的回复,前一阵儿生病了,没有上,我把大家的方法都试一下再过来回复,谢谢!
sosoben 2012-09-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

建立一个类模块,模块名clsText
代码:
Public WithEvents oText As TextBox
Private Sub oText_GotFocus()
oText.SelStart = 0
oText.SelLength = Len(oText.Text)
End Sub
------------------------------------……
[/Quote]

学习了 但未试过行不行
贝隆 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
选择的动作是谁做的?

一个解决方法就是利用控件数组。也就是将头一个文本框的 Index 属性填入 0。然后将其他的文本框改为与它同名,使 Index 递增。或者将其他文本框都删除,然后复制第一个,粘贴、粘贴……

Private Sub Text1_GotFocus(Index As Integer)
Text1(Index).SelStart = 0
Text1(Index……
[/Quote]
+1
yachong 2012-09-21
  • 打赏
  • 举报
回复
这个可以做,N年前做过类似的
代码早就没有了
c_cyd2008 2012-09-21
  • 打赏
  • 举报
回复
也给一个方案,通过拦截父窗口的EN_SETFOCUS来得到获得焦点的文本框句柄,转化为VB的TextBox的引用,由引用来处理所有TextBox的事件
模块代码:

Option Explicit
Public Const EN_SETFOCUS = &H100
Public Const EM_SETSEL = &HB1
Public Const WM_COMMAND = &H111
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public oldproc As Long
Public Function myWndproc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_COMMAND Then
Dim code As Long
code = (wParam And &HFFFF0000) / &H10000
'响应TextBox发送给父窗口的 EN_SETFOCUS
If code = EN_SETFOCUS Then
'这里不直接发送EM_SETSEL,原因是控件通过鼠标获得焦点会把选择取消(tab切换的没问题)
'所以转过弯,通过form1.focusTextBox来处理
Form1.setfocustextboxfromhwnd lParam
' SendMessage lParam, EM_SETSEL, 0, -1
End If
End If
myWndproc = CallWindowProc(oldproc, hwnd, uMsg, wParam, lParam)
End Function

Public Sub hook(hwnd As Long)
oldproc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf myWndproc)
End Sub

Public Sub unhook(hwnd As Long)
SetWindowLong hwnd, GWL_WNDPROC, oldproc
End Sub


窗体代码:

Option Explicit
Private WithEvents focusTextBox As TextBox '具有焦点的TextBox的引用,响应TextBox的事件

Private Sub focusTextBox_GotFocus()
SendMessage focusTextBox.hwnd, EM_SETSEL, 0, -1
End Sub

Public Function setfocustextboxfromhwnd(hwnd As Long)
'找出具有焦点的TextBox,交由focusTextBox处理事件
Dim obj As Object
For Each obj In Me.Controls
If TypeName(obj) = "TextBox" Then
If obj.hwnd = hwnd Then
Set focusTextBox = obj
End If
End If
Next
End Function

Private Sub Form_Load()
hook Me.hwnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
unhook Me.hwnd
End Sub


舉杯邀明月 2012-09-21
  • 打赏
  • 举报
回复
蚜虫的方法看起来比较简单。

of123 2012-09-21
  • 打赏
  • 举报
回复

哦,没有试过,也许可以:

Me.ActiveControl.SelStart = 0
Me.ActiveControl.SelLength = Len(Me.ActiveControl.Text)
of123 2012-09-21
  • 打赏
  • 举报
回复

用控件数组是最简单的。你放弃它,就是给自己设置障碍。

也许,你可以设置鼠标和键盘钩子,或用定时器定时,来抓取当前的 Me.ActiveControl.Name,判断是否 TextBox 以及是否与上一次抓到的不同。如果是,则还要:

Select Case Me.ActiveControl.Name
Case "Text1"
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
Case "Text2"
Text2.SelStart = 0
Text2.SelLength = Len(Text2.Text)
......
End Select

比你在每一个 TextBox 的 GotFocus 事件中写代码一点不省事。
lliai 2012-09-21
  • 打赏
  • 举报
回复
用Getfocus
Private Sub Text2_GotFocus()
Text2.SelStart = 0
Text2.SelLength = Len(Text2.Text)
End Sub

yachong 2012-09-21
  • 打赏
  • 举报
回复
楼上错字
不知-->不止
yachong 2012-09-21
  • 打赏
  • 举报
回复
建立一个类模块,模块名clsText
代码:
Public WithEvents oText As TextBox
Private Sub oText_GotFocus()
oText.SelStart = 0
oText.SelLength = Len(oText.Text)
End Sub
------------------------------------------------------
在主窗体代码写这么几句:
Dim o() As clsText

Private Sub Form_Load()
Dim x As Object
Dim n As Long
For Each x In Me.Controls
If TypeOf x Is TextBox Then
ReDim Preserve o(0 To n) As clsText
Set o(n) = New clsText
Set o(n).oText = x
n = n + 1
End If
Next
End Sub
----------------------------------------------
这就行了。

这个办法不知能处理楼主说的选定文本的问题。
如果好好写一下类模块的代码,还可以把窗体所有的文本框的数据格式统一到同一个地方做格式检查。

嗷嗷叫的老马 2012-09-20
  • 打赏
  • 举报
回复
如果不能使用控件数组,还有一个方案比较简单,就是不断获取当前焦点控件的句柄,如果与上一个保存的句柄不同,就说明用户切换了控件.

这时应该保存这个新的句柄,用于重入判断,保证只在切换焦点后的第一次执行下面的过程.

此时向新的句柄发送一个em_setsel消息,就可以全选了.

代码如下:

'窗体中需要一个定时器,周期设置为50ms.
Option Explicit

Private Declare Function GetFocus Lib "user32.dll" () As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any) As Long
Private Const EM_SETSEL As Long = &HB1

Private Sub Timer1_Timer()
Static lastWnd As Long '上一次的句柄
Dim curWnd As Long '本次获取的句柄

curWnd = GetFocus '获取当前拥有焦点的控件的句柄
If curWnd = lastWnd Then Exit Sub '如果与上次的句柄相同,则退出,避免干扰用户输入

lastWnd = curWnd '如果执行到了这里,说明句柄不同了,则保存新的句柄
Call SendMessage(lastWnd, EM_SETSEL, 0, ByVal -1) '再向新的句柄发送全选消息
End Sub
思考 2012-09-20
  • 打赏
  • 举报
回复
Private Sub Text2_GotFocus()
Text2.SelStart = 0
Text2.SelLength = Len(Text2.Text)
End Sub

这样Tab切换,或鼠标点,会全部选中的啊
Auguk_Hdp 2012-09-20
  • 打赏
  • 举报
回复
选择动作是用户做的。如果常规的方法不能解决,有没有其他非常规方法?比如说API,谁知道请提供一下思路,这个问题我终是要解决的。
of123 2012-09-20
  • 打赏
  • 举报
回复

如果你的选择动作是用户做的,你需要通过事件来触发,告诉你,没有办法。

也许有人会告诉你,用 Timer 定时查询,但会有意想不到的问题。可能要采用不少的规避策略才能好用。


加载更多回复(6)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧