版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
代码基础:
变量的简单定义格式:dim变量名这种定义未指明变量的数据类型,这时的变量类型是"
变体类型”,它自动识别字符串或数字(字符串要加引号)。
数据类型的定义方法:
定义变量最简单的方法是用“Dim”关键字,它的语法:
Dim【变量名】As【数据类型】
如:DimIndexAsInteger
也可以在一行中定义多个变量,如:
DimIndexAsInteger,NumberAsLong
但把多个变量定义成同一类型不能写:
DimIndex,NumberAsInteger,这样实际index是变体变量。
有时为了简便,也以符号进行简单的定义,作用是和上面一样的。整型可以用“%”代替,长
整型可以用代替,单精度可以用"!”,双精度实型可以用"#"定义,字符型用如刚才的
第一个例子可以写成:
DimIndex%等价于DimIndexAsInteger
对于常量的定义用Const定义,如:ConstCOLOR=255。
constPI=3.1415926
注:变量一般用小写,常量则全部大写。
对于程序中经常出现的数值,应设常量,这样一是书写方便,其二,如果要改变该数值,只
需改变定义常量的语句值,而不需改变每个语句,提高了效率。
重点笔记:变量
变量名要以字母开头,在变量名中唯一能用的符号是下划线(_),相同的大写或小写字母的
变量,视为同一变量,即不区分大小写。
变量的作用范围关健字:Public(公用),Private(单个模块),Dim(局部);在VB代码区
域中包含四类模块区域:窗体,MDI窗体,标准模块,类模块。这是第一层;每一模块区
域又分成了通用区域和过程区域,这是第二层。这就是VB的结构,各个区域之间界线分明。
变量受这些因素的影响也要采用不同方式,标明它的作用范围是全局还是单个模块还是单个
过程。
1,在单个事件过程中可见的:在本过程内部用DIM关健字;
2,在单个模块中可见的:在本模块顶部(窗体模块会标明"通用"字样)声明段用Private关
健字(也可用DIM关健字);注意,不能在一个过程内部声明模块级变量。
3,在所有模块可见的:在任一模块顶部(窗体模块会标明”通用“字样)声明段用Public关
健字,注意:1,在Form窗体模块顶部的“通用”部分不能声明public的数组,常数,结构类
型和API函数。2,在一个过程的内部不能声明公用变量。
在一个事件中用DIM声明的局部变量,每次触发时产生,完成后消失,不会保留事件运行
后的值;如果要一直保留一个局部变量的值,要使用-静态变量.在过程内部用static关健
字声明,它能在第二次触发该事件时保留前一次运行结果,继续运算,而不会来个"重新DIM,
初始化”,它只在运行时第一次触发该事件时进行初始化。
注:静态变量如果要初赋值,不能直接进行,要根据变量未赋值的状态使用if语句,如Ixn
为变体变量:iflxn=EMPTYthenlxn=336525,例下:
PrivateSubCommandl_Click()
StaticIxnAsInteger
Ixn=5错!!应改为IfIxn=0ThenIxn=5
Ixn=Ixn+1
PrintIxn
EndSub
变量的数据类型:
一,数值型。
1,整型(integer),声明字符%,范围-32768到32768。占用2字节。
2,长整型(long),声明字符&,范围-2147483648到2147483648。占用4字节。
3,单精度实型(single),声明字符!,小数点后有效数字7位,占用4字节。
4,双精度实型(double),声明字符#,小数点后有效数字15位,占用8字节。
5,货币型(currency),声明字符(Email地址中的那个at号"小老鼠"),这种类型精度高,
专用于货币计算或定点计算,小数点后有效数字4位,占用8字节。
6,字节型(byte),存储0--255之间的整数,常用来存储二进制数据,图形和声音文件等,
它只占1个字节,节省资源!
二,字符串型(string),声明字符$.
1,变长字符串变量,平常定义的如:dim(public)1xnasstring,运行时自动调整长度。
2,定长字符串变量,定义如:dim(public)lxnasstring*50,这时Ixn被定义为包含50个字符
的变量,给它赋值时若少于50个字符,则用空格补足(要删除空格用Trim和RTrim函数),
多于50个则删掉。使用定长字符串的情形如在随机文件的读写操作中,注:定长字符串不
能在类模块中定义为公用(public)变量。
三,日期型(date)
任何可辩认的文本日期都可赋值给date变量,日期文字前后要加上#号,或直接用文本定义,
格式:dim变量名asdate.
dimIxnasdate
赋值格式:变量=#(或')月/日/年/时:分:秒AM或PM#(或")
lxn=#06/14/0120:50:31AM#或
lxn="06/14/018:50:31PM"
如果是一个数值直接赋给日期型变量,如lxn=35477.998,则小数点左边的值代表日期信息,
小数点右边的值代表时间信息(如午夜为0中午为0.5),上面Ixn的时间值显示为97-2-16
23:57:07.(我没看懂)。
四,逻辑型(boolean)
也叫布尔型变量,它只有两个值:true(-l)和false(O).[问题:当为true时值是1还是一1?我
试了•一下是一1,即用printcint(x)试的。]
五。变体型(variant)
可适用于各种数据类型,一个没有指明类型的变量VB就指定为此类型。
六,对象型(object或commandbutton或textbox等对象名,模块名)
这种变量为指向程序中对象的指针,先声明为某类型对象,格式:
dim变量as对象类型名(如果对象为object,则表示可指向任何类型对象)dimIxnas
commandbutton(定义Ixn为按纽对象类指针),
赋值格式:set变量名=对象名称
Setlxn=command1
这时,就可以用Ixn来代替command1了,如:lxn.caption="退出"
注:如果加上New关健字,可以新建窗体,类模块,对象库中的对象,对象变量就成了1
个对象。Set变量名=New对象名称。
七,自定义类型,也叫结构类型。
第1步:建立类型:必须在模块级用type语句定义,格式:
private(或public)type类型名
成员1as类型
成员2as类型……
endtype
如:privatetypeIdd
aasstring
basinteger
casstring
endtype
第2步:定义此类型的一个变量:格式:
dim(或public等)变量名as刚才创建的类型
如:dimIxnasIdd
第3步:变量的赋值及使用:用点号连接每一个成员,分别赋值,赋值格式:
变量.成员1=值
变量.成员2=值……
如:lxn.a="李小敏"
lxn.b=336525
lxn.c="李新宁"
凡是在程序中使用时,就要以“变量.成员名”来引用。
八,枚举类型。在模块通用部分声明,格式:
Private(Public)Enum类型名privateenumIxn
成员1(可选=常数)李新宁
成员2(=常数)……李小敏
endEnumendEnum
然后在程序中定义一个此类型变量,Dim变量as类型。如:dimmasIxn
意思是:变量m的"取值范围”是:李新宁(值为0)或李小敏(值为1)
"值为0"?不给成员赋值,缺省状态时第1个成员为0(相当于写:李新宁=0)
第2个成员为1…类推,总之成员的值为一个“长整数”。可自己赋给。枚举类型的作用是在
代码中可简化某些总在几个值之间切换的情况,引用如写ifm=李新宁thenend
(这种类型实用价值不大)。
变量数据类型的转换,有以下函数:
cbool(字符串或数值表达式)--返回布尔类型,如:a=2:b=2:lxn=cbool(a=b)
那么Ixn值为true
cbyte(O到255的整数)一返回BYTE类型
ccur(参数)-返回货币型
cdate(一个有效的日期表达式)-转换为日期型
cint(参数)-返回(或叫转换)integer型,参数的小数部分四舍五入
clng(参数)-返回long型,小数部分四舍五入。
csng(参数)--返回single(单精度)型,
cdbl(参数)一返回double(双精度)型。
cvar(参数)-返回变体型
cstr(参数)--返回string字符串型。
判断代码中一个变量的数据类型的函数:vartype(变量名)或typename(变量名),vartype(变
量名)返回一个整数值,如返回2代表整型,3代表长整型,4代表单精度,5代表双精度,
7代表日期型,8代表字符串等。例如有个叫Ixn的变量,不知它是什么类型,可用
x=vartype(lxn),如果x等于2就说明Ixn是整型,8就是字符串等等。lypename(变量名)返回
一个该变量类型名的字符串,如Ixn是整型变量,那么typename(lxn)返回值为“integer"字符
串。
★数组的定义类似于变量定义,所不同的是数组需要指定数组中的元素个数,例如:
Dimlxn(99)AsInteger
这个数组中包含100个元素,下标从0到990
也可以指定下标的起始值,例如:
Dimlxn(2to10)AsInteger
这个数组含有九个元素,下标从2至U10。
还可以定义多维数组:
Dimlxn(4,2to5,3to6)AsInteger
上例定义了一个三维数组(4X4X4)。
★VB算术运算符:+(加),-(减),*(乘),/(除),\(整除),Mod(取余数),人(乘
方),&(字符串连接)
算术运算符优先级:()括号;八乘方;-负号;*。/乘,除;'整除;Mod取余;+,-加,减
VB比较运算符:=(等于),<>(不等于),〈(小于),>(大于),<=(小于等于),>=(大于等于)
逻辑运算符:And:两边表达式为真时,结果为真;
Or:两边表达式只要有一个为真时,结果为真;
Not:后面跟的表达式若为真,结果为假,后跟表达式为假,结果为真;
Xor:两边表达式一真一假时,结果为真,若两边表达式同真同假,结果为假。★IF……
THEN语句:
简单:if条件then语句
复杂:if条件1then
语句11
语句12
语句13……
elseif条件2then
语句21
语句22
语句23……
elseif条件3then
else
前面条件都不成立时执行语句
endif
分支结构:selectcase语句
结构:selectcase变量(也可以是一个属性或表达式)
case可能值一(数值,字符串或其他值)
语句
case可能值二
语句
case可能值三
语句
case可能值四,可能值五,可能值六……(如果有多个可能值都执行一条语句,写在一起,
用逗号隔开)
语句
caseelse(也可以没有)
语句
endselect
在selectcase语句中可以使用关系运算符大于,小于〈等于二等关系运算符,需要用关键字IS
和TO。用个例子来说明:
PrivateSubCommandl_Click()
DimageAsInteger
age=Textl.Text
SelectCaseage
CaseIs<14(如果age小于14时)
Label1.Caption="小朋友,你好!”
Case14To23(如果age在14至lj23时)
Labell.C叩lion="学生朋友,认真读书吧。”
Case24(如果age是24时)
Label1.Caption="你和我是同龄人”
CaseIs>100(如果age大于100时)
Label1.Caption="你真是个老不死!”
CaseElse(如果age不满足以上所有值的范围时)
Labell.Caption="按道理我要尊重你。”
EndSelect
EndSub
看会了吧,就照着用即可。
循环结构:FOR……NEXT……语句:
格式:FOR循环变量=初值TO终值STEP步长
循环体
NEXT循环变量
如果在循环执行过程还未结束时要跳出循环,可用exitfor语句。
例:PrivateSubCommand2_Click()
Dima%,name$
Fora=1To10
name=InputBox,输入姓名”)
Printname
Ifname=nlxnHThenExitFor
Nexta
EndSub
第二种很重要的循环结构是:DO循环
格式:A。DOWHILE条件
循环体
LOOP
BoDO
循环体
LOOPWHILE条件
将WHILE条件放在循环体的前面与后面,是不同的,A格式的条件在前,执行时先检测条
件,为真则执行循环,为假则不执行循环,如果第一次检测条件即为假,则一次也不执行循
环,B格式的结构WHILE条件在后,能保证不论条件的真假至少能执行一次循环。
例:PrivateSubForm_Load()
Dimhs$,ss%
Do
hs=InputBox("输入","华氏")-INPUTBOX的提示栏,标题栏,它的所有输入都是字符型
ss=Int((Val(hs)+40)*5/9-40)
MsgBoxss,,"摄氏度"--MSGBOX的输出内容,标题栏,无按纽参数
LoopWhilehs<>""但逗号不能少
end-由于是在formjoad事件中,所以这个end不可丢。
EndSub
上例将华氏温度转为摄氏度。
★编写对象的自动拖放操作:
lo将要拖放对象的dragmode属性设置为1(这样就可自动拖动)
20设置要拖放对象在拖动过程中的图标提示:dragicon属性。
3。编写拖放终点对象的dragdrop事件(或dragover事件)过程。
例:将窗体上图片框1的图片拖到图片框2里:
PrivateSubForm_Load()
Image1.Picture=LoadPicture(”c:\我的文档'mywebs'红楼梦4.bmp")加载图片
Image1.DragMode=1对象可移动
Image1.Dragicon=LoadPicture(nc:\ucdos\ico\print.icon)移动时的图标
EndSub
PrivateSubImage2_DragDrop(SourceAsControl,XAsSingle,YAsSingle)
Image1.Visible=False当移到图片框2时,图片框1隐藏。
Image2.Picture=Image1.Picture将图片复制到图片框2中
EndSub
在image2的dragdrop事件中有三个参数:source和x以及y,source的意思是“源对象”,即
要拖动对象,这里可用它来代替image1,如在事件过程中写:source.visible=
falseimage2.picture=source.picture
★在窗体中添加简单的动画:对象的移动MOVE方法:
要移动的对象.MOVE移动后横坐标,纵坐标,宽度,高度
piclurel.move800,500(单位:堤;1堤=1/1440英寸
用MOVE方法不仅可以移动对象位置,而且可以改变对象的尺寸大小,如下:
对象名.moveleft,top,width,height
Form1.Move5000,0,5000,50(注:单位为堤)
例:PrivateSubForm_Load()
Picture1.Picture=LoadPicture("c:\我的文档'mywebs'红楼梦l.bmp")
Timerl.Interval=1
Timer2.Interval=1
Timerl.Enabled=True
Timer2.Enabled=False
EndSub
PrivateSubTimerl_Timer()
IfPicturel.Left>0AndPicturel.Top>0Then
Picture1.Left=Picturel.Left-50
Picturel.Top=Picture1.Top-70
Else
Timer2.Enabled=True
Timerl.Enabled=False
EndIf
Picture1.MovePicturel.Left,Picturel.Top
EndSub
PrivateSubTimer2_Timer()
IfPicturel.Left<5000AndPicturel.Top<3000Then
Picturel.Left=Picturel.Left+50
Picture1.Top=Picturel.Top+70
Else
Timerl.Enabled=True
Timer2.Enabled=False
EndIf
Picture1.MovePicture1.Left,Picturel.Top
EndSub
★添加标准模块:"工程"菜单"添加模块"菜单项。module1是缺省模块名。此名字可在其
属性窗口中改变(只有此一项“属性")。标准模块与窗体模块并列于一个工程之内。
在标准模块中声明公用变量(或叫全局变量)格式:
public变量名as类型
publicIxn
在前面我们用DIM定义变量,它们都只是局部变量,即只在某个事件过程中可见,而在标
准模块中定义的全局变量,则在整个工程中可见,即定义一次之后在其它任何事件中可直接
访问。
在标准模块中创建通用过程:通用过程在整个程序中可见。象全局变量一样。
可创建三种类型的通用过程:函数过程,子过程(也叫sub过程),属性过程
函数的语法格式:publicfunction函数名(形参表)as返回值类型(这个"as返回值类型"
不能丢!!)函数体
函数名=返回值
Endfunction
在事件过程中调用函数的方式为:变量=函数名(实参)-它代表一个确定值,本质是一个
变量,可以出现在变量可出现的任何地方。
附出错经验一则:我想在一个事件中用个变量a,使第一次单击该事件时a=l,第二次单击该事
件时a=2;第三次单击该事件时a值为3,即自增1的运算,我在事件中写:dima
a=l
a=a+l
可每次单击都得到同一个值2,原来,这是因为a是该事件中的局部变量,
每单击一次就重新执行一次,后来,我想在form」oad()事件中写:dimaa=l,
然后在该事件中只写a=a+l,结果却变成a每次都是1,怎么回事?form_load事件不是每次
程序运行时自动运行的吗,没错,但form」oad本身也只是一个事件,在其中定的变量
dima也属局部变量,只在form_load一个事件中可见,因此在另一个事件中用到的a根本
没定义,如何定义一个变量在同一个窗体模块中各事件均可见呢?那就是在“(通用)"部分
进行变量的声明,这样在该窗体模块中都可见,但通用部分不能直接进行赋值等运算(可按
格式编写函数,子程序等等,同标准模块),参考办法:(通用):dimaform」oad():(在其他
事件也可,只要在引用a值的那个事件前能赋a=l即可)a=l引用a的事件:a=a+l
,”对象.属性名”的本质是一个变量,是在该窗体模块(通用)中缺省声明的变量
在标准模块中创建子过程:格式:publicsub子过程名称(形参)-此处要括号
过程体
endsub
函数与sub过程的不同是:函数用其名字返回一个值,子过程处理一段程序过程,无返回值。
在标准模块子过程中设置某个对象属性时,必须指明哪个窗体,如:publicsublxn()
form1.image1.visible=trueendsub其中那个"forml."不能丢。
在事件中调用子过程的格式:子过程名称实参-这里的实参不要用括号,如果调用时作
为表达式才要括号,多个实参用逗号分开。
不论是函数或是sub过程,其形参与实参之间必须保证类型与数量的一致。
★在文本框的一个输入字符串尾加上"&chr(13)+chr(10)”,它能自动换行。或者用VB的常
数vbCrLf也可换行。相当于C中的"\n".如:a$="李新宁"&chr(13)+chr(10)textl.text=a$
★什么是集合?集合是一组相关的对象。
窗体上的全部对象被称作controls(控件)集合,如果一个程序有多个窗体,就要在前面加
上窗体名称,如:forml.controls,每个窗体都有一个controls集合。这种"集合"被视作也是该
窗体的一个对象,它与窗体的关系地位有点象windows的文件夹。可以通过集合引用其中
的对象,格式一,直接使用(集合名!元素):
窗体名称.controls!对象名称.属性=属性值
form1.controls!label1.caplion="李新宁"
注:其中的感叹号是controls集合与对象的连接符号
格式二,采用该对象在controls中的索引值(集合名(索引)):
窗体名称.controls(索引值).属性名=属性值
form1.controls⑴.caption="李新宁"
注:一个对象在其所在窗体controls集合中的下标是如何排列的呢?-按对象创建时的顺序
逆向确定其下标值,最后一个创建的对象下标为0,倒数第二创建的那个对象下标为1,如
果该窗体共有n个对象,那么一开始创建的那个对象的下标为n-1.
集合的运用:FOREACH-IN-NEXT循环,对一组对象(对象组)的操作。
格式:FOREACH对象变量IN集合名
对当前对象的操作过程
NEXT对象变量
以上用于对一组对象的操作,例如将窗体上所有对象的位置向左移1000堤:
PrivateSubCommandl_Click()
ForEachIxnInControlsIxn是"当前对象"的"替身"
Ixn.Left=Ixn.Left+1000将当前对象的left属性加1000
NextIxn下一个controls里的成员
EndSub
如果是有目的地选择一部分对象的移动,怎么办呢?可以利用对象的标记tag属性,区别不
同对象,下例tag属性值为Ixm的对象就不移动,
PrivateSubCommandl_Click()
ForEachIxnInControls—controls中的每个对象
Iflxn.Tago"Ixm"Then
Ixn.Left=Ixn.Left+1000
EndIf
NextIxn
EndSub
PrivateSubForm_Load()
Command1.Tag="Ixm"-tag是个有趣的属性,它可以由程序员指定一个
EndSub该对象的“标记”,好区别其他相关对象。
集合不仅有controls一种,还有其他如窗体集合,数据库集合等,值得重视。
★数组:固定了元素数量的数组叫定长数组,元素数量可在程序运行中改变的数组叫动态
数组。
定长数组的声明:全程(公用)数组(在标准模块中):
public数组名(第1维长度,第2维长度,……)as数据类型
局部数组(在某事件中):
static数组名(第1维长度,第2维长度,……)as数据类型
例:publiclxn(19)asstring下标从0到19共20个元素。
创建动态数组:步骤:1。不指明下标定义数组。如publiclxn()asinteger,同时在标准模块中
定义一个变量。如:publicaasinteger
2.在程序某处设置一个变量(或其他可确定值)值,如:a=inputbox("输入“,”个数");
3。用redim语句确定数组大小。如:redimlxn(a)
也可以不用第3步,直接在数组使用时用a限定其FOR……NEXT……循环上限。
forx=ltoa
lxn(x)=
nextx
在一个事件的中途要退出这个事件,用ExitSub关键字。
★VB程序中的出错处理:错误处理程序使程序在出错时继续运行,处理出错的步骤是:
1,在程序中可能出错的语句前加上一条语句:
onerrorgoto标号:
如:onerrorgoloIxn:
此处标号是当onerror后一条语句出错时,程序将转到标号指定的”错误处理程序段“。通常
放在本事件过程的底部。如果只是出错时起语旬转向的作用,则"错误处理程序段"可空。但
标号及冒号不能少,如:
commondialog1.cancelerror=true列出出错的情形
onen-orgotoIxn:出错时转向Ixn:
commondialog1.showsave如果用户单击了"取消"按纽,就会"出错"。
Ixn:为空,只是跳过事件体,直按endsub了。
endsub
如果只是出错时将程序转到下一句,只要在出错语句前加上OnErrorResumeNext.
真正的错误处理程序要用到一个属性变量:Err.Number,它就是在遇到程序崩溃时对话框中
的那个数字,表示是第几号的错误。另外,在事件底部,错误处理程序开始的标号前,一般
要加上ExitSub语句,以便使程序在无错的情况下不会去执行错误处理段。在错误处理程
序结束时,要用"resume"将程序执行顺序返回程序中。resume后可跟标号,举一个例子如下:
privatesubcommandl_click()
onerrorgotoIxn:出错时转向Ixn:
exitsub防止程序正常时也执行后面的出错程序,因此无错时结束事件。
Ixn:出错程序段标号(名称)
iferr.number=71then如果出现71号错误
msgbox("软驱门没关好"),,“软驱出错”提示
resume返回程序出错处,如果想只提示一次,那么用resumenext执行下一句else
msgbox("无法找到此文件),"找不到"其他错误
resumestop:转向标号为stop:语句
endif
stop:为空
endsub
还有一个属性变量err.description,它显示出错时的文字提示内容。可直按用msgbox输出到用
户,注意:单独的resume语句返回出错的原程序语句,如果错误一直存在,那么就一直显
示,因此,有必要改为resumenext或在程序中采用如下技巧(出错提示三次后就越过错误):
PrivateSubForm_Load()
Dima%在事件开头声明一个变量a
OnErrorGoToIxn:
Image1.Picture=LoadPicture("c:\")
ExitSub
Ixn:
Ifa<3Then如果少于三次就继续提示
MsgBox(Err.Description),,"error"用msgbox函数输出对话框
a=a+l用于记录次数
Resume返回出错处
Else
resumenext返回出错下一条语句
EndIf
EndSub
访问系统DLL库:系统WINDOWS提供了三个DLL库,它们的库名为:USER32;
GDI32;
KERNEL32
要访问DLL,先要给程序添加一个标准模块,在标准模块中声明DLL过程。
PublicDeclaresub过程名lib"库名"alias”别名"(参数表)或
PublicDeclarefunction函数名lib"库名"alias"别名"(参数表)as返回值类型
例:PublicDeclareFunctionGetWindowsDirectoryALib"kemel32"(ByVaiIxnAsString,ByVai
IxmAsLong)AsLong真酷!连参数名也自定了。
说明:
其中,过程名或函数名可以自定,如果是自定的(不同于DLL库中的名字),那么就必须在
Alias”别名"中写出它在DLL库中的全名;如果过程名或函数名就是DLL库中的过程名,
则Alias"别名"可以省略。如上例若将API函数GetWindowsDirectoryA换成Idd,写成:Public
DeclarefunctionIddlib"kemel32"alias"GetWindowsDirectoryA"_
(byvalIxnasstring,byvalIxmaslong)aslong
声明了API函数,它的调用与调用一般的VB函数没区别。
参数表:声明部分的"形参"有两个值得注意的关健字:ByVaiflByRef
byval意为"值传递”,是将实参的值拷贝过来,API过程用的是“实参”的复制品,不会使原参
数产生变化。
byref意为“地址传递”,是将实参在内存中的地址(指针)传递过来,如果在过程中改变了
该地址的内容,那么会使原参数的内容产生变化。
重大注意;字符串都是传地址的。如果在形参声明中用Byval,则传递字符串的首字符指针
(也就是地址),如果用BYREF,则传递指向字符串首字符指针的指针。
重大注意:在形参声明中不注明byval和byref的情况下,缺省为byref,即指针传递。
在API访问和参数类型声明中,有一个很好的帮助工具,那就是API浏览器(在外接程序
管理器中),在其中查找所需API,并查找相应类型声明,然后用剪贴板复制到标准模块的
声明中,再自定义一个这种类型的变量,如:
PublicTypeMEMORYSTATUS数据类型声明,从API游览器中复制
dwLengthAsLong
dwMemoryLoadAsLong
dwTotalPhysAsLong
dwAvailPhysAsLong
dwTotalPageFileAsLong
dwAvailPageFileAsLong
dwTotalVirtualAsLong
dwAvailVirlualAsLong
EndType
PublicDeclareSubGlobalMemoryStatusLib"kerne132"_API声明
(IpBufferAsMEMORYSTATUS)
PublicIxnAsMEMORYSTATUS定义一个这样的变量,好在事件中调用时当实参用。
调用API函数时,格式如下:
CALL函数名或过程名(实参)
CallGlobalMemoryStatus(lxn)
如果实参是一个“结构类型”,引用时就用”实参.分量”来表示每一项返回值,如:
MsgBox(Ixn.dwAvailPageFile),,"a"
MsgBox(lxn.dwAvailPhys),,nbn
MsgBox(Ixn.dwAvailVirtual),,ucn
MsgBox(Ixn.dwLength),,"dn
MsgBox(Ixn.dwTotalPageFile),,ne"
MsgBox(Ixn.dwMemoryLoad),,"f*
MsgBox(Ixn.dwTotalPhys),,ngM这些a,b,c,d,e是标题条中随便起的。
用VB在硬盘上创建一个文件夹:
Mkdir语句。格式:
Mkdir”路径及文件夹名"
mkdir"c:\windows\desktop\李新宁"在桌面上创建个名为"李新宁"的文件夹
又如:PrivateSubCommand2_Click()
MkDir"c:\windows\desktop\mydir"
EndSub
如果缺省路径,则为本VB程序的当前路径,如:mkdir"mydir”,在当前目录下创建一个文件
夹,名为mydir.
用VB删除一个文件夹(空文件夹):RmDir语句,格式:
rmdir"路径及文件夹名"
用法与上面类似,此不再说明.如果一个文件夹内有文件,那么,要先用KILL语句删除文件,
再用rmdir删除文件夹。格式:
kin”路径及文件名"
在路径及文件名中,省略路径则指当前路径,并可用通配符"*“和"?”来删除多个文件,如:
killtxt",将当前目录下的所有文本文件全部删除。注意:KILL语句删除的文件不会放
入回收站。
在调用函数或过程时,该函数或过程如果作为表达式,则其实参要括号,如果调用时是作为
语句,实参则不要括号。下面两句是等价的。
SetWindowTextAForml.hwnd,"API函数修改标题栏文字”一函数语句
CallSetWindowTextA(Forml.hwnd,"API函数修改标题栏文字”)-函数为表达式
API调用格式中的lib"库名"有一点要注意,如果不是调用Windows\system文件夹下的DLL
库,则要指明路径名,如:
publicdeclarefunctionIxnsdlllib"d:\student\mydll.dll"(byvalaasinteger,byvalbasinteger)as
long
在程序中窗体的运行位置是用一个叫做“窗体布局”的窗口来调整的,可否用另外的替代法,
而不用这个不精确的"窗体布局"窗口呢?
当然可以,那就是在代码中,例如要使窗体居于显示器中央,有两个新属性变量,screen.width
和screen.height,分别表示本显示器的屏幕宽度(screen.widlh)和显示器高度(screen.height).
用屏幕宽度减去窗体F0RM1宽度再除以2,就可得到FORM的left左边距了(也就是横坐
标吧),用屏幕高度减FORM1高度再除以2。就可得到FORM的top上边距了(纵坐标),
这样便可居中,如下:
Form1.Left=(Screen.Width-Form1.Width)/2
Form1.Top=(Screen.Height-Form1.Height)/2
VB基本概念:对象-对象是具有某些特性的具体事物的抽象。
我在使用VB时遇到一个问题,我想用一个组框(frame1)将几个按纽括在一起,可是当组
框画上去后却会把按纽都覆盖掉。按纽不见了(在framel图层下面),怎么办?什么办法可
以决定几个对象重合时,哪个在上,哪个在下?办法如下:1,选中要改变图层前后的对象;
2,在“格式”菜单中“顺序”菜单项中选“置前”(在上面)或“置后"(在下面)即可。另外,在
代码中也可以,用zorder方法,格式:
对象名.zorderO或1(0为置前,1为置后)
frame1.zorder1
重点笔记:事件
在WINDOWS中最主要的事件就是鼠标事件,特别是其中的click单击事件,此外还有
dblclick事件:双击事件,用法与click一样。
mousedown事件:鼠标按下时发生,有一个值得注意的参数button,它返回按下鼠标左键还
是鼠标右键,采用ifbutton=vbleftbutton…代码来写。
mouseup事件:鼠标先按下然后抬起时发生,用法与mousedown一样。
mousemove事件:鼠标经过时发生。
第二类的事件就是键盘事件,这类事件的掌握要加强。一个控件得到焦点后,就可以触发这
一类事件,有以下几种:
keydown事件:按下键盘上某个健时发生。但键盘上键那么多,需要用它返回的keycode参
数来指明按了哪个键,例下:
PrivateSubForm_KeyDown(KeyCodeAsInteger,ShiftAsInteger)
IfKeyCode=vbKeyBThen
Print"你按下了字母B"
ElselfKeyCode=vbKeyFlThen
Print”你按下了Fl键”
EndIf
EndSub
注:在keycode参数中,主键盘上的数字键和数字小键盘上的数字键是不同的,主键盘上用
vbkey0-vbkey9表示,而小键盘上的键用vbkeyNumpadO-vbkeyNumpad9来表示。
keyup事件:松开按键时发生,与keydown事件用法一样。
keypress事件:按下某个键接着松开这个键时发生。注意,它的参数与keydown及keyup不
同,它是采用字符ASCII码的方式,即用一个叫Keyascii的参数名,可以区分大小写,但
有些功能键不能用。
ifkeyascii=O到255的一个整数Ihen...来写,例如:
PrivateSubForm_KeyPress(KeyAsciiAsInteger)
IfKeyAscii=120Then'120是小写字母x的ASCII码值
UnloadMe
ElseIfKeyAscii<48OrKeyAscii>57Then'数字键的ASCII码在这个范围内
MsgBox("你输入的不是数字)48
EndIf
EndSub
其他重要的事件有:
change事件:当对象的内容改变时发生。
gotlbcus事件:当焦点从一个对象移动到当前对象时,当前对象发生gotfocus事件。
lostfocus事件:当焦点从当前对象移出时,当前对象会发生lostfocus事件。
★keydown事件和keypress事件有什么实际运用上的差别?keydown多常用于功能键(如
F1),需要shift,Ctrl,Alt+字符键的"组合键",区分数字小键盘和常规数字键等keypress所不
能的情况,keypress以ASCII码来区分按键,侧重"键的内容",而keydown和keyup侧重"
键的位置"。
我想在文本框中限制只能输入数字,怎么办最方便?可用keypress事件,如下:
PrivateSubText1_KeyPress(KeyAsciiAsInteger)
IfKeyAscii<48OrKeyAscii>57Then
KeyAscii=0等于0表示没按键,它在textl对象text属性接入字符前产生,因
Beep此可限制输入。
EndIf
EndSub
集合(collection):用来存储类似数组的一组同类变量,它与数组不同的是,集合是一种对象,
它不仅可通过索引值来访问其中的元素,还可通过关健字来访问其中元素。声明格式:
DIM(或PUBLIC)集合名asnewcollection
dimIxnasnewcollection
既然集合是一个对象,就用方法和属性去操作它,有三个方法和一个属性:
ADD方法:添加元素到集合对象中;格式:
集合名.add元素内容,关健字,添加到…前,添加到…后(添加位置)
Ixn.add23,“李新宁",,"李冬冬"
上例表示在集合中“李冬冬“关健字所对应元素后面添加"李新宁"为关健字的元素23(我是想
表示年纪)。
REMOVE方法:删除一个元素;
集合名.remove"关健字或索引位置"
Ixn.remove"李新宁"或Ixn.remove5(如果元素"23"的索引号为5)
索引值是VB自动给每个集合元素添加的,从第1个元素索引号为1开始。
ITEM方法:引用集合对象中的元素,可省略,格式:集合名.item(关健字)
省略为:集合名(关健字或索引位置)
x=lxn("李新宁”)x就等于23。
也可用索引位置,如x=lxn⑸(如果“李新宁"所对元素的索引为5),索引位置(其实就是
下标)最小从1开始。
COUNT属性:返回集合中的元素个数。格式:集合名.count.如y=lxn.count,y就等于集合中
元素个数。
自定义过程:Private(或public,static)sub过程名(形参)
endsub
调用:Call过程名(实参)或过程名实参
自定义函数:private(或public,static)function函数名(形参)as类型
函数名=值
endfunction
调用:函数名(实参)为一个确定值,
上面函数与过程区别是:函数一定有返回值,所以定义时要指明(返回值)类型,并在函数
过程中设定”函数名=值"来确定返回值。调用函数时如果也用CALL,则函数的返回值就失
去意义(这样合是合法)。
★基本的类操作:类形象理解为“控件”即可,创建一个类,也
就是自己创建一个象工具箱中控件那样的"新"控件。自己设置添加它的属性,方法。只不过
自己发明的新控件没有图标,所有属性,方法,事件只能在代码中进行而已。
类是用来创建对象实例的模板。
1,在“工程"菜单中选"添加类模块"。在属性窗口修改它的"(名称)”属性为想要的名字,这
个名字将作为这个类(为好理解,叫成"新控件")的名字。
2,制作新控件属性:在类模块中通用部分(此时全都是)用Public声明一群变量,要指明
具体类型,这些所有变量就成了新控件的属性。就这么简单。
3,制作新控件方法:在类模块中建立新过程(用publicsub...endsub或publicfunction...end
function),这些过程名将作为新控件的方法名。在过程里编写新控件功能的代码。
4,编写类模块事件,类模块事件只有initialize和terminate两种。当我们在程序中用”新控
件"创建一个对象时,在刚刚创建一刹那,触发这里的initialize事件,这个事件可处理对象
实例创建时需要处理的初始化。
新控件的运用:如何使用自己新做的"控件"呢?因为它没有在工具箱中的图标,不可直按”
画”到窗体上,而要完全在代码中进行。
1,在通用部分声明一个对象变量,使它指向“新控件"。如DimIxnAsclassl
classl是我自定的“新控件”名。注意:此时只是声明变量Ixn为对象变量,但并没有具体代
表哪个对象,要用SET语句来确定对象变量的值。用set…new…新建类模块对象。
2,在FORMLOAD事件中创建一个"新控件"的对象,用SET…NEW语句,
set对象变量=优\¥新控件
setlxn=newclass1
这时,对象变量名就成了创建的对象的名字(注:没有NEW是普通的赋值,有NEW就是
新建对象)。
3,进行对象可进行的各种操作。如:lxn.condition=lrue
下面是自制一个“跑表”控件的例子。
A,类模块中:
OptionExplicit
Publictimed]AsDate'这三个变量作为“跑表”类的属性
PublicconditionAsBoolean'timectl为时间长度,condition为计时/停止状态
PublicstarttimeAsDate'starttime为基准时间
PublicSubstart。'开始计时方法
condition=True
starttime=Timestarttime赋值为系统时钟的当前时间
EndSub
PublicSubstoptime。'停止计时.方法
DimIxnAsDate
condition=False
Ixn=Time-starttime时间差
timectl=timectl+Ixn进行多次调用该过程时累积时间长度
EndSub
PublicSubreset。'清0方法
condition=False
timectl=0
starttime=Time
EndSub
PrivateSubClass_Initialize()供新建实例时初始化
starttime=Time
timectl=Time-starttime
condition=False
EndSub
B,程序中:
DimmywatchAsmyclass声明对象变量将指向myclass创建的实例
PrivateSubCommand1_Click()
Setmywatch=Newmyclass重新新建
Text1.Text=mywatch.timectl
EndSub
PrivateSubCommand2_Click()
SelectCasemywatch.condition
CaseFalse
mywatch.start
Text1.Text=uon”
CaseTrue
mywatch.stoptime
Text!.Text=mywatch.timectl
EndSelect
EndSub
PrivateSubForm_Load()
Setmywatch=Newmyclass新建对象
Text!.Text=mywatch.timectl
EndSub
★程序中的APP对象,它主要提供如本程序的标题,版本信息,路径等有时很必要的信息,
常用属性有:
App.Title:返回本程序的标题。
App.Path:返回本程序所在的路径。与curdir不完全相同,curdir是指当前路径。如果1个程
序创建了快捷方式,则App.path和curdir就可能不同了。应以App.path为准。
App.EXEname:返回本程序不含扩展名的根名
如何在VB中控制关机?除了以前讲到的exitwindowsex函数外,还有一种更简单的方法,
只要在你需要的地方,比如按扭等等,在事件过程中加入
Shell"rundll32.exeuser.exe,exitwindows"就可以了。对WIN2000无效!
在VB中可打开控制面板,由用户进行设置,打开主面板:在事件过程中写
x=Shell("rundll32.exeshell32.dll,Control_RunDLL",1)
也可打开各个具体项目,如
x=Shell("rundll32.exeshell32.dll,Control_RunDLLmmsys.cpl",1)
打开的是控制面板中"多媒体"项。而
x=Shell("rundll32.exeshell32.dll,Control_RunDLLaccess.cpl„5",1)
打开的是“辅助选项"项目。而
x=Shell("rundll32.exeshell32.dll,Control_RunDLLdesk.cpl,,2",1)显示的是"显示器”项目(中
的“外观“选项卡,注:各个选项卡由尾部参数决定,这里是2)。
在文本输入时,我们可通过设置ASCII码的chr(13)+chr(10)来使文本换行,而在VB程序中,
可用一个常数vbCrLf来代替这两个ASCII码表示换行,如:
textl.text="您如果需要的话"&chr(13)+chr(10)&"可以来找我"
可写为:textl.text="您如果需要的话"&vbCrLf&"可以来找我"
关于在VB程序中用键盘的问题:1,很多控件运行时的使用都可以采用在其caption属性中
写"&快捷键”的方式指定键盘访问键(如菜单,按纽,复选框,选项按纽等等)2,TAB
键常用来对各对象间的切换。
3,设计时改变选定对象的大小:Shift+方向键;
设计时改变选定对象的位置:Ctrl+方向键。
在标准模块中不能编写某个窗体中
的对象的事件过程,事件过程只能在窗体模块中编写。
VB代码窗口中的书签:书签可用来标记代码中的某些行,以便以后可以很容易地返回这些
行,书签的切换或定位可在"编辑"菜单”书签”项中进行。
VB代码一行一般写一条语句,也可一行写多条语句,每条语句间用冒号:隔开即可
VB一条长语句可以分成几行来写,在需要分行的地方用"空格+下划线(_)”即可。
在VB中我们一般用十进制数,但有时用十六进制数或八进制数更方便,怎样表示16进制
数呢:用前缀&H,怎样表示八进制数呢,用前缀&0(&号和大写字母0或数字0),如:
255=&o377=&hFF
我们可看到用16进制数表示的控件颜色值如:labell.backcolor=&HFF0000(蓝色),通常情况
下,颜色值由六位数组成,颜色值=&Hbbggrr。前两位数表示蓝色成分,中间两位表示绿色
成分,后面两位表示红色成分,范围从16进制数的0-FF。
在多个模块中有同名的公用变量(用public声明的)时,引用时应分别指出它的出处,形如:
modulel.lxn或module2.1xn或forml.lxn等。如果有同名的公用过程或公用函数等也是如此,
引用时指明出处。
变体类型数据的三个特殊值:EMPTY,NULL,ERRORo
当一个变体变量未赋值时,其"值"就等于Empty.它不等于0或空字符串当给一个变量赋
值后(如lxn=0),其empty值就消失,可重新赋予empty值,如:lxn=empty
可用IsEmpty函数检测是否为empty值:ifIsEmpty(lxn)=truethenlxn=0
给一个变体变量赋予NULL值:常用于数据库程序中表示未知数据或丢失的数据,null的传
播性:假如有一个变量值为NULL,将它放入一个表达式中,整个表达式值将变为NULL,
将它作为参数传入函数中,函数将返回NULL,NULL能通过表达式"传播",当然前提是有
"变体"变量(为传播载体)的基础上。用IsNull函数检测是否为NULL值,
如:ifIsNull(lxn)=falsethenlxn=Null
变体变量的ERROR值,指出己发生的过程中的错误状态。不是指程序错误(我没看懂)
在动态数组的使用中,用redim确定了数组的最大下标,如果还要改动这个值,而程序中若
重复执行ReDim语句时,当前存储在数组中的值都会全部丢失,VB重新将所有数组元素
初始化,运行中怎样改变数组的大小而又不丢失数据呢?用ReDimPreserve关健字,但要
注意,运行中只能改变数组最后一维的大小,可先用UBound函数取得数组
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江公务员面试模拟74
- 建筑工程配电管及管内穿线工程质量控制监理实施细则
- 2024年简易厂房租赁合同范本
- 2024年信用借款合同样本
- 2024年简单租地合同协议书
- 浙江公务员面试模拟76
- 新解读《GBT 41111-2021气焊用非合金钢及热强钢填充丝》
- 2024年工地用工合同范本(2050字)
- 2024年简单租车合同
- 地方公务员+辽宁申论108
- GB/T 25748-2010压铸镁合金
- GA/T 766-2020人精液PSA检测金标试剂条法
- DB11-T 1832.10-2022建筑工程施工工艺规程 第10部分:装饰装修工程
- 2023年广州市法院书记员招聘笔试题库及答案解析
- 锂矿及碳酸锂的生产工艺基本知识课件
- 一、小柴胡汤课件
- 2022-2023学年浙科版(2019)选择必修三 5.2 我国禁止生殖性克隆人 课件(28张)
- 洗车店管理制度
- 2022版道德与法治新课程标准课标测试卷测试题库(含答案)(教师招聘试卷教资考试)
- 高中英语选修一(人教版)2-1Looking into the Future 教学课件
- 电动汽车充电桩申请安装备案表
评论
0/150
提交评论