- 性别
- 保密
- 积分
- 132
- 积分
- 139
- 精华
- 0
- 阅读权限
- 20
- 注册时间
- 2012-5-3
- 最后登录
- 2017-9-29
- 帖子
- 6
- 性别
- 保密
|
本帖最后由 sky_yx 于 2015-12-30 14:21 编辑
- Dim mkey() As Integer ’ 定义一个动态数组
- Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) '窗体按键按下时触发
- If UBound(mkey) = 0 Then GoTo 1 '第一次按键,则转到标签号1: 执行
- If mkey(UBound(mkey) - 1) <> KeyCode Then ’如果不是第一次按下按键并且没有按下之前按过的键
- l:
- mkey(UBound(mkey)) = KeyCode '将新增的按键码存到数组末尾
- ReDim Preserve mkey(UBound(mkey) + 1) As Integer '动态分配数组大小。保留原有元素,数组下标上限增1
- mkey(UBound(mkey)) = 0 '数组末尾元素置零
- End If
- For i = 0 To UBound(mkey) '不管多少按键被按下,只要有相应的方向键被按下,就执行移动语句
- If mkey(i) = 37 Then c1.Left = c1.Left - 20
- If mkey(i) = 40 Then c1.Top = c1.Top + 20
- If mkey(i) = 39 Then c1.Left = c1.Left + 20
- If mkey(i) = 38 Then c1.Top = c1.Top - 20
- Next i
- Dim aaa As String '调试输出字符串变量
- For i = 0 To UBound(mkey)
- aaa = aaa & mkey(i) & " | "
- Next
- Debug.Print aaa '调试输出字符串(目前所有被按下的按键的键盘码)
- End Sub
- Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) '松开按键时触发
- For i = 0 To UBound(mkey) - 1 '数组末尾为零,所以从数组首到数组倒数第二个元素(也就是对所有按下的按键进行分
- '析,越早按下的按键码也靠近数组首)
- If mkey(i) = KeyCode Then '哪个按键被松开了,就从这个按键码在数组中的位置开始修改数组的元素的值直到数组结尾
- If UBound(mkey) = 1 Or UBound(mkey) = 0 Then '如果此时数组里只有一个按键的记录,那么就是说这个按键又被松开
- '那么就将数组再初始化,同Form_Load事件的处理
- ReDim mkey(0) As Integer
- mkey(0) = 0
- Else '如果此时,数组里有多个按键码(之前有不止一个按键被按下)
- For a = i To UBound(mkey) - 1 '那么就将此时松开的那个按键的按键码从数组里删除
'这是数组的删除元素操作,就是把要删除的数组元素所在的位置用后面的 - '数组元素来移位填充,数组长度减一
- mkey(a) = mkey(a + 1) ’例如 之前数组为(38 55 26 0)
- '删除一个按键码 55 后, 数组为 (38 26 0)
- Next a
- ReDim Preserve mkey(UBound(mkey) - 1) As Integer '因为删除了一个数组元素,所以数组长度减一
- End If
- End If
- Next i
- End Sub
- Private Sub Form_Load()
- ReDim mkey(0) As Integer '动态分配数组大小为一位动态数组,且当前数组长度为1
- End Sub
|
|