如何使TextBox一得到焦点,内容就被选中

sjtuliwei 2003-09-26 03:29:48
用VC的Edit控件做的界面,默认就是这个样子的。文本框一得到焦点,内容就被选中,这样比较容易修改。但是VB的TextBox控件,默认的是,当文本框得到焦点是,保持上一次失去焦点是的情况(原来如果有选择,现在选择的部分被高亮显示,原来如果没有选择,现在也没有选择)

很多时候,截面上有很多文本框,我们希望实现每一次文本框得到焦点时,全部内容都处于被选中的状态。我现在知道的方法是:

Private Sub Text_GotFocus()
Text.SelStart = 0
Text.SelLength = Len(Text.Text)
End Sub

如果界面上有20个文本框,这段代码就要被写20次。很容易有遗漏或者由于反复拷贝造成错误。有没有什么好的办法,可以在一个函数里对文本框设置这个功能。比如说,有没有一个函数可以实现

SetControlStyle(Text.hWnd, AutoSelectContent)

请大家积极参加讨论。谢谢!
...全文
601 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjtuliwei 2003-09-29
  • 打赏
  • 举报
回复
大家已经提了不少的意见,我很高兴。

不过还有没有新的办法呢?

Kivic,你为什么不在发言了?
begintoday 2003-09-29
  • 打赏
  • 举报
回复
把函数CSRC和SelectAllInTextbox 放到你的公用模块里,将窗体frmShowCSRC加到你的工程里
在你需要的Form中调用函数CSRC
CSRC me 将弹出窗体frmShowCSRC,生成代码。
你也可以将它加到你的Dll中调用
例如,以下是自动生成的一段代码
'以下是自动产生的'获得焦点全选' 事件 ver 1.0 09-29-2003 09:09:51
Private Sub txt1_GotFocus() 'AutoCreate
SelectAllInTextbox txt1
End sub
Private Sub txt2_GotFocus() 'AutoCreate
SelectAllInTextbox txt2
End sub
'========================================================================
而SelectAllInTextbox 是使文本全选的一个函数
begintoday 2003-09-28
  • 打赏
  • 举报
回复
在vb里,我用这样的方法,可以改到.net
Public Sub CSRC(oForm As Object)
On Error GoTo ER_Begin
' DoInit
Load oForm
ER_Begin:

On Error GoTo ER_End
Dim o As Object
Dim strCreatedCtrlArry As String '记录控件数组的名字,以 "," 分割
Dim s As String
s = "'====================== " & oForm.Name & " =================================================" & vbCrLf
s = s & "'以下是自动产生的'获得焦点全选' 事件 ver 1.0 " & FormatDateTimeToShow(Now) & vbCrLf

For Each o In oForm
If TypeName(o) = "TextBox" Or TypeName(o) = "ComboBox" Or TypeName(o) = "TDBCombo" Or TypeName(o) = "MaskEdBox" Then
' Or TypeName(o) = "CigAccountMaskEdit" 'Or TypeName(0) = "NT" , 不需要
If TypeName(o) = "TextBox" Then
If o.MultiLine = True Then
GoTo LOOP_CONTINUE
End If
End If

Dim intIndex As Integer
Err.Clear
On Error Resume Next
intIndex = o.Index
If Err.Number <> 0 Then
'不是控件数组
s = s & "Private Sub " & o.Name & "_GotFocus() 'AutoCreate" & vbCrLf
s = s & " SelectAllInTextbox " & o.Name & vbCrLf
s = s & "End sub" & vbCrLf
Else
'控件数组
If InStr(1, strCreatedCtrlArry, o.Name & ",", vbTextCompare) = 0 Then
'查找是否已经产生过该事件了
s = s & "Private Sub " & o.Name & "_GotFocus(Index As Integer) 'AutoCreate" & vbCrLf
s = s & " SelectAllInTextbox " & o.Name & "(Index)" & vbCrLf
s = s & "End sub" & vbCrLf
strCreatedCtrlArry = strCreatedCtrlArry & o.Name & ","
End If
End If
LOOP_CONTINUE:

End If
Next
s = s & "'========================================================================" & vbCrLf

ER_End:
frmShowCSRC.ShowMe s
Unload oForm
End Sub
其中frmShowCSRC代码为,放一个textbox,name为txt1
Public Sub ShowMe(strData As String)
txt1.Text = strData
Me.Show vbModal
End Sub

SelectAllInTextbox 是一个函数,
'如果 objText 是TextBox , 则令编辑框 txtBox 的文字全选
Public Sub SelectAllInTextbox(objText As Object)
On Error Resume Next
If TypeName(objText) = "TextBox" Or TypeName(objText) = "ComboBox" Then
objText.SelStart = 0
objText.SelLength = Len(objText.Text)
End If
End Sub
‘oform为所含n个textbox,ComboBox控件的窗体
rednod 2003-09-28
  • 打赏
  • 举报
回复
学习
sjtuliwei 2003-09-28
  • 打赏
  • 举报
回复
To Kivic(Kivic)

你有这方面的经验吗?能不能再多介绍一点?

我知道 GetWindowLong 可以得到它的CallBack函数地址
GetWindowLong 可以重置它的CallBack函数为我自己写的函数
但是,在自己写的这个函数里,把文本框的内容选定以后,应该再调用原来的Callback函数,才能不破坏控件原有的功能。可是我只能得到原有函数的地址,得不到它的函数名字,在VB中如何调用原来的函数?
cloud1002 2003-09-28
  • 打赏
  • 举报
回复
Dim i As Control
For Each i In Controls
If TypeOf i Is TextBox Then
i.SelStart = 0
i.SelLength = Len(i.Text)
End If
Next i
sjtuliwei 2003-09-28
  • 打赏
  • 举报
回复
To begintoday

倒是比较有创意

能跟大家解释一下你是怎么使用这段代码的吗?

我看出一些门道,但是不敢确认。

谢谢!
northwolves 2003-09-27
  • 打赏
  • 举报
回复
Private Sub Text1_GotFocus(index As Integer)
SendKeys "{home}+{end}"
End Sub
yo_jo 2003-09-27
  • 打赏
  • 举报
回复
如果你把这20多个Text控件都变成一个20维的控件数组,那样不就省事了
cansum396 2003-09-27
  • 打赏
  • 举报
回复
给你一个例子
Private Sub Form_Load()
Me.KeyPreview = True
End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
SendKeys "{TAB}"
SendKeys "{Home}+{End}"
End If
End Sub
有一个要求,你必须在设计时把每个Texbox的TabIndex设置好
当然,你也可以考虑用下面这个方法
dim i as Object
With me
For Each i In me
If TypeOf i Is TextBox Then
i.Text = ""
End If
Next i
End With
这个代码可以得到当前Form的所有类为TextBox的控件
sjtuliwei 2003-09-27
  • 打赏
  • 举报
回复
To:

Jackile(东方朔) ,这也许是一个办法,可就是缺少通用性。如果目标计算机没有注册过这个控件,就不好了。
kmzs 2003-09-27
  • 打赏
  • 举报
回复
来得晚了
T2 2003-09-27
  • 打赏
  • 举报
回复
用控件数组就可以了,一段代码解决任意个控件无须复制粘贴

Private Sub Text1_GotFocus(Index As Integer)
Text1(Index).SelStart = 0
Text1(Index).SelLength = Len(Text1(Index).Text)
End Sub


Kivic 2003-09-27
  • 打赏
  • 举报
回复
可以api拦截进程,分析消息,做到只用一个过程
Jackile 2003-09-26
  • 打赏
  • 举报
回复
那你干脆写个控件好了!
sjtuliwei 2003-09-26
  • 打赏
  • 举报
回复
首先,应该感谢这么多朋友参加讨论。

不过,我觉得以上的方法都没有解决一个问题,那就是我们必须在每个TextBox控件的GotFocus中写代码,而且代码中必须包含空间的名字。以上的很多种方法,不过是把两行代码变成了一行。

有没有办法,不用处理每一个控件的GotFocus函数?

谢谢!
MSSQL 2003-09-26
  • 打赏
  • 举报
回复
private sub SetControlStyle(TxtTmp as textbox)
txttmp.selstart=0
txttmp.sellength=len(txttmp)
end sub
ywuwgij 2003-09-26
  • 打赏
  • 举报
回复
Private Sub Text_GotFocus()
SendKeys "{Home}+{End}"
end sub
这是我常用的方法,很不错的
strongfisher 2003-09-26
  • 打赏
  • 举报
回复
用 cuizm(射天狼) ( ) 信誉:100 的
Public Sub SetControlStyle(txt As TextBox)
txt.SelStart = 0
txt.SelLength = Len(txt.Text)
End Sub
rexyudl 2003-09-26
  • 打赏
  • 举报
回复
Dim ctr As Control
For Each ctr In Controls
If TypeOf ctr Is TextBox Then
ctr.SelStart = 0
ctr.SelLength = Len(ctr.Text)
End If
Next ctr

复制200次也不会出错!
如果界面上有200个文本框,就复制200次!
全部放到文本框得到焦点的事件里!
加载更多回复(4)

1,451

社区成员

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

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