Office中国论坛/Access中国论坛

标题: VB Variant 数据类型与用户自定义类型 [打印本页]

作者: zhuyiwen    时间: 2013-9-28 12:27
标题: VB Variant 数据类型与用户自定义类型
在 VB 的标准工程的标准模块中:
  1. Public Type EventRecord
  2.         TriTime As Date
  3.         TriType As String
  4.         CallMobile As String
  5. End Type

  6. Sub testVariant()
  7.     Dim er As EventRecord
  8.     Dim p As Variant

  9.     er.TriTime = Now()
  10.     er.TriType = “CallIn”
  11.     er.CallMobile = “13907309999”

  12.     p = er
  13. End Sub
复制代码
[attach]52459[/attach]

这样是有问题的。会出现“编译错误:只在定义在公共对象模块中用户定义类型能和变体类型相互转换或传递给后期绑定功能。”的错误。

[attach]52460[/attach]

而如果将这些代码放在窗体模块中:

[attach]52461[/attach]

程序编译通不过,出现“编译错误:在私有对象模块中不能定义Public的用户定义类型。”

[attach]52462[/attach]

将用户定义类型改为:
  1. Private Type EventRecord
复制代码
运行程序,同样报第一种情况的编译错误。

新建一个类模块,将用户定义类型移到类模块中,并将声明成Public,运行程序,同样报错。与第二种情况相同。

这说明一点,为了实现变体类型变量与用户定义类型变量的相互转换,在一个VB标准工程中,用户类型定义放在模块中是不行的,放在窗体或类模块中也是不行的,窗体或类模块都是私有的,无法找到公共对象模块。那么,怎么做才能做到后期绑定呢?

好了,我们来添加一个ActiveX DLL工程,将:
  1. Public Type EventRecord
  2.     TriTime As Date
  3.     TriType As String
  4.     CallMobile As String
  5. End Type
复制代码
移到这个工程的类模块中,设置该类的Instancing属性,该属性确定在工程之外是否能创建公共类的实例,它有6种选择,在这里我们选择 5 – MultiUse,允许其它应用程序创建该类的实例。

再回到原来的工程,设置工程的引用,添加“工程2”(就是上面的ActiveX DLL工程)。删除工程的模块和类模块,只剩下窗体模块:

[attach]52463[/attach]

运行程序,程序能够正常通过。

结论:当我们要开发一个应用程序时,我们应该将我们用到自定义类型都放到一个ActiveX DLL工程,形成公共的类型库(TypeLibrary),供程序调用。[groupid=322]ACC应用开发心得交流[/groupid]
作者: admin    时间: 2013-9-28 14:38
好东西!!
作者: 岭南王子    时间: 2013-9-29 16:21
辛苦了,朱总!继续加油!!!
作者: t小宝    时间: 2013-10-9 10:33
很好的技巧!
不知道有没有别的方法...
作者: huangli0356    时间: 2014-2-10 10:08
专心,专业。专注。。向你学习。
作者: wang1999    时间: 2014-3-22 22:15
放到 ActiveX DLL 后, 这个自定义类型就是一个类对象,所以varaint可以转换

应该这里varaint引用的是其地址,通过VARAINT设置值后,其er的值应该也会同时变,即p和er指向同地址


作者: huzijunreokiki    时间: 2015-5-28 17:28
顶!
作者: LeeTien    时间: 2016-2-1 08:54
没错,是这样的




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3