当前位置:首页 > 实用技巧 >

vb中参数传递方式(vb两个窗口之间如何传递参数)

来源:原点资讯(www.yd166.com)时间:2023-10-27 06:25:53作者:YD166手机阅读>>

Any,其实不是一种类型

其实,Any不算是一种数据类型,它只是告诉编译器,不检查数据类型而已。被Any修饰的参数,无论传递什么类型过去,编译时都不会报错,实际上却很可能发生内存溢出错误。所以,有人觉得它危险。再有,被Any修饰的参数,不能与ByVal关键字合作,不能传值,而只能传址,所以有人觉得它高效。

笔者在《》详细地介绍了参数传递过程中,实参与形参的一些特点,未阅读过的读者,可关注阅读。因为编译器不检查数据类型,实参传递给形参时,形参因不知道要分配的内存大小,就无法分配内存。所以,只能传址进行引用,而不能传值。

Any类型,对于VB/VBA使用API而言,只要理解了上述关系,并准确使用,不仅可以提高性能,最核心的是可以极大提高API使用的灵活性。就像上图所示,不需要显式传递字符串指针给lstrlenA函数,仅需要按平常所理解的那样,将字符串变量丢给Any修饰的参数,就可以自动传递字符串指针过去。

不过,Any再好,那也只是Declare的配套,跟自己的函数沾不上边的。不过,还有Variant呀,Variant就是非Declare函数的Any。VB/VBA中的所有数据类型,都可以传递给Variant。

2、Variant传数组,Optional ByVal/ByRef,就不是个事儿

『一.2』中的问题,涉及到数组参数的传递。在VB/VBA中,传递数组变量时,只能ByRef方式,而且不能使用Optional关键字。这无疑对于重要的数组来讲,是不公平的(吐槽点)。其实改用Variant,用这个另类Any,一切就迎刃而解了。

而且,可以ByVal传值,不会影响传入的数组变量。为了形象地说明,笔者写了个Demo测试如下图所示:

vb中参数传递方式,vb两个窗口之间如何传递参数(9)

看到没,ByVal传递数组哦

其中VarArrayInfo函数,提取Variant类型数组的数据地址。测试结果表明,数组变量可以ByVal方式传递参数,并不会影响传入的数组。更关键地是,数组可以作为可选参数进行传递了。

3、动态调用函数指针,Variant传参,参数类型和个数不再困扰

『一.3』中的问题,涉及到不定参数的传递问题。在VB/VBA中,可以使用ParamArray关键字修饰参数来实现这一目的。但是参数必须是Variant数组,且不能与Optional关键字组合。

或许有人说,既然Variant可以直接传递数组,还可以与Optional关键字组合,为何不直接使用Variant类型参数呢?这个,怎么说呢,只知其一不知其二啊。

ParamArray修饰的参数,本身可不传递参数啊,这不就是Optional关键字的意思了么。再者,它把数组展开,直接进行传递,多形象直观啊!尤其是,动态调用API,形式上与Declare方式也很像呀,容易理解和检查。

但是,无论是直接使用Variant传递参数数组,还是使用ParamArray关键字传递不定数参数,都必须对Variant有深入地理解。有需要进一步了解Variant机制的朋友,欢迎关注BtOfficer进行咨询哦。

三、Variant不仅是任性的小花,还是惊喜的小花

如果读者朋友们觉得,Variant传递数组,也不过如此的话。那笔者再给出一个测试Demo,看看下图的测试结果:

vb中参数传递方式,vb两个窗口之间如何传递参数(10)

Variant虽好,但是坑也挺多的

Variant的确可以传递数组,那当然可以像数组那样来使用数组了,比如上图中的v(0),表示数组中的第一个元素。在VB/VBA中,可以使用VarPtr函数获取非数组变量地址。a(0),不仅表示a数组中首元素地址,更代表首元素变量。所以,VarPtr(a(0))可以获取函数首元素地址。但是,传递给Variant的v(0),却不行了呢?

经验丰富的人员,一看VarPtr(v(0))的返回值,就知道这是栈地址。动态数组数据,都是分配在堆上的。这里面,是有猫腻滴。

其实,这就是Variant另一个让人惊喜的地方,它可以表现得像函数一样。v(0)中,v便是函数名,(0)便是函数列表,返回的元素值,便是函数返回值。还记得笔者以前提过,函数名就是一个临时变量么?如果读者朋友们理解这一点,就很容易理解上面的结果。

怎么样?Variant让你惊喜了吗?Variant传递数组时,可以像数组变量那样获取元素,但却不可以像数组变量那样获取元素地址。

欢迎关注BtOfficer呀(收藏、点赞、关注 转发),更多精彩仍在继续哦(专栏文章更系统,更精彩,但需要支持哦),有严肃的技术,也有轻松的唠嗑,期待你的加入!

栏目热文

女性吃苋菜有什么好处(吃苋菜对人有哪些好处)

女性吃苋菜有什么好处(吃苋菜对人有哪些好处)

它是女人的美容菜,补铁补钙最好,几天不吃就馋,好吃停不下。新时代的女性对于美容养颜的要求越来越高了,不是今天买个护肤品,...

2023-10-27 06:00:30查看全文 >>

霉苋菜梗对身体的好处(臭苋菜梗的功效与作用)

霉苋菜梗对身体的好处(臭苋菜梗的功效与作用)

钱江晚报·小时新闻记者 施雯 通讯员 鲁桑桑 高幸儿每到夏季,杭州人的餐桌上总会出现一道传统佳肴——霉苋菜梗。鲜美下饭,...

2023-10-27 06:26:28查看全文 >>

苋菜对身体有什么好处怎么吃好呢(吃苋菜有什么好处与坏处)

苋菜对身体有什么好处怎么吃好呢(吃苋菜有什么好处与坏处)

苋菜是我国古人很早就开始食用的蔬菜。成书于两千年前的,我国最早解释词义的专书《尔雅》就载有“蒉(kuai)”,其注释为“...

2023-10-27 05:44:55查看全文 >>

长期吃苋菜对身体有什么好处(吃苋菜有什么好处与坏处)

长期吃苋菜对身体有什么好处(吃苋菜有什么好处与坏处)

苋菜有“长寿菜”之称,每100克中含有:蛋白质3.2克、脂肪0.6克、碳水化合物7.1克、膳食纤维2.3克、维生素A13...

2023-10-27 06:14:48查看全文 >>

苋菜对身体有啥好处(苋菜吃了对人体有什么好处)

苋菜对身体有啥好处(苋菜吃了对人体有什么好处)

这人到了中老年啊,身体的各项机能就会慢慢地退化,走起路来也感觉大不如前,特别容易生病,所以在日常的饮食当中,我们就要适当...

2023-10-27 06:19:34查看全文 >>

vb中的参数传递地址(vb中参数只能按地址传递吗)

vb中的参数传递地址(vb中参数只能按地址传递吗)

在PLC中使用的寻址方式分为直接寻址和间接寻址两种方式。所谓的直接寻址,就是直接使用存储区或寄存器的元件名称和地址编号,...

2023-10-27 06:11:47查看全文 >>

vb参数有哪两种传递方式(vb参数传递有哪几种方法)

vb参数有哪两种传递方式(vb参数传递有哪几种方法)

Mastercam后处理命令块传递参数用法,新版中新加入的功能,此方法的用法非常接近VB.NET的用法,可同时传递多个参...

2023-10-27 06:15:22查看全文 >>

vb怎么调用带参数的方法(vb怎么定义和调用过程)

vb怎么调用带参数的方法(vb怎么定义和调用过程)

VB和DLL文件库文件一般指计算机上的一类文件,分两种,一种是静态库,另一种是动态库即DLL(Dynamic Link ...

2023-10-27 06:12:23查看全文 >>

vb输入数据的方法有哪些(vb怎么输入多个数据)

vb输入数据的方法有哪些(vb怎么输入多个数据)

今天学习的主要内容是刘金玉老师MySQL数据库零基础教程第11期。一、DML(一)MDL(Data Manipulati...

2023-10-27 06:24:20查看全文 >>

vb参数传递方式有哪些(vb参数传递有哪几种方法)

vb参数传递方式有哪些(vb参数传递有哪几种方法)

过程是构成程序的一个模块,往往用来完成一个相对独立的功能。过程可以使程序更清晰、更具结构性。VBA具有四种过程:Sub过...

2023-10-27 05:46:11查看全文 >>

文档排行