如何实现Textbox只能“显示”数字

sunshine3110 2008-05-16 04:17:10
功能如题,不但要考虑从键盘键入,还要考虑复制粘贴,鼠标右键粘贴和代码赋值。键盘部分已经实现了,麻烦的是后面。

如果粘贴的字符串只要有一个字母,该字符串就无法粘贴进去,但是也不能影响Textbox里已经存在的字符串。代码赋值也是这样。

语言的话,最好VB

另外如果各位还能考虑到其他情况也欢迎写出来。有分加,不过本人的分数不多...
...全文
210 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunshine3110 2008-05-27
  • 打赏
  • 举报
回复
謝謝大家的幫助,問題已經解決了。
這么久沒有結貼真是不好意思。
of123 2008-05-16
  • 打赏
  • 举报
回复
这样更好一些,其它字符也进不来。
Private Sub Text1_Change()
Dim p As Integer

p = Text1.SelStart

If Text1 Like "*[!.0-9]*" Then
Text1 = Text1.Tag
Text1.SelStart = p

Else
Text1.Tag = Text1
End If
End Sub
of123 2008-05-16
  • 打赏
  • 举报
回复
如果允许使用 Change 事件(没有闪动),应该是非常简单的。

Private Sub Text1_Change()
Dim p As Integer

p = Text1.SelStart

If Text1 Like "*[A-Za-z]*" Then
Text1 = Text1.Tag
Text1.SelStart = p

Else
Text1.Tag = Text1
End If
End Sub
tanjiunnya 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sunshine3110 的回复:]
还是不对啊……,已经明确了不能在changed事件里面了,怪我表达不清楚。不好意思

根本的思路是,获得即将要写入的字符串,如果不是数字就不让写入,就是代码不知道怎么实现了。
[/Quote]

13楼给你的思路,就是我给你的代码范例。
如果是写入的,你就用KeyPress, KeyDown 来捕抓吧。
sunshine3110 2008-05-16
  • 打赏
  • 举报
回复
还是不对啊……,已经明确了不能在changed事件里面了,怪我表达不清楚。不好意思

根本的思路是,获得即将要写入的字符串,如果不是数字就不让写入,就是代码不知道怎么实现了。
tanjiunnya 2008-05-16
  • 打赏
  • 举报
回复
刚才笔误了,把楼上的 Test1_Change() 更正为 Text1_Change()
tanjiunnya 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sunshine3110 的回复:]
引用 13 楼 myjian 的回复:
他爱输入什么输入什么,在使用数据的时候判断一下就行了,IsNumeric(),不合格的输入就让他重新输入

//

顶顶这个思路.

这是在关键路口设关卡.

这确实是我要的思路
可否给一些事例代码,因为我的经验还不是很深,谢谢。
[/Quote]

Private Sub Test1_Change()
If IsNumeric(Text1) Then
'是数字,允许通过
:
:
Else
'不是数字,显示错误信息
MsgBox "输入错误,请输入正确的数字!"
Text1.SetFocus
Text1.SelStart = 0
Text1.SelLength = Len(Text1)
End If
End Sub
Michael_Zang 2008-05-16
  • 打赏
  • 举报
回复
我也关注
sunshine3110 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 myjian 的回复:]
他爱输入什么输入什么,在使用数据的时候判断一下就行了,IsNumeric(),不合格的输入就让他重新输入

//

顶顶这个思路.

这是在关键路口设关卡.
[/Quote]
这确实是我要的思路
可否给一些事例代码,因为我的经验还不是很深,谢谢。
sunshine3110 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Tiger_Zhao 的回复:]
如果原先是 "1",再粘贴加上 "23 ",你期望结果是什么?
如果通过 Change 中过滤,结果是 "123",一样是合法的。
[/Quote]
不错的想法,
这种情况就是直接衔接的关系,没有运算,和字符串一样,光标停在哪里就插到哪里。
嗷嗷叫的老马 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dbcontrols 的回复:]
你的思路不对
他爱输入什么输入什么,在使用数据的时候判断一下就行了,IsNumeric(),不合格的输入就让他重新输入

引用 2 楼 sunshine3110 的回复:
判断是比较容易,但是处理就不容易了
[/Quote]

//

顶顶这个思路.

这是在关键路口设关卡.
Tiger_Zhao 2008-05-16
  • 打赏
  • 举报
回复
如果原先是 "1",再粘贴加上 "23 ",你期望结果是什么?
如果通过 Change 中过滤,结果是 "123",一样是合法的。
dbcontrols 2008-05-16
  • 打赏
  • 举报
回复
你的思路不对
他爱输入什么输入什么,在使用数据的时候判断一下就行了,IsNumeric(),不合格的输入就让他重新输入

[Quote=引用 2 楼 sunshine3110 的回复:]
判断是比较容易,但是处理就不容易了
[/Quote]
sunshine3110 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Tiger_Zhao 的回复:]

因为用户一次只能操作一个控件,单个控件的闪烁是看不出来的。
变换前的文本根本不用关心,只要保证变换后始终是合法的就可以了。
[/Quote]

应该还是要的,因为不能影响原先已经在里面的文本,而changed事件文本已经改变了。
我觉得7楼的myjian 思路对头,现在的关键问题就是获取要写入的值,符合要求的进来,不符合的出去,这是最好的。
就是代码不知道写在那里,该怎么写了……
Tiger_Zhao 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sunshine3110 的回复:]

其实……这个也不太符合要求,因为在变换以后再做处理有可能出现文字闪一下的情况。
而且如何获取变换之前的文本呢?
[/Quote]

因为用户一次只能操作一个控件,单个控件的闪烁是看不出来的。
变换前的文本根本不用关心,只要保证变换后始终是合法的就可以了。
tanjiunnya 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sunshine3110 的回复:]
引用 1 楼 tanjiunnya 的回复:
在keypress / keydown 用keycode / ascii code做判断
也可以用 IsNumeric()来判断。


首先谢谢你的回答,不过这只是对键盘的判断,还有复制粘贴和鼠标右键粘贴以及直接赋值该如何处理,
[/Quote]

嗯。粘贴的过程可以通过Change来进行判断。
嗷嗷叫的老马 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 sunshine3110 的帖子:]
如果粘贴的字符串只要有一个字母,该字符串就无法粘贴进去,但是也不能影响Textbox里已经存在的字符串。代码赋值也是这样。
[/Quote]

给你思路:

子类化拦截粘贴消息已经做到了.

只需要在这个消息到来时对当前剪贴板内容做一次过滤即可.

至于"代码赋值也是这样",为什么不使用一个预处理函数先处理好要准备赋值的内容呢?

要靠一个控件这样来限制,你那个软件也应该重写了.
sunshine3110 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Tiger_Zhao 的回复:]
在 Change 事件中将不合法的字符删除,注意根据删除的位置调整 SelStart、SelLength 属性
[/Quote]
其实……这个也不太符合要求,因为在变换以后再做处理有可能出现文字闪一下的情况。
而且如何获取变换之前的文本呢?
sunshine3110 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tanjiunnya 的回复:]
在keypress / keydown 用keycode / ascii code做判断
也可以用 IsNumeric()来判断。
[/Quote]

首先谢谢你的回答,不过这只是对键盘的判断,还有复制粘贴和鼠标右键粘贴以及直接赋值该如何处理,
加载更多回复(3)

1,451

社区成员

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

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