注册 登录
编程论坛 VB6论坛

多个窗体调用 module 里的代码,一个问题

txxb 发布于 2014-11-26 22:30, 778 次点击
module里有
public sub
if a.text1.text=0 then
...

a窗体调用没问题,b窗体同样的,b窗体怎么调用?module里怎么写?
9 回复
#2
xzlxzlxzl2014-11-27 07:00
应该活学活用参数传递解决,方法如下:
module里
public sub aaaa(bbbb as textbox)
  if bbbb.text=0 then bbbb.text=1
end sub

窗体1调用
aaaa text1

窗体2调用
aaaa text1
aaaa text2
.....
#3
txxb2014-11-27 09:45
不太理解,各种参数我还不会灵活使用。
module里是:
Public Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 46 And InStr(1, aaaa.Text1.Text, ".") > 0 Then '这里把我难住了。。。。。
        KeyAscii = 0
    End If
End Sub

aaaa窗体Text1_KeyPress要用,bbbb窗体Text1_KeyPress也要用,怎么办?

再问下窗体里是这样写吗?参数啥的对吗?
Private Sub Text1_KeyPress(KeyAscii As Integer)
Call Module1.Text1_KeyPress(KeyAscii)
End Sub
#4
xzlxzlxzl2014-11-27 10:39
回复 3 楼 txxb
哦?完全没基础啊。
好好啃下“面向对象编程”的基础知识吧,搞清楚类、对象,学习如何运用对象的属性、事件、方法。
不要把类想的太复杂,其实就是一段完成某一方面功能的代码,这段代码对外共享了部分数据、自触发的过程和子程序,共享的数据就是类的属性,共享的自触发的过程就是事件,共享的子程序就是方法。类是抽象的定义,对象是类的实体,如:电视类是定义,一台海尔液晶电视就是对象,电视类有些固有属性如需要电、电视信号,有屏幕、喇叭等,这是属性,有些属性可以让用户改变,如信号可以接有线,也可以接无线,喇叭可以内置也可以外接,选台、调音量、调亮度可以认为是电视类方法,而电压报警、无信号关机等可以认为是电视类的事件。
keypress是控件的按键事件,当控件获得焦点时,按键会触发该事件,用户可在该事件里加入自己的代码控制输入,每个对象都有自己独立的事件处理过程,要想共用可以使用控件数组,这就只需要在一个事件里写代码,如果不是控件数组,又有相同的处理过程,也可以在模块里写一个过程,但必须在每一个控件事件里写上该过程的调用代码。

哎...,就给你普及下这些基础吧,已经是管闲事了。
#5
txxb2014-11-27 10:49
类、对象、属性、事件、方法

我就是在实践中边运用边理解
#6
wube2014-11-27 20:39
不太理解,module里怎会有事件?
Public Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 46 And InStr(1, aaaa.Text1.Text, ".") > 0 Then '这里把我难住了。。。。。
        KeyAscii = 0
    End If
End Sub
-------------------------------------------------------
通常要跨表单透过模块进行控件项操作,我都是直接把表单当参数传递给模块,再进行操作。
Public Sub AAA(A1 as Form,B1 as Integer)
    A1.XXX=??? 'A1看你是从哪个表单传来的,就是那个表单的东西。
End Sub
-------------------------------------------------------
呼叫使用的时候再:
1.Form1 -> Call AAA(Form1,1)
2.Form2 -> Call AAA(Form2.2)
.....
-------------------------------------------------------
不过个人不建议把表单动作写在模块内,后续会很麻烦。
#7
feishi19852014-11-28 21:25
想搞清楚还真不容易
#8
txxb2014-11-28 21:57
a窗体,b窗体,c窗体都有:
程序代码:
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 46 And InStr(1, Text1.Text, ".") > 0 Then
        KeyAscii = 0
    End If
End Sub


为了减少代码,放到Module里,怎么写?我不会格式,理论我知道。
#9
风吹过b2014-11-28 23:38
那你用函数吧。
----------Module 的代码----------
Public Function TextKeyCheck(objtext As TextBox, KeyAscii As Integer) As Integer
'传二个参数进来,第一个是 文本框,第二个是 按键值
TextKeyCheck = KeyAscii                 '默认等于 原始值
If TextKeyCheck = 46 And InStr(1, objtext.Text, ".") > 0 Then       '如果符合取消的条件
    TextKeyCheck = 0                    '置 0
End If
End Function

---------窗体中的代码--------------
Private Sub Text1_KeyPress(KeyAscii As Integer)
    KeyAscii = TextKeyCheck(Text1,Keyascii)
End Sub

==========================================================
还有一种写法,就借助VB6 过程(函数)的参数默认是按地址传递,那就直接修改值就可以了,不需要 使用函数的调用方法。
--------Module中的代码------------
Public Function TextKeyCheck(objtext As TextBox, ByRef KeyAscii As Integer) As Integer
'传二个参数进来,第一个是 文本框,第二个是 按键值 ,按键值,显式指定为按地址传递,方便理解
If KeyAscii = 46 And InStr(1, objtext.Text, ".") > 0 Then       '如果符合取消的条件
    KeyAscii = 0                    '置 0
End If
End Function

---------窗体中的代码--------------
Private Sub Text1_KeyPress(KeyAscii As Integer)
    call TextKeyCheck(Text1,Keyascii)
End Sub
#10
txxb2014-11-29 09:47
非常感谢这么详细的解答,原来不太会带参数,此回答将大大加深我对参数,传址,函数的理解。
1