VB调用自己定义的函数

VB调用自己定义的函数,第1张

call

Testt

(你的

表格控件

名)

如果你要测试是否成功执行

dim

srtTemp

as

string

strTemp=Testt

(你的表格控件名)

if

strTemp<>"Er"

then

'成功执行

else

’调用失败

endif

不知楼主在C++区问VB是何意

函数和C++大体相同,如果是自己写的函数就先需要定义函数,VB函数分二种,一种是有返回值的(function),另一种是没有返回值的(sub),后者也被称为"过程"

public关键词定义了函数是全局可访问的,private定义了函数只能由函数所在模块使用即使在窗体模块中定义函数为public,那么在其他模块中也是不能访问的

VB函数定义和C++的区别一在于:VB靠public/private决定函数访问权限,而C++是如果函数原形不在调用源文件(cpp文件)中或被调用函数位置位于调用函数的后面,那么只需要在调用源文件中声明函数原型即可,或者将函数原型写到头文件中,然后在调用源文件中引用这个头文件即能对任意一个函数进行访问

区别二:C++的函数原型是指完整的函数定义,包含返回类型 函数名 ([参数列表]){ 语句1;语句2;;语句n[return 返回的值] },只要将返回类型声明成void时才不需要(也不能有return语句)C++的函数声明只需要写出与原形相同的结构,但不需要写实现具体形为的语句即{}内的内容不需要写

而VB中,一个模块中某个函数(或过程)调用另一个模块中的函数(或过程),那么被调用的函数声明时必须是public关键词定义的如果是同一模块中的函数,那么不管是public还是private定义的或者两者的上下位置,都可以访问,且不需要写函数声明

区别三,参数传递问题,VB是实参,即调用者传某个参数给被调用函数,那么被调用的函数有权修改传递的参数在C++中是形参,即调用者传某个参数给被调用者时,函数入堆,参数副本(即参数的copy)入栈,函数返回则函数出堆,栈中数据随函数出堆而出栈(虽然并没有被重置为0或空,但已经失去作用了)函数返回一个值(除非原型指定了void则没有返回值)栈中的数据不会影响到调用这个函数时传递的参数那么也就是说C++的函数只能有一个返回值不要失望,这是通常情况下,如果真的有需要调用函数后返回多个值是可以的,因为C++提供了指针和引用二种方式指针和引用解释起来就跑题了,呵呵,楼主如果是新手就去查查相关的资料,如果是老手,当我没说,囧简单点说指针和引用在函数参数上都是指向调用者所传递的参数的实体(不是副本)通过这二种方法,可以做到函数多值返回

C++搞这么麻烦是为什么答曰:数据保护机制可以最大程度上保护数据,防止随意修改参数后再将其返回,对此可能引起的代码错误是很难查出来的(只有不断的调试才会发现),也正是基于数据保护机制,通常C++的变量会要求尽可能的少使用全局变量

而VB根本没有这种保护机制

区别四:Windows API函数调用

VB中,需要在模块头部(即任何一个函数或过程前)声明被调用的API函数格式如下:

declare function(或sub) 函数名(或过程名) lib "库文件名(即DLL文件名)" alias 函数别名([参数名 as 参数类型],)as 函数返回值类型(sub无返回值)

过程如:

Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

函数如:

Declare Function CopyIcon Lib "user32" Alias "CopyIcon" (ByVal hIcon As Long) As Long

declare前指定为public时全局(工程中任意一个模块中)可访问,private则是当前模块可访问(窗体模块中不能定义为public)

C++调用windows api,都是引用头文件windowsh来一次性对所有可能用到的api函数和常数进行声明(= =还是头文件好啊)

VB调用API时默认是按地址传递,即byref 参数名 as 参数类型当我们想传递具体的值时将byref改为byval即可,意为按值传递所谓按地址即指,即调用者传递参数时传递的是这个参数在内存中的地址而按值传递则是读取这个参数的值再传递给被调用者

C++则全是按值传递(不使用指针和引用时都是形参,即是形参自然是取值了)

按地址传递还是按值传递按实际需要修改需要说明的是VB中按址传递时需要明确知道被调用函数是否支持按地传递,否则产生的错误可能使函数返回错误的值,也可能是致命错误而引起程序崩溃,系统死机等等(比如xxxexe遇到问题需要关闭,我们对此产生不便表示歉意囧)

区别五对于vb,过程(Sub)可以直接在单独的行上写上过程名即可,或者 call 过程名C++中,即使函数不接受参数,调用时也要加上(),在单独的行上写上函数名 后面跟一对()

想到的就这么多了不知是不是楼主想知道的

在VB中,这是没有参数也没有返回值的Sub过程调用。

GetkxF '就是调用GetkxF过程,因为没有参数,也不返回值,所以不需要括号()。

实际上是:Call GetkxF。这里省略了Call。

DisData 应该也是这种用法。

Call 语句:将控制权转移到一个 Sub 过程,Function 过程,或动态连接库 (DLL)过程。

语法:[Call] name [argumentlist]

Call 语句的语法具有以下几个部分:

Call 可选参数;关键字。如果指定了这个关键字,则 argumentlist 必须加上括号,例如:

Call MyProc(0)

name 必要参数,要调用的过程名称。

argumentlist

说明:调用一个过程时,并不一定要使用 Call 关键字。如果使用 Call 关键字来调用一个需要参数的过程,argumentlist 就必须要加上括号。如果省略了 Call 关键字,那么也必须要省略 argumentlis 外面的括号。如果使用 Call 语法来调用内建函数或用户定义函数,则函数的返回值将被丢弃。

若要将整个数组传给一个过程,使用数组名,然后在数组名后加上空括号。

vb中没有这个函数,你可以自己写一个嘛。

public

function

max(a

as

single,

b

as

single)

as

single

if

a

>

b

then

max

=

a

else

max

=

b

end

function

这样你就可以使用它了,如

debugprint

max(125,16)

这时就会输出125与16中较大的一个数。

当然,你也可以把以上自定义函数中的两个变量,换成一个数组,这样就可以不只是在两个变量之间返回最大值,而是在一个数组中返回最大值。

如:

public

function

max(a()

as

single)

as

single

dim

i

as

integer,

p

as

single

p

=

a(1)

for

i

=

2

to

ubound(a)

if

p

<

a(i)

then

p

=

a(i)

next

i

max

=

p

end

function

这样你可以先定义一个数组,并把你要查找最大值的数据存入这个数组中,再调用这个函数查找。

如:

dim

dat()

as

single

dat(1)=

dat(2)=

debugprint

max(dat)

这样就可以输出一组数组中最大值。

AddressOf 运算符

一个一元运算符,它将其后面的过程的地址传递给一个 API 过程,该 API 过程在参数表对应位置中需要一个函数指针。

语法

AddressOf procedurename

必需的 procedurename 指定要传递的地址是哪一个过程的地址。这个过程必须是发出调用命令的工程中的一个标准模块模块里的一个过程。

说明

当一个过程的名称出现在一个参数列表中时,通常该过程已经被计算,并且该过程返回值的地址也会被传递。AddressOf 允许该过程的地址被传递给动态链接库 (DLL) 中的一个 Windows API 函数,而不是传递该过程的返回值。API 函数然后就可以使用这个地址来调用相应的 Basic 过程,这个过程就是我们所知道的回调。AddressOf 运算符只出现在对 API 过程的调用中。

注意这句“AddressOf 运算符只出现在对 API 过程的调用中。”而不是给自身调用的。

调用函数应该用Call MyFunction(参数1,参数2)这样的形式。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11681609.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存