欢 迎 光 临 数据载入中,请稍候......'s BLog
数据载入中,请稍候......
这就是我
数据载入中,请稍候......
用户登陆
数据载入中,请稍候......
最新公告
数据载入中,请稍候......
站点日历
数据载入中,请稍候......
最新日志
数据载入中,请稍候......
最新回复
数据载入中,请稍候......
最新留言
数据载入中,请稍候......
 日志搜索

友情链接
其他信息


·ACCESS学习笔记之三:QQ群中听课      -|cloudy 发表于 2006-11-16 21:17:00
时间: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
联机帮助是要自己写吧?
[阅读全文 | 回复(1) | 引用通告 | 编辑]

  • 标签:Access 
  • ·Re:ACCESS学习笔记之三:QQ群中听课     -|hehe(游客)发表评论于2006-12-10 23:24:12
    hehe(游客)
    [个人主页 | 引用 | 返回 | 删除 | 回复]

    发表评论:
    数据载入中,请稍候......