如何让用户不能更改TextBox中的文本内容

iflyer 2002-06-07 06:10:28
将Locked属性设为True,用户可以通过复制粘贴更改。
将Enable属性设为False,用户事件不能响应。
有没有其它办法?
...全文
560 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolfzhang 2002-06-10
  • 打赏
  • 举报
回复
谢谢各位朋友!

Wolfzhang(屁屁狗):我试了一下你方法,好像TextBox控件总在Label控件上面,Label控件无法响应用户事件,采用“移至顶层”、“移至底层”也没用,怎么解决?

回:
你将text控件的Enable设为false
虽然label控件在text下,但照样可以达到响应用户事件的目的
================
我还有个方法
你就用label控件模拟text控件,只要将其boderstyle设为1,同时在程序中通过改变label1.caption来显示或改变你要在显示的内容。
如:label1.caption=“123”
fangyds 2002-06-08
  • 打赏
  • 举报
回复
用SendMessage函数为TextBox(或RichTextBox)控件发送EM_SetReadOnly消息
'设为只读
sendmessage text1.hwnd,em_setreadonly,true,0
'解除只读
sendmessage text1.hwnd,em_setreadonly,false,0
pgfan 2002-06-08
  • 打赏
  • 举报
回复
locked=true 在 2000 下无效的,别人不能输入但是可以用右键菜单粘贴!
gump2000 2002-06-08
  • 打赏
  • 举报
回复
Private Const GWL_WNDPROC = (-4)
Private Const WM_RBUTTONDOWN = &H204

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private 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
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private prevWndProc As Long


Private Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_RBUTTONDOWN Then
Else
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End If
End Function

'禁止TextBox的系统右键菜单
Sub DisableRightClick(txtTarget As TextBox)

prevWndProc = GetWindowLong(txtTarget.hwnd, GWL_WNDPROC)
SetWindowLong txtTarget.hwnd, GWL_WNDPROC, AddressOf WndProc
End Sub


把以上代码放到模块中

在Form中
===============================
Text1.Locked=True
DisableRightClick Text1

这样就可以把右键菜单给禁止掉了
===============================
不知道TextBox的Locked属性为True以后,还可以通过
右键菜单来粘贴是MS故意留下的还是Bug

至少我试过,在ComboBox的Text中粘贴是不可行的
wzsswz 2002-06-08
  • 打赏
  • 举报
回复
这么多朋友帮你了,你自己再动一下脑筋不就完了?
iflyer 2002-06-08
  • 打赏
  • 举报
回复
我加了30分怎么在索引区还是20分?
iflyer 2002-06-08
  • 打赏
  • 举报
回复
谢谢各位朋友!

Wolfzhang(屁屁狗):我试了一下你方法,好像TextBox控件总在Label控件上面,Label控件无法响应用户事件,采用“移至顶层”、“移至底层”也没用,怎么解决?

cdnicle(小羊羔)、delphin(牙疼)、allenair(allenair)你们的方法可以达到不让用户修改的目的,我没说清楚,我的要求是:TextBox控件内容默认不能修改,用户对TextBox控件采取一个事件(如双击)(至少形式上是对TextBox控件)后,TextBox控件内容就可以修改了,再采取同样的事件后TextBox控件内容又不能修改了。
footballboy 2002-06-08
  • 打赏
  • 举报
回复
to gump2000(阿甘)
谢谢!
iflyer 2002-06-08
  • 打赏
  • 举报
回复
再次谢谢各位朋友,我学到了很多东西,我都不忍心结贴了。
gump2000 2002-06-08
  • 打赏
  • 举报
回复
to footballboy:
呵呵,Locked以后,用户可以依靠右键系统菜单来达到对TextBox的修改

就算送EM_SETREADONLY效果也是一样的。
footballboy 2002-06-08
  • 打赏
  • 举报
回复
其实这样就可以
Dim boReadonly As Boolean

Private Sub Text1_DblClick()
boReadonly = Not boReadonly
Text1.Locked = boReadonly
End Sub
qhzxcz 2002-06-08
  • 打赏
  • 举报
回复
footballboy(郑创斌)的方法应该可行,
要么用api发送EM_SetReadOnly消息
要么在事件响应中做文章
要么屏蔽右键
footballboy 2002-06-08
  • 打赏
  • 举报
回复
retval = SendMessage(Text1.hwnd, EM_SETREADONLY, boReadOnly, ByVal 0&) '在可编辑和只读间切换
footballboy 2002-06-08
  • 打赏
  • 举报
回复
笔误
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const EM_SETREADONLY = &HCF
Dim boReadOnly As Boolean

'第一次双击只读,再次双击可编辑,再双击又只读...。设定boReadOnly的初值为True或False可改变第一次双击时的状态
Private Sub Text1_DblClick()
Dim retval As Long
boReadOnly = Not boReadOnly
retval = SendMessage(Text1.hwnd, EM_SETREADONLY, boReadOnly, ByVal 0&) '将文本框设为可编辑
End Sub
footballboy 2002-06-08
  • 打赏
  • 举报
回复
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const EM_SETREADONLY = &HCF
Dim boReadOnly As Boolean

'第一次双击只读,再次双击可编辑,再双击又只读...。设定boReadOnly的初值为True或False可改变第一次双击时的状态
Private Sub Text1_DblClick()
Dim retval As Long
ReadOnly = Not ReadOnly
retval = SendMessage(Text1.hwnd, EM_SETREADONLY, ReadOnly, ByVal 0&) '将文本框设为可编辑
End Sub
allenair 2002-06-07
  • 打赏
  • 举报
回复
将enable属性设置为false则,多行文本框的滚动条都不可用了,所以应该用locked=true ,另外用变量将textbox的值保留,再在textbox的change事件中再将值赋给textbox的text属性

Private Sub Text1_Change()
Text1.Text = preValue'前值
End Sub
delphin 2002-06-07
  • 打赏
  • 举报
回复
在keypress过程里加ascii=0就行了!!
Iamfish 2002-06-07
  • 打赏
  • 举报
回复
text1.enable=false

text1.locked=true
cdnicle 2002-06-07
  • 打赏
  • 举报
回复
你可以设置TEXT1的getfocus 和 LOSTFOCUS 事件,将其中的内容设置成你想要的值就是了!
别忘了加分哟!UP
hengxin54 2002-06-07
  • 打赏
  • 举报
回复
对啦,将text1.locked设为TRUE就行了,看上去就像可以改变一样,很爽的
加载更多回复(6)

7,785

社区成员

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

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