时间:2006/11/16
教师:朱亦文
位置:QQ群
朱亦文(23699869) 20:34:55
大家应该知道窗体是一个对象吧?
朱亦文(23699869) 20:37:03
窗体有许多的方法,如ReQuery,属性,如Name,还有事件,如Form_Open
朱亦文(23699869) 20:37:44
其实窗体对象也是一个类的实例
朱亦文(23699869) 20:38:52
只是窗体的基本结构类,Access已经帮我们设计好了
朱亦文(23699869) 20:39:42
我们的类模块就是为了实现这样类,只是窗体是可视化的类
朱亦文(23699869) 20:40:31
因此,类模块中的类,也可以有自己的属性、方法、事件
朱亦文(23699869) 20:41:52
最简单的属性声明,就是在类模块中,用Public定义一个变量
大丁丁(123339791) 20:42:24
还可以自定义事件?
朱亦文(23699869) 20:42:29
不过这个变量是这个类的属性
朱亦文(23699869) 20:42:59
可以自定义事件,呵呵,没有什么不可以的,呵呵
朱亦文(23699869) 20:43:21
请不要打X
朱亦文(23699869) 20:44:33
但是,这个变量,在实例化成对象后,就是这个对象的专有的属性
朱亦文(23699869) 20:45:53
例如:
Dim oA As New clsABC
Dim oB As New clsABC
oA.text ="AAA"
oB.text="BBB"
朱亦文(23699869) 20:47:06
尽管都是clsABC这个类,但实例化后的对象中属性,完全是不同的值
朱亦文(23699869) 20:47:55
这样程序,就会更清晰,分得清哪个是你的,哪个我的
朱亦文(23699869) 20:48:17
这也就是面向对象设计的一个优越性
朱亦文(23699869) 20:49:57
布衣铁剑(81094935) 20:48:29
这里的Dim和用Public会有不同吗
基本没有什么区别,不过Public是全局的,而Dim与Private类似,只能该模块中使用
大丁丁(123339791) 20:50:56
Public强调了公用,值会改变
朱亦文(23699869) 20:51:20
当然类也可以有自己私有的变量,而不被外界访问
这时我们使用Private来声明变量
朱亦文(23699869) 20:51:47
达到保护私有数据的目的
朱亦文(23699869) 20:53:10
例如:我们在设置程序版本号时,并不希望,外部来更改这个版本号,我们可以这样做:
朱亦文(23699869) 20:54:23
Private m_Ver As String
稍等,去喝口茶
朱亦文(23699869) 20:56:31
对不起,是放水,哈哈,还要等一会
朱亦文(23699869) 20:59:08
Public Property Get Ver() As String
Ver = m_Ver
End Property
Private Sub Class_Initialize()
m_Ver = "1.00"
End Sub
朱亦文(23699869) 21:00:29
那么我们实例化这个类后,可以通过对象的Ver属性来访问这个版本号
朱亦文(23699869) 21:01:02
Dim oA As New clsABC
debug.Print oA.Ver
朱亦文(23699869) 21:01:23
就显示:1.00
朱亦文(23699869) 21:02:18
Public Property Get Ver() As String
这个称为属性过程,在对象中呈现为属性
朱亦文(23699869) 21:02:54
它用来访问受保护的私有变量m_Ver
朱亦文(23699869) 21:03:43
而程序无法去更改m_Ver, 这样m_Ver就保护起来了
朱亦文(23699869) 21:05:02
Private Sub Class_Initialize()
是类的初始化过程,相当于C++中的构造函数,它是类实例化时首先执行的过程
朱亦文(23699869) 21:05:37
完成对象的初始化,本例中给m_Ver赋值
朱亦文(23699869) 21:06:02
听懂了吗?
今晚就上到这里,打字好累
朱亦文(23699869) 21:15:31
再来解释一下代码
朱亦文(23699869) 21:16:07
Property 表示属性过程
朱亦文(23699869) 21:16:37
Get 表示输出属性值
朱亦文(23699869) 21:17:33
那么,当然还有一个相应的输入属性值的关键字:Set
朱亦文(23699869) 21:18:41
如果我们在类代码中不书写Set过程,也就是不允许更改属性
朱亦文(23699869) 21:19:29
下面给一个完整的类的例子
朱亦文(23699869) 21:20:04
新建一个clsCir的类模块
朱亦文(23699869) 21:25:26
Const Pi = 3.14159265
Private r As Double
Public Property Set R(dRad As Double)
r = dRad
End Property
Public Get D() As Double
D = 2 * r
End Property
Public Get S() As Double
S = Pi * r * r
End Property
Private Sub Class_Initialize()
r = 0
End Sub
朱亦文(23699869) 21:27:57
然后新建一个模块,在这个模块中,输入:
Sub Test()
Dim oCir as New clsCir
oCir.r = 3
debug.print oCir.D
debug.Pring oCir.S
End Sub
朱亦文(23699869) 21:28:30
大家试试,看看有什么问题,再提出
朱亦文(23699869) 21:33:04
程序有问题,大家发现了吗?
朱亦文(23699869) 21:54:30
类模块的正确代码:
Const Pi = 3.14159265
Private m_R As Double
Public Property Let R(ByVal Rad As Double)
m_R = Rad
End Property
Public Property Get R() As Double
R = m_R
End Property
Public Property Get D() As Double
D = 2 * m_R
End Property
Public Property Get S() As Double
S = Pi * m_R * m_R
End Property
Private Sub Class_Initialize()
m_R = 0
End Sub
朱亦文(23699869) 21:55:00
测试模块:
Sub Test()
Dim oCir As New clsCir
oCir.R = 3
Debug.Print oCir.D
Debug.Print oCir.S
End Sub
朱亦文(23699869) 21:56:26
二义性的错误,是老师讲错了,不是SET,而LET
针对对象类型的属性才用 SET
朱亦文(23699869) 21:59:07
但是有没有要改进的地方呢?
布衣铁剑(81094935) 22:01:55
朱老师:
m_R = Rad
是什么意思,我不明白
朱亦文(23699869) 22:03:52
m_R = Rad
表示将外部的值赋给对象的私有变量
朱亦文(23699869) 22:04:30
因为在外部是不能访问直接访问m_R的
朱亦文(23699869) 22:05:06
这是一个圆的类,大家应该看出来了吧?
布衣铁剑(81094935) 22:05:28
是呀
爱上钩的鱼(93504585) 22:05:35
晕...没留意...没注意大观
朱亦文(23699869) 22:06:22
那么
oCir.R = -3
的话,会是什么结果呢?
大丁丁(123339791) 22:07:06
D也是负数啦
朱亦文(23699869) 22:07:14
是不是oCir.D会是负值,而oCir.S会是一个正值?
大丁丁(123339791) 22:07:20
S是正值
朱亦文(23699869) 22:07:38
这样结果肯定不是我们需要的,对不对
爱上钩的鱼(93504585) 22:07:50
然后呢?
布衣铁剑(81094935) 22:08:09
怎样避免呢?
朱亦文(23699869) 22:08:10
因此,我们需要改进我们的类
朱亦文(23699869) 22:09:37
Public Property Let R(ByVal Rad As Double)
If Rad < 0 Then
m_R = 0
Else
m_R = Rad
End If
End Property
朱亦文(23699869) 22:10:50
输入负值肯定是一个错误,因此,我们需要引发一错误
爱上钩的鱼(93504585) 22:11:01
Public Property Let R(ByVal dRad As Double)
If Rad < 0 Then
MsgBox "Wrong date!"
Else
m_R = Rad
End If
End Property
爱上钩的鱼(93504585) 22:11:15
msgbox不执行...
布衣铁剑(81094935) 22:15:32
学这个东东还真是不容易,现在总算明白过来了
朱亦文(23699869) 22:16:51
将类代码改为:
Public Property Let R(ByVal Rad As Double)
If Rad < 0 Then
Err.Raise vbObjectError + 1000, "clsCir", "半径不能为负值!"
Else
m_R = Rad
End If
End Property
朱亦文(23699869) 22:17:19
测试代码改为:
Sub Test()
On Error GoTo testclsCir
Dim oCir As New clsCir
oCir.R = -3
Debug.Print oCir.D
Debug.Print oCir.S
Exit Sub
testclsCir:
MsgBox Err.Number & " " & Err.Description
Err.Clear
End Sub
朱亦文(23699869) 22:17:40
再试试
布衣铁剑(81094935) 22:18:22
朱老师,明天还讲吗?
如果讲,明天我多找点资料看,不然我会累死
朱亦文(23699869) 22:18:53
看出一点名堂了吗?
朱亦文(23699869) 22:19:46
事实上,还可以引发事件,以后再讲
爱上钩的鱼(93504585) 22:20:06
累死了....
爱上钩的鱼(93504585) 22:20:37
谢谢朱老师!
朱亦文(23699869) 22:20:43
如今的人呀,咳。。。。
爱上钩的鱼(93504585) 22:20:56
我们没基础...
爱上钩的鱼(93504585) 22:21:01
看得云里雾里
爱上钩的鱼(93504585) 22:21:15
0
0 没有返回错误代码
朱亦文(23699869) 22:21:28
都是今天讲的内容,并没有超出
华钟如贺(5318971) 22:21:48
我不看这个,我只想把该实现的功能整出来,麻烦点不怕。
华钟如贺(5318971) 22:22:01
先简单后复杂。
爱上钩的鱼(93504585) 22:22:32
OK! 贴出完整代码:
爱上钩的鱼(93504585) 22:22:41
模块
爱上钩的鱼(93504585) 22:22:42
Sub Test()
On Error GoTo 100
Dim oCir As New clsCir
oCir.R = -3
Debug.Print oCir.D
Debug.Print oCir.S
Exit Sub
100:
MsgBox Err.Number & " " & Err.Description
Err.Clear
End Sub
爱上钩的鱼(93504585) 22:22:54
类:
Const Pi = 3.14159265
Private mvarR As Double
Public Property Get R() As Double
R = mvarR
End Property
Public Property Let R(ByVal dRad As Double)
If dRad < 0 Then
Err.Raise vbObjectError + 1000, "clsCir", "半径不能为负值!"
Else
mvarR = Rad
End If
End Property
Public Property Get D() As Double
D = 2 * mvarR
End Property
Public Property Get S() As Double
S = Pi * mvarR * mvarR
End Property
Private Sub Class_Initialize()
mvarR = 0
End Sub
朱亦文(23699869) 22:23:09
Const Pi = 3.14159265
Private m_R As Double
Public Property Let R(ByVal Rad As Double)
If Rad < 0 Then
Err.Raise vbObjectError + 1000, "clsCir", "半径不能为负值!"
Else
m_R = Rad
End If
End Property
Public Property Get R() As Double
R = m_R
End Property
Public Property Get D() As Double
D = 2 * m_R
End Property
Public Property Get S() As Double
S = Pi * m_R * m_R
End Property
Private Sub Class_Initialize()
m_R = 0
End Sub
爱上钩的鱼(93504585) 22:23:19
刚才直接Copy朱老师的代码
朱亦文(23699869) 22:23:24
Sub Test()
On Error GoTo testclsCir
Dim oCir As New clsCir
oCir.R = -3
Debug.Print oCir.D
Debug.Print oCir.S
Exit Sub
testclsCir:
MsgBox Err.Number & " " & Err.Description
Err.Clear
End Sub
爱上钩的鱼(93504585) 22:23:24
所以出错了
爱上钩的鱼(93504585) 22:23:34
所以出错了 也没提示!
布衣铁剑(81094935) 22:24:05
今晚有人整理谈话内容吗?
没人整理的话,我来整理
爱上钩的鱼(93504585) 22:25:21
朱老师,现在还没下课吧?
爱上钩的鱼(93504585) 22:25:47
要不您把明天的教学内容公布一下下?
爱上钩的鱼(93504585) 22:25:55
我们提前预习....
朱亦文(23699869) 22:26:00
下课下课,听的人都没有兴趣,讲起来也没意思
华钟如贺(5318971) 22:26:16
呵呵。
爱上钩的鱼(93504585) 22:26:38
不是没兴趣,是很多地方都无法理解.
朱亦文(23699869) 22:26:57
这可是你提的问呀
爱上钩的鱼(93504585) 22:26:58
Public Property Let R(ByVal dRad As Double)
If Rad < 0 Then
MsgBox "Wrong data!"
Else
m_R = Rad
End If
End Property
爱上钩的鱼(93504585) 22:26:38
不是没兴趣,是很多地方都无法理解.
是呀,有的地方只是能看懂而已,知道是类,自己却做不出来
竹笛(56217686) 22:27:29
精力旺盛的朋友看过来:
http://www.accessoft.com/cgi-bin/dispbbs.asp?boardID=68&ID=4069 爱上钩的鱼(93504585) 22:27:31
这个语法没错,但在类里头就用不起来....
朱亦文(23699869) 22:27:45
不要在类中使用Msgbox
爱上钩的鱼(93504585) 22:28:09
我换debug.print 试试
爱上钩的鱼(93504585) 22:31:20
也是不行的,也就是说必须用这个Err.Raise vbObjectError + 1000, ....
爱上钩的鱼(93504585) 22:31:45
这里我们又不懂了....
布衣铁剑(81094935) 22:31:48
笛子,你要累死我们才罢休呀
布衣铁剑(81094935) 22:32:12
好在有录像,照着做就是
爱上钩的鱼(93504585) 22:32:33
应该是朱老师.笛子累坏了才是
爱上钩的鱼(93504585) 22:32:56
朱老师,现在他们都走了,您继续教点吧...
竹笛(56217686) 22:33:34
听人说MDE可破解啊,大家等着破我的源码吧
朱亦文(23699869) 22:33:45
不上新内容了,今晚
爱上钩的鱼(93504585) 22:34:06
Err.Raise ..这个您还没讲呢
华钟如贺(5318971) 22:34:20
朱老师能不能都点简单的啊?
华钟如贺(5318971) 22:34:36
教点简单的。
爱上钩的鱼(93504585) 22:34:43
这个应该是简单的
爱上钩的鱼(93504585) 22:34:48
我现在在装MSDN
朱亦文(23699869) 22:34:55
Raise 方法
产生运行时错误。
语法
object.Raise number, source, description, helpfile, helpcontext
朱亦文(23699869) 22:36:28
Raise 被用来生成运行时错误,并可用来代替 Error 语句。当书写类模块时要生成错误,Raise 是有用的,因为 Err 对象比 Error 语句可能提供更丰富的信息。例如,用 Raise 方法,可以在 Source 属性中说明生成错误的来源,可以引用该错误的联机帮助。
爱上钩的鱼(93504585) 22:37:06
联机帮助是要自己写吧?