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

友情链接
其他信息


·朱老师讲课:读源码的技巧,关键词,实例化     -|cloudy 发表于 2007-1-9 21:09:00

齿轮设计:张贴的QQ群聊记录
 
朱亦文(23699869) 13:44:12
你的Access有问题吧?呵呵
大丁丁(123339791) 13:44:41
不用平台试试
朱亦文(23699869) 13:45:24
就是用平台,也不会出这样的错呀
If语句怎么会有错呢?
大丁丁(123339791) 13:46:11
不是,那只是我设的断点
朱亦文(23699869) 13:46:42
那错在哪里?
大丁丁(123339791) 13:49:08
我就是调试方法没掌握,瞎找真难啊
朱亦文(23699869) 13:50:37
你先设断点,然后在立即窗口输入:
? Rvt(12345.12345,3)
就会自动运行这个函数,进入调试
大丁丁(123339791) 13:50:37

Public Function Rvt(X As Double, N As Integer)
第一句是我加的,没错吧
大丁丁(123339791) 13:51:24
就是这样做的,才出现了那个警告
大丁丁(123339791) 13:52:33
大家也做做看,是不是这样的结果啊
朱亦文(23699869) 13:52:46
你的这个函数是在哪?
要把它放一个模块中,而不能放在窗体或报表中,
至于什么原因,你可以思考一下
大丁丁(123339791) 13:53:36
啊,是放在类模块中的哎
朱亦文(23699869) 13:53:47
也不能放到类模块中
朱亦文(23699869) 13:54:32
至于什么原因,你可以思考一下
大丁丁(123339791) 13:54:50
窗体和报表全是类模块啊
朱亦文(23699869) 13:55:10

大丁丁(123339791) 13:56:05
还是对类模块理解不深,放普通模块中就好啦
朱亦文(23699869) 13:56:26
我们设计的窗体、报表都是类
大丁丁(123339791) 13:56:29
什么原因?我笨
朱亦文(23699869) 13:57:10
什么原因,你想想,说说你的想法,大家都可以从中学到一些东西
大丁丁(123339791) 13:57:52
将函数写在窗体中,我经常这么做的啊
凌(277327267) 13:59:26
在类模块中只能这个类模块用
朱亦文(23699869) 13:59:28
大丁丁(123339791) 13:57:52
将函数写在窗体中,我经常这么做的啊
==========================
可以,这么做,但这时的函数是这个窗体或报表私有的,只有这个窗体或报表才能调用这个函数
朱亦文(23699869) 14:00:20
再想想
大丁丁(123339791) 14:01:19
那我现在该类模块在当前,而且是Public
朱亦文(23699869) 14:02:11
但是,类要实例化后才可以调用其中方法
朱亦文(23699869) 14:02:56
还是我来解释一下吧
朱亦文(23699869) 14:03:12
平常,以窗体举例
大丁丁(123339791) 14:03:59

大丁丁(123339791) 14:04:28
窗体中有什么实例化?
朱亦文(23699869) 14:05:03
平常,我们设计的窗体,其实是一个特殊的类
假设,我们设计了一个窗体,frmA,在窗体中加入了刚才的Rvt函数,并声明为Public
大丁丁(123339791) 14:05:28

jimcloudy(1724935) 14:06:16
我来迟了么?朱老师又在讲课了
能不能把Rvt函数先贴 出来看看?
大丁丁(123339791) 14:06:46
有了啊,在朱老师的QQ上
朱亦文(23699869) 14:06:48
那么,当我们Docmd.OpenForm "frmA"时,就打开了这个窗体,这是一种最常见的窗体实例化的方法
朱亦文(23699869) 14:08:06
这时,就在内存中产生了一个名为frmA的对象,它是frmA类的一个实例
朱亦文(23699869) 14:09:03
当窗体实例化后,我们就可以引用它的Rvt函数(又称为方法)
朱亦文(23699869) 14:09:27
引用的方法是:
frmA.Rvt(...,....)
大丁丁(123339791) 14:09:43
哦,是说我当时窗体没运行?
朱亦文(23699869) 14:10:24
这里的frmA是窗体对象,而不是frmA类,一定要分得清
朱亦文(23699869) 14:10:42
大丁丁(123339791) 14:09:44
哦,是说我当时窗体没运行?
=======

青苹(350044607) 14:11:26
朱老师讲课,来晚了!
朱亦文(23699869) 14:11:28
那另一种实例化对象的方法是New
大丁丁(123339791) 14:11:58
那普通模块平时就能运行,是什么理由?
大丁丁(123339791) 14:12:57
又是头一次听说
朱亦文(23699869) 14:13:27
例如:
Dim frmOne As Form
Set frmOne = New frmA
Dim One As Double
One = frmOne.Rvt(12345.12345,3)
Debug.Print One

玩物尚志(527612341) 14:14:12
As是什么意思?
jimcloudy(1724935) 14:14:50
定义变量的类型吧
玩物尚志(527612341) 14:15:03
定义一个frmOne窗体变量?!
朱亦文(23699869) 14:15:04
这里的frmA就是frmA窗体类,通过
Set frmOne = New frmA
实例化成一个frmOne窗体实例
大丁丁(123339791) 14:15:43
那我没写入该窗体啊?
朱亦文(23699869) 14:15:55
那么对于,类模块的实例化,就是上面讲的第二种方法
玩物尚志(527612341) 14:16:01
窗体变量赋上一个窗体实例?
大丁丁(123339791) 14:16:18
我代码是写在存在的另一个窗体中呢?
朱亦文(23699869) 14:16:55
这里的New是指新建一个对象,对象是类的实例
恺(615879409) 14:17:22
所以要调用就要连窗体一起调用?
大丁丁(123339791) 14:17:30
哦,这是另一个同名的窗体
朱亦文(23699869) 14:17:56
由于,类没有实例化,因此才会出现大丁丁开始出现的问题
朱亦文(23699869) 14:18:19
听懂了吗?
朱亦文(23699869) 14:18:34
大家可以思考一下
jimcloudy(1724935) 14:19:00
听了有一点点概念,呵呵
好象跟asp的类和类的调用差不多
大丁丁(123339791) 14:19:06
那如果是frmB,就是另一类
朱亦文(23699869) 14:19:10
所以公用函数一般都放在一个模块中,而不是放在类中
大丁丁(123339791) 14:19:26
另类的就不能用这个函数
朱亦文(23699869) 14:20:11
类中的方法可以调用模块中的公用函数
朱亦文(23699869) 14:20:55
类包括类模块、窗体、报表
大丁丁(123339791) 14:21:04
等于说,普通模块是一直在内存中,类模块要先加载
朱亦文(23699869) 14:21:14
当然是指Access
朱亦文(23699869) 14:23:31
大丁丁(123339791) 14:21:05
等于说,普通模块是一直在内存中,类模块要先加载
=========
只打开Access数据库,模块中函数和过程就可以调用,当然与它的作用域有关,而类,必须要实例化成对象后,才可以使用
大丁丁(123339791) 14:23:52
那以后对窗体和报表都先打开为窗体视图,再进行调试
朱亦文(23699869) 14:24:20
呵呵,大丁丁听懂了
大丁丁(123339791) 14:24:54
收获很大
玩物尚志(527612341) 14:25:31
模糊啊
朱亦文(23699869) 14:25:55
大丁丁整理一下,放到论坛上去
玩物尚志(527612341) 14:26:21
好哦好哦,看总结帖子哦
大丁丁(123339791) 14:27:05
窗体中的函数,尽管定义了PBLIC,没有加载也不能被其他窗体调用


===================================

对朱老师的舍四进六函数进行调试,可以看出源程序的全部功能:
步骤:1,将源程序贴入一普通模块中(如果没有就新建一块)
   2,在程序的第一句工作语句设断点(在if句处)
   3,打开视图--立即窗口,并输入?Rvt(321.055,2)回车
   4,程序运行并在if处暂停,按F8一步步运行程序
   5,打开视图--监视窗口,将sfmt拖入,可以看到其值是321.055000000000000000
   6,同样方法可查看函数,将len(stmp)拖入,可看到其值是21
   7,按F5运行完程序,可在立即窗口看到函数的值

=====================================

朱老师的源程序:
Function Rvt(ByVal x As Double, ByVal n As Integer) As Double
' 四舍六入逢五奇进偶不进的函数(Access VBA)
' 作者:朱亦文
' 日期:2006.12.21

Const IFIX = 15‘取小数点以下15位,精度再高受double的数值限制
Dim sFmt As String‘文本的数据格式,也就是小数点后加上一串的零
Dim sRet As String, sTmp As String’sRet是按小数位数求得的文本值,stmp是加上一串零后的X值
Dim intR As Integer, intRT As Integer' intRT是要舍去的那位上的数值, intR是要舍去之前一位的值

If n < 0 Then n = 0‘如果是整数之前的数舍5,如543.21取整为500这种情况,n=-2
sFmt = "0." & String(n + IFIX, "0")‘先取一格式0.000000000000000,小数点后15个零

sTmp = Format(x, sFmt)’格式化为543.21000000000000000.小数点后取15位

If n = 0 Then
intR = CInt(Left(Right(sTmp, IFIX + 2), 1))’取的是小数点前一位,先取后面17个数,小数点算一个,再取其最左面一个数,就是3
intRT = CInt(Left(Right(sTmp, n + IFIX), 1))‘取的是小数点后一位,就是2
sRet = Left(sTmp, Len(sTmp) - n - IFIX - 1)’将没用的零去掉
Else
intR = CInt(Left(Right(sTmp, n + IFIX), 1))‘如果小数位数多,取前一位
intRT = CInt(Left(Right(sTmp, n + IFIX - 1), 1))’后一位
sRet = Left(sTmp, Len(sTmp) - n - IFIX + 1)
End If

If intRT = 5 Then‘如果后一位是5
If intR Mod 2 = 0 Then’而且能被2整除
Rvt = CDbl(sRet)‘只要将文本格式改为数值格式就行,5就舍去了
Else
Rvt = Round(x, n)’按正常5入处理
End If
Else
Rvt = Round(x, n)‘其他情况均按5入
End If
End Function
[阅读全文 | 回复(0) | 引用通告 | 编辑]

  • 标签:朱亦文 vba 
  • 发表评论:
    数据载入中,请稍候......