这就是我 |
|
用户登陆 |
|
最新公告 |
数据载入中,请稍候...... |
站点日历 |
数据载入中,请稍候...... |
最新日志 |
数据载入中,请稍候...... |
最新回复 |
|
最新留言 |
数据载入中,请稍候...... |
日志搜索 |
数据载入中,请稍候...... |
|
友情链接 |
|
其他信息 |
|
|
|
|
|
|
|
|
·朱老师讲课:读源码的技巧,关键词,实例化 -|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) | 引用通告 | 编辑] |
|
|
|
|
|
| |