参数引用调用无效,问为什么

angus2887 2007-04-07 09:34:53
部分代码如下:
Private Sub txtMain_KeyPress(KeyAscii As Integer)
MakeUsable (KeyAscii)
RaiseEvent KeyPress(KeyAscii)
End Sub
Private Sub MakeUsable(word As Integer)
If (word >= 48 And word <= 57) Then
If (m_InputType <> Letters) = False Then word = 0
ElseIf (word >= 97 And word <= 122) Then
If (m_InputType = Letters And m_CaseType <> UpperCase _
Or m_InputType = AllInput And m_CaseType = LowerCase) = False Then word = 0
ElseIf (word >= 65 And word <= 90) Then
If (m_InputType = Letters And m_CaseType <> LowerCase _
Or m_InputType = AllInput And m_CaseType = UpperCase) = False Then word = 0
Else
word = 0
End If
End Sub
目的是使得输入的字符必须是满足要求的,否则置为空,但是引用调用的时候虽然word能够置0,但是并没有影响到KeyAscii的值,这是为什么?小弟初来乍到,多多关照。
...全文
767 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
xk2y 2007-04-09
  • 打赏
  • 举报
回复
学习一下``
lanqt 2007-04-08
  • 打赏
  • 举报
回复
以前还真没注意到这个问题呢 VB的函数调用 还得要注意下
sxwz2007 2007-04-07
  • 打赏
  • 举报
回复
刚刚又试了一上。。像fankun说的。。定义成function就可以了。sub不行。。。
fankun 2007-04-07
  • 打赏
  • 举报
回复
sub是接受参数,并做相应的处理,并不会改变传来的参数。当调用一个sub的时候,程序会跳转到sub的内存块,执行完毕又会返回,并不会带回任何东西,也就是说不会保存任何的改变,是无值的。而function会处理传来的参数,改变后会返回一个function值的内存地址,以供程序调用。
特别 2007-04-07
  • 打赏
  • 举报
回复
方法声明为

Private Sub MakeUsable(byref word As Integer)
sxwz2007 2007-04-07
  • 打赏
  • 举报
回复
懂LZ的意思,试过了,没办法解决,帮顶。。。
angus2887 2007-04-07
  • 打赏
  • 举报
回复
fankun,sub没有返回值,但是我应该可以把返回值放到参数里面带回啊,为什么回失败呢?相当于private sub ( i As integer) i = 0 End Sub这样的调用也没有办法给实参传递0值
fankun 2007-04-07
  • 打赏
  • 举报
回复
就象楼上的,做个自定义函数,自定义子过程是没有返回值的。
angus2887 2007-04-07
  • 打赏
  • 举报
回复
VB里面参数不是默认为引用调用吗?而且我还专门声名是引用传参Private Sub txtMain_KeyPress(ByRef KeyAscii As Integer),怎么会是值传递呢?这个就是主要问题。iamtsfw(iamtsfw)我现在改成这个是可以用的,但是问题还是没有实际解决哦
iamtsfw 2007-04-07
  • 打赏
  • 举报
回复
我搞错了,没弄懂你的意思:重来
Private Sub MakeUsable(word As Integer)
这句话把KeyAscii的值复制到word里,这之后,两者是独立的,互相不影响。
所以你改变word,不会影响keyascii,在c++中,通过传引用或指针能达到同时修改的目的。
但是,看你的程序不需要那么做,我修改一下吧
Private Sub txtMain_KeyPress(KeyAscii As Integer)
Dim iModiValue As Integer
iModiValue = MakeUsable(KeyAscii)
RaiseEvent KeyPress(iModiValue)
End Sub

Private Function MakeUsable(word As Integer) As Integer
If (word >= 48 And word <= 57) Then
If (m_InputType <> Letters) = False Then MakeUsable = 0
ElseIf (word >= 97 And word <= 122) Then
If (m_InputType = Letters And m_CaseType <> UpperCase _
Or m_InputType = AllInput And m_CaseType = LowerCase) = False Then MakeUsable = 0
ElseIf (word >= 65 And word <= 90) Then
If (m_InputType = Letters And m_CaseType <> LowerCase _
Or m_InputType = AllInput And m_CaseType = UpperCase) = False Then MakeUsable = 0
Else
MakeUsable = word
End If

End Function
说实话,你的程序的内聚性太差,很难读,例如MakeUsable里面的好多变量都找不到出处
angus2887 2007-04-07
  • 打赏
  • 举报
回复
CathySun118(斯年) KeyAscii并不是返回值啊不是返回值是什么意思?我把KeyAscii作为参数,然后在sub里面修改它的值,为什么会失败呢?
iamtsfw 2007-04-07
  • 打赏
  • 举报
回复
看来你的word是个窗体级变量了,那么
RaiseEvent KeyPress(KeyAscii)
改为
RaiseEvent KeyPress(word)吧



CathySun118 2007-04-07
  • 打赏
  • 举报
回复
KeyAscii并不是返回值啊
angus2887 2007-04-07
  • 打赏
  • 举报
回复
晕,问题找到了。是函数调用的格式造成的,都是MakeUsable (KeyAscii)惹得祸。两种方式解决:
1:MakeUsable KeyAscii
2:Call MakeUsable (KeyAscii)
结贴。MS真麻烦
fankun 2007-04-07
  • 打赏
  • 举报
回复

MakeUsable (KeyAscii)这个函数返回值应该声明为boolean,public function MakeUsable(word as integer) as boolean
然后调用的时候
dim retval as boolean
retval=MakeUsable(KeyAscii)
if retval=true then
textmain.locked=false
else
textmain.locked=true
end if

特别 2007-04-07
  • 打赏
  • 举报
回复
发了
angus2887 2007-04-07
  • 打赏
  • 举报
回复
angus2887@gmail.com sdfkfkd现在就发吧
特别 2007-04-07
  • 打赏
  • 举报
回复
我试的时候是可以的啊,
我既做了一个类,也做了一个控件,都是可以的

要不给个邮箱,我把我写的例子发给你看一下吧
angus2887 2007-04-07
  • 打赏
  • 举报
回复
txtmain是textbox类型,是我自定义控件里面的一个,要求有键盘按下的时候检测按键的类型是否符合要求否则置0,有按键的时候出发txtMain_KeyPress函数。就是这样
特别 2007-04-07
  • 打赏
  • 举报
回复
楼主的 txtMain 是在自定义的控件里还是自定义的类里面,
不管哪种情况,我测试都成功的
Private Sub MakeUsable(byref word As Integer)
byRef 是按引用传递,也就是方法里改变word的值也会改原相应实参的值,
且不加byref VB中也默认是按引用传递的

问题应该不出在是方法还是函数中,希望楼主多贴一些代码出来
加载更多回复(3)

7,763

社区成员

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

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