转VB学习笔记.docx
《转VB学习笔记.docx》由会员分享,可在线阅读,更多相关《转VB学习笔记.docx(63页珍藏版)》请在冰点文库上搜索。
转VB学习笔记
代码基础:
变量的简单定义格式:
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语句,如lxn为变体变量:
iflxn=EMPTYthenlxn=336525,例下:
PrivateSubCommand1_Click()
StaticlxnAsInteger
lxn=5错!
!
应改为Iflxn=0Thenlxn=5
lxn=lxn+1
Printlxn
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)lxnasstring,运行时自动调整长度。
2,定长字符串变量,定义如:
dim(public)lxnasstring*50,这时lxn被定义为包含50个字符的变量,给它赋值时若少于50个字符,则用空格补足(要删除空格用Trim和RTrim函数),多于50个则删掉。
使用定长字符串的情形如在随机文件的读写操作中,注:
定长字符串不能在类模块中定义为公用(public)变量。
三,日期型(date)
任何可辩认的文本日期都可赋值给date变量,日期文字前后要加上#号,或直接用文本定义,格式:
dim变量名asdate.
dimlxnasdate
赋值格式:
变量=#(或")月/日/年/时:
分:
秒AM或PM#(或")
lxn=#06/14/0120:
50:
31AM#或
lxn="06/14/018:
50:
31PM"
如果是一个数值直接赋给日期型变量,如lxn=35477.998,则小数点左边的值代表日期信息,小数点右边的值代表时间信息(如午夜为0中午为0.5),上面lxn的时间值显示为97-2-1623:
57:
07.(我没看懂)。
四,逻辑型(boolean)
也叫布尔型变量,它只有两个值:
true(-1)和false(0).[问题:
当为true时值是1还是-1?
我试了一下是-1,即用printcint(x)试的。
]
五。
变体型(variant)
可适用于各种数据类型,一个没有指明类型的变量VB就指定为此类型。
六,对象型(object或commandbutton或textbox......等对象名,模块名)
这种变量为指向程序中对象的指针,先声明为某类型对象,格式:
dim变量as对象类型名(如果对象为object,则表示可指向任何类型对象)dimlxnascommandbutton(定义lxn为按纽对象类指针),
赋值格式:
set变量名=对象名称
Setlxn=command1
这时,就可以用lxn来代替command1了,如:
lxn.caption="退出"
注:
如果加上New关健字,可以新建窗体,类模块,对象库中的对象,对象变量就成了1个对象。
Set变量名=New对象名称。
七,自定义类型,也叫结构类型。
第1步:
建立类型:
必须在模块级用type语句定义,格式:
private(或public)type类型名
成员1as类型
成员2as类型……
endtype
如:
privatetypeldd
aasstring
basinteger
casstring
endtype
第2步:
定义此类型的一个变量:
格式:
dim(或public等)变量名as刚才创建的类型
如:
dimlxnasldd
第3步:
变量的赋值及使用:
用点号连接每一个成员,分别赋值,赋值格式:
变量.成员1=值
变量.成员2=值……
如:
lxn.a="李小敏"
lxn.b=336525
lxn.c="李新宁"
凡是在程序中使用时,就要以"变量.成员名"来引用。
八,枚举类型。
在模块通用部分声明,格式:
Private(Public)Enum类型名privateenumlxn
成员1(可选=常数)李新宁
成员2(=常数)……李小敏
endEnumendEnum
然后在程序中定义一个此类型变量,Dim变量as类型。
如:
dimmaslxn
意思是:
变量m的"取值范围"是:
李新宁(值为0)或李小敏(值为1)
"值为0"?
不给成员赋值,缺省状态时第1个成员为0(相当于写:
李新宁=0)
第2个成员为1…类推,总之成员的值为一个"长整数"。
可自己赋给。
枚举类型的作用是在代码中可简化某些总在几个值之间切换的情况,引用如写ifm=李新宁thenend
(这种类型实用价值不大)。
变量数据类型的转换,有以下函数:
cbool(字符串或数值表达式)--返回布尔类型,如:
a=2:
b=2:
lxn=cbool(a=b)
那么lxn值为true
cbyte(0到255的整数)--返回BYTE类型
ccur(参数)--返回货币型
cdate(一个有效的日期表达式)--转换为日期型
cint(参数)--返回(或叫转换)integer型,参数的小数部分四舍五入
clng(参数)--返回long型,小数部分四舍五入。
csng(参数)--返回single(单精度)型,
cdbl(参数)--返回double(双精度)型。
cvar(参数)--返回变体型
cstr(参数)--返回string字符串型。
判断代码中一个变量的数据类型的函数:
vartype(变量名)或typename(变量名),vartype(变量名)返回一个整数值,如返回2代表整型,3代表长整型,4代表单精度,5代表双精度,7代表日期型,8代表字符串等。
例如有个叫lxn的变量,不知它是什么类型,可用x=vartype(lxn),如果x等于2就说明lxn是整型,8就是字符串等等。
typename(变量名)返回一个该变量类型名的字符串,如lxn是整型变量,那么typename(lxn)返回值为"integer"字符串。
★数组的定义类似于变量定义,所不同的是数组需要指定数组中的元素个数,例如:
Dimlxn(99)AsInteger
这个数组中包含100个元素,下标从0到99。
也可以指定下标的起始值,例如:
Dimlxn(2to10)AsInteger
这个数组含有九个元素,下标从2到10。
还可以定义多维数组:
Dimlxn(4,2to5,3to6)AsInteger
上例定义了一个三维数组(4×4×4)。
★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。
用个例子来说明:
PrivateSubCommand1_Click()
DimageAsInteger
age=Text1.Text
SelectCaseage
CaseIs<14(如果age小于14时)
Label1.Caption="小朋友,你好!
"
Case14To23(如果age在14到23时)
Label1.Caption="学生朋友,认真读书吧。
"
Case24(如果age是24时)
Label1.Caption="你和我是同龄人"
CaseIs>100(如果age大于100时)
Label1.Caption="你真是个老不死!
"
CaseElse(如果age不满足以上所有值的范围时)
Label1.Caption="按道理我要尊重你。
"
EndSelect
EndSub
看会了吧,就照着用即可。
循环结构:
FOR……NEXT……语句:
格式:
FOR循环变量=初值TO终值STEP步长
循环体
NEXT循环变量
如果在循环执行过程还未结束时要跳出循环,可用exitfor语句。
例:
PrivateSubCommand2_Click()
Dima%,name$
Fora=1To10
name=InputBox("输入姓名")
Printname
Ifname="lxn"ThenExitFor
Nexta
EndSub
第二种很重要的循环结构是:
DO循环
格式:
A。
DOWHILE条件
循环体
LOOP
B。
DO
循环体
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--由于是在form_load事件中,所以这个end不可丢。
EndSub
上例将华氏温度转为摄氏度。
(下一页) (返回)
★编写对象的自动拖放操作:
1。
将要拖放对象的dragmode属性设置为1(这样就可自动拖动)
2。
设置要拖放对象在拖动过程中的图标提示:
dragicon属性。
3。
编写拖放终点对象的dragdrop事件(或dragover事件)过程。
例:
将窗体上图片框1的图片拖到图片框2里:
PrivateSubForm_Load()
Image1.Picture=LoadPicture("c:
\我的文档\mywebs\红楼梦4.bmp")加载图片
Image1.DragMode=1对象可移动
Image1.DragIcon=LoadPicture("c:
\ucdos\ico\print.ico")移动时的图标
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移动后横坐标,纵坐标,宽度,高度
picture1.move800,500(单位:
缇;1缇=1/1440英寸
用MOVE方法不仅可以移动对象位置,而且可以改变对象的尺寸大小,如下:
对象名.moveleft,top,width,height
Form1.Move5000,0,5000,50(注:
单位为缇)
例:
PrivateSubForm_Load()
Picture1.Picture=LoadPicture("c:
\我的文档\mywebs\红楼梦1.bmp")
Timer1.Interval=1
Timer2.Interval=1
Timer1.Enabled=True
Timer2.Enabled=False
EndSub
PrivateSubTimer1_Timer()
IfPicture1.Left>0AndPicture1.Top>0Then
Picture1.Left=Picture1.Left-50
Picture1.Top=Picture1.Top-70
Else
Timer2.Enabled=True
Timer1.Enabled=False
EndIf
Picture1.MovePicture1.Left,Picture1.Top
EndSub
PrivateSubTimer2_Timer()
IfPicture1.Left<5000AndPicture1.Top<3000Then
Picture1.Left=Picture1.Left+50
Picture1.Top=Picture1.Top+70
Else
Timer1.Enabled=True
Timer2.Enabled=False
EndIf
Picture1.MovePicture1.Left,Picture1.Top
EndSub
★添加标准模块:
"工程"菜单"添加模块"菜单项。
module1是缺省模块名。
此名字可在其属性窗口中改变(只有此一项"属性")。
标准模块与窗体模块并列于一个工程之内。
在标准模块中声明公用变量(或叫全局变量)格式:
public变量名as类型
publiclxn
在前面我们用DIM定义变量,它们都只是局部变量,即只在某个事件过程中可见,而在标准模块中定义的全局变量,则在整个工程中可见,即定义一次之后在其它任何事件中可直接访问。
在标准模块中创建通用过程:
通用过程在整个程序中可见。
象全局变量一样。
可创建三种类型的通用过程:
函数过程,子过程(也叫sub过程),属性过程
函数的语法格式:
publicfunction函数名(形参表)as返回值类型(这个"as返回值类型"不能丢!
!
)函数体
函数名=返回值
Endfunction
在事件过程中调用函数的方式为:
变量=函数名(实参)--它代表一个确定值,本质是一个变量,可以出现在变量可出现的任何地方。
附出错经验一则:
我想在一个事件中用个变量a,使第一次单击该事件时a=1,第二次单击该事件时a=2;第三次单击该事件时a值为3,即自增1的运算,我在事件中写:
dima
a=1
a=a+1
可每次单击都得到同一个值2,原来,这是因为a是该事件中的局部变量,
每单击一次就重新执行一次,后来,我想在form_load()事件中写:
dimaa=1,
然后在该事件中只写a=a+1,结果却变成a每次都是1,怎么回事?
form_load事件不是每次程序运行时自动运行的吗,没错,但form_load本身也只是一个事件,在其中定的变量
dima也属局部变量,只在form_load一个事件中可见,因此在另一个事件中用到的a根本没定义,如何定义一个变量在同一个窗体模块中各事件均可见呢?
那就是在"(通用)"部分进行变量的声明,这样在该窗体模块中都可见,但通用部分不能直接进行赋值等运算(可按格式编写函数,子程序等等,同标准模块),参考办法:
(通用):
dimaform_load():
(在其他事件也可,只要在引用a值的那个事件前能赋a=1即可)a=1引用a的事件:
a=a+1
,"对象.属性名"的本质是一个变量,是在该窗体模块(通用)中缺省声明的变量
在标准模块中创建子过程:
格式:
publicsub子过程名称(形参)--此处要括号
过程体
endsub
函数与sub过程的不同是:
函数用其名字返回一个值,子过程处理一段程序过程,无返回值。
在标准模块子过程中设置某个对象属性时,必须指明哪个窗体,如:
publicsublxn()
form1.image1.visible=trueendsub其中那个"form1."不能丢。
在事件中调用子过程的格式:
子过程名称实参--这里的实参不要用括号,如果调用时作为表达式才要括号,多个实参用逗号分开。
不论是函数或是sub过程,其形参与实参之间必须保证类型与数量的一致。
★在文本框的一个输入字符串尾加上"&chr(13)+chr(10)",它能自动换行。
或者用VB的常数vbCrLf也可换行。
相当于C中的"\n".如:
a$="李新宁"&chr(13)+chr(10)text1.text=a$
★什么是集合?
集合是一组相关的对象。
窗体上的全部对象被称作controls(控件)集合,如果一个程序有多个窗体,就要在前面加上窗体名称,如:
form1.controls,每个窗体都有一个controls集合。
这种"集合"被视作也是该窗体的一个对象,它与窗体的关系地位有点象windows的文件夹。
可以通过集合引用其中的对象,格式一,直接使用(集合名!
元素):
窗体名称.controls!
对象名称.属性=属性值
form1.controls!
label1.caption="李新宁"
注:
其中的感叹号是controls集合与对象的连接符号
格式二,采用该对象在controls中的索引值(集合名(索引)):
窗体名称.controls(索引值).属性名=属性值
form1.controls
(1).caption="李新宁"
注:
一个对象在其所在窗体controls集合中的下标是如何排列的呢?
--按对象创建时的顺序逆向确定其下标值,最后一个创建的对象下标为0,倒数第二创建的那个对象下标为1,如果该窗体共有n个对象,那么一开始创建的那个对象的下标为n-1.
集合的运用:
FOREACH…IN…NEXT循环,对一组对象(对象组)的操作。
格式:
FOREACH对象变量IN集合名
对当前对象的操作过程
NEXT对象变量
以上用于对一组对象的操作,例如将窗体上所有对象的位置向左移1000缇:
PrivateSubCommand1_Click()
ForEachlxnInControlslxn是"当前对象"的"替身"
lxn.Left=lxn.Left+1000将当前对象的left属性加1000
Nextlxn下一个controls里的成员
EndSub
如果是有目的地选择一部分对象的移动,怎么办呢?
可以利用对象的标记tag属性,区别不同对象,下例tag属性值为lxm的对象就不移动,
PrivateSubCommand1_Click()
ForEa