第二章 可视化编程的概念与步骤用.docx
《第二章 可视化编程的概念与步骤用.docx》由会员分享,可在线阅读,更多相关《第二章 可视化编程的概念与步骤用.docx(29页珍藏版)》请在冰豆网上搜索。
第二章可视化编程的概念与步骤用
第二章可视化编程的概念与步骤
教学目标:
本章主要介绍使用VB中一些简单却又极其重要的操作。
学习本章时应注意以下几点:
1、可视化编程的基本概念
2、VB编程步骤
3、控件的画法
重点难点:
1、可视化编程的基本概念
2、VB编程的步骤
教学方法:
演示教学法、实例教学法,讲解操作方法和操作步骤--让学生记笔记--留作业-学生动手操作,教师循徊指导--教师归纳总结
教学手段:
多媒体教学系统,机房现场教学,边演示,边讲解,边操作
教学过程:
VisualBasic概念
为了理解应用程序开发过程,先要理解VisualBasic赖以创建的一些关键概念。
因为VisualBasic是Windows开发语言,所以有必要与Windows环境保持一定的相似性。
如果不熟悉Windows编程,就需要明白在Windows环境下编程和在其它环境下编程的一些根本性的差别。
Windows的工作方式:
窗口、事件和消息
全面地讨论Windows的内部工作机制将需要整整一本书的容量。
没有必要深入了解所有的技术细节。
Windows的工作机制,简单地说就是三个关键的概念:
窗口、事件和消息。
不妨简单地将窗口看做带有边界的矩形区域。
也许已经了解几种不同类型的窗口:
如,Windows95的“资源管理器”窗口、文字处理程序中的文档窗口或者弹出提示有约会信息的对话框。
除了这些最普通的窗口外,实际上还有许多其它类型的窗口。
命令按钮是一个窗口。
图标、文本框、选项按钮和菜单条也都是窗口。
MicrosoftWindows操作系统通过给每一个窗口指定一个唯一的标识号(窗口句柄或hWnd)来管理所有的窗口。
操作系统连续地监视每一个窗口的活动或事件的信号。
事件可以通过诸如单击鼠标或按下按键的操作而产生,也可以通过程序的控制而产生,甚至可以由另一个窗口的操作而产生。
每发生一次事件,将引发一条消息发送至操作系统。
操作系统处理该消息并广播给其它窗口。
然后,每一个窗口才能根据自身处理该条消息的指令而采取适当的操作(例如,当窗口解除了其它窗口的覆盖时,重显自身窗口)。
可以想象,处理各种窗口、事件和消息的所有可能的组合将有惊人的工作量。
幸运的是,VisualBasic使您摆脱了所有的低层消息处理。
许多消息由VisualBasic自动处理了,其它的作为事件过程由编程者自行处理。
这样可以快速创建强大的应用程序而毋需涉及不必要的细节。
事件驱动模型
在传统的或“过程化”的应用程序中,应用程序自身控制了执行哪一部分代码和按何种顺序执行代码。
从第一行代码执行程序并按应用程序中预定的路径执行,必要时调用过程。
在事件驱动的应用程序中,代码不是按照预定的路径执行-而是在响应不同的事件时执行不同的代码片段。
事件可以由用户操作触发、也可以由来自操作系统或其它应用程序的消息触发、甚至由应用程序本身的消息触发。
这些事件的顺序决定了代码执行的顺序,因此应用程序每次运行时所经过的代码的路径都是不同的。
因为事件的顺序是无法预测的,所以在代码中必须对执行时的“各种状态”作一定的假设。
当作出某些假设时(例如,假设在运行来处理某一输入字段的过程之前,该输入字段必须包含确定的值),应该组织好应用程序的结构,以确保该假设始终有效(例如,在输入字段中有值之前禁止使用启动该处理过程的命令按钮)。
在执行中代码也可以触发事件。
例如,在程序中改变文本框中的文本将引发文本框的Change事件。
如果Change事件中包含有代码,则将导致该代码的执行。
如果原来假设该事件仅能由用户的交互操作所触发,则可能会产生意料之外的结果。
正因为这一原因,所以在设计应用程序时理解事件驱动模型并牢记在心是非常重要的。
交互式开发
传统的应用程序开发过程可以分为三个明显的步骤:
编码、编译和测试代码。
但是VisualBasic与传统的语言不同,它使用交互式方法开发应用程序,使三个步骤之间不再有明显的界限。
在大多数语言里,如果编写代码时发生了错误,则在开始编译应用程序时该错误就会被编译器捕获。
此时必须查找并改正该错误,然后再次进行编译,对每一个发现的错误都要重复这样的过程。
VisualBasic在编程者输入代码时便进行解释,即时捕获并突出显示大多数语法或拼写错误。
看起来就象一位专家在监视代码的输入。
除即时捕获错误以外,VisualBasic也在输入代码时部分地编译该代码。
当准备运行和测试应用程序时,只需极短时间即可完成编译。
如果编译器发现了错误,则将错误突出显示于代码中。
这时可以更正错误并继续编译,而不需从头开始。
由于VisualBasic的交互特性,因此可以发现在开发应用程序时,您自己正频繁地运行着您的应用程序。
通过这种方式,代码运行的效果可以在开发时进行测试,而不必等到编译完成以后。
VisualBasicIDE
使用对象
在VisualBasic中创建应用程序之际,也就是和对象打交道之时了。
可以使用VisualBasic提供的对象—比如控件、窗体和数据访问对象。
也可以在一个VisualBasic应用程序内部控制另一个应用程序对象。
甚至还可建立自己的对象,定义它们的属性和方法。
以下主题将详细讨论对象:
•对象是什么介绍对象的基本概念。
对象是代码和数据的组合,可以作为一个单位来处理。
对象可以是应用程序的一部分,比如可以是控件或窗体。
整个应用程序也是一个对象。
下表列出了在VisualBasic中可能用到的几种类型的对象:
示例描述
命令按钮窗体上的控件,象命令按钮和框架,它们都是对象。
窗体VisualBasic工程中的每一个窗体都是独立的对象。
数据库数据库是对象,并且还包含其他对象,如字段、索引等。
图表MicrosoftExcel中的图表是对象。
对象从何而来
VisualBasic中的每个对象都是用类定义的。
用饼干模子和饼干之间的关系作比,就会明白对象和它的类之间的关系。
饼干模子是类。
它确定了每块饼干的特征,比如大小和形状。
用类创建对象。
对象就是饼干。
下面再用两个例子进一步说明VisualBasic中类与对象之间的关系。
•在VisualBasic的“工具箱”上,控件代表类。
直到在窗体上画出这些被称作控件的对象为止,它们实际上并不存在。
在创建控件之时也就是在复制控件类,或建立控件类的实例。
这个类实例就是应用程序中引用的对象。
•在设计时操作的窗体是类。
在运行时,VisualBasic建立窗体的类实例。
“属性”窗口显示VisualBasic应用程序中的对象的类和Name属性。
把对象看作是类的原原本本的复制品,从而建立所有对象。
一旦它们以单个对象的形式存在,属性就可改变。
例如,如果在窗体上画了三个命令按钮,则每个命令按钮对象都是命令按钮类的实例。
每个对象都具有一组由类定义的公共的特征和功能(属性、方法和事件)。
但是,每个对象都有自己的名字,都能分别设置成有效或无效,都能放在窗体的不同位置,等等。
为简单起见,本章之外的大部分内容将不过多引用对象的类。
例如,只要记住术语“ListBox控件”意味着“列表框类的一个实例”。
•用对象能做什么讨论应用程序中使用对象的几种方法。
对象可提供现成代码,省却书写麻烦。
例如,可以自己创建打开文件和保存文件的对话框,但实际上大可不必。
取而代之的是利用VisualBasic提供的CommonDialog控件(一个对象)。
虽然用户也能撰写日程管理和资源管理的程序,但也大可不必。
在此亦可使用MicrosoftProject提供的Calendar、Resources和Task对象。
VisualBasic可以组合来自其它来源的对象
VisualBasic提供了把来自不同资源的对象组合起来的工具。
现在可把VisualBasic的各种强有力的特性以及支持自动化(先前以OLE自动化闻名)的应用程序结合起来,建立定制的解决方法。
自动化是部件对象模式(COM)的一个特性,它是应用程序使用的工业标准,用来陈列对象以开发工具和其它应用程序。
可把VisualBasic内部的控件结合在一起,也可使用其它应用程序提供的对象。
考虑把下列对象放入VisualBasic窗体:
•MicrosoftExcelChart对象
•MicrosoftExcelWorksheet对象
•MicrosoftWordDocument对象
可用这些对象建立支票簿应用程序。
由于不必书写代码,重建已由MicrosoftExcel和Word等对象提供的功能,因而节省很多时间。
•使用对象初步介绍对象的属性和方法。
•VisualBasic对象支持属性、方法和事件。
在VisualBasic中,称对象的数据(设置和属性)为属性,称各种可在对象上操作的过程为方法。
事件是可被对象识别的动作,例如单击鼠标和按下键盘键,还可编写代码来响应事件。
•改变对象的属性就可改变对象的特性。
用收音机打比方,收音机的一个属性是音量。
用VisualBasic的行话来说,就是收音机有个“Volume”属性,改变其值就可调节音量大小。
假定收音机的音量值可设置在0到10之间。
如果能够通过VisualBasic控制收音机,则可在一个过程中写代码,把“Volume”属性值从3提高到5,使声音更响一些:
•Radio.Volume=5
•除了属性以外,对象还有方法。
方法和属性都是对象的一部分。
一般说来,方法就是要执行的动作,而属性就是要设置或检索的特性。
以拨号打电话为例。
可以说电话有一个“拨号”方法,拨一个7位电话号码的语法就是:
•Phone.Dial5551111
•对象还有事件。
当对象的某方面有变动时就触发了事件。
例如,收音机可能有“VolumeChange”事件。
电话可能有“Ring”事件,等等。
•用属性控制对象
•个别属性随着可以设置和取得它们的值的时间不同而不同。
有的属性可在设计时设置。
可在“属性”窗口设置这些属性的值而无需编写任何代码。
而有的属性在设计时是不可用的;因此,这些属性只有通过代码在运行时设置。
•在运行时可以设置并可获得值的属性叫做读写属性。
在运行时只能读取的属性叫做只读属性。
•设置属性值
•在想改变对象的外观或特性时设置属性的值。
例如,通过改变TextBox控件的Text属性,就可以改变文本框的内容。
•用下列语法设置属性值:
•object.property=expression
•下面是设置属性的语句:
•Text1.Top=200'设置Top属性为200缇。
•Text1.Visible=True'显示文本框。
•Text1.Text="hello"'在文本框中显示"hello"。
•读取属性值
•想要在代码执行附加动作(例如给另一个对象赋值)之前得知对象的状态,这时就要读取属性值。
例如,在运行代码之前能够返回TextBox控件的Text属性值,以确定文本框的内容,这里,代码可能改变值。
•在大多数情况下可以用以下语法获得属性值:
•variable=object.property
•属性值可以作为较复杂的表达式的一部分,而不必将属性赋予变量。
下面的代码计算控件数组中的一个新成员的Top属性,它等于前一个成员的Top属性加上400。
•PrivateSubcmdAdd_Click()
•'[语句]
•optButton(n).Top=optButton(n-1).Top+400
•'[语句]
•EndSub
•提示如果不只一次使用一个属性值,而且将这个值存储到一个变量中,则代码执行起来会更快。
•用方法来执行动作
•方法能够影响属性值。
例如在用收音机打比方的例子中,SetVolume方法改变了Volume属性。
与此类似,在VisualBasic中列表框具有List属性,而Clear和AddItem方法可以改变这一属性。
•在代码中使用方法
•在代码中使用方法时如何书写语句,这取决于该方法要求多少参数,以及是否返回一个值。
如果方法不要求参数,则用以下语法编写代码:
•object.method
•下例中,用Refresh方法重画图片框:
•Picture1.Refresh'强迫重画控件。
•有些方法,如上面的Refresh,既无参数又不返回值。
•如果方法要用多个参数,就用逗号将它们分开。
例如,Circle方法就要用代表窗体上圆的位置、半径和颜色的参数:
•'画一个半径为1200缇的蓝色园。
•Form1.Circle(1600,1800),1200,vbBlue
•如果要保存方法的返回值,就必须把参数用括号括起来。
例如,GetData方法从剪贴板返回一张图片:
•Picture=Clipboard.GetData(vbCFBitmap)
•如果没有返回值,则参数不会出现在括号中。
例如,AddItem方法没有返回值。
•List1.AddItem"yourname"'在列表框中添加"yourname"。
•详细信息关于VisualBasic对所有方法提供的语法和参数,请参阅语言参考。
•对象之间的关系讨论对象的层次、集合和容器。
对象之间的关系
在同一窗体上放置两个命令按钮时,它们是两个具有不同Name属性设置值(Command1和Command2)的分开的对象,但都分享同一个类—命令按钮。
它们也共享这样一个特征,即它们在同一窗体上。
在本章前面已看到,窗体上的控件也包含在窗体中。
这就把控件放在一个层次上。
要引用控件就必须先引用窗体,就如同打电话拨号一样,首先要拨国家/地区号码或区域号码,然后再拨具体的电话号码。
这两个命令按钮也共享这样一个特征,即它们都是控件。
所有控件都具有公共特性,使它们不同于窗体以及VisualBasic环境中的其它对象。
以下章节中将说明VisualBasic如何用集合使相关的对象分组。
对象的层次
对象层次提供了一种组织结构,它决定了对象间的相互关系以及访问它们的方法。
在大多数情况下不必考虑VisualBasic对象的层次。
但是:
•在操作其它应用程序的对象时,应当熟悉那个应用程序的对象层次。
关于定位对象层次的信息,请参阅“用部件编程”。
•在使用数据访问对象时,应当熟悉数据访问对象层次。
就象在ProfessionalFeatures一书上的《数据访问对象指南》部分描述的那样,该书包括在VisualBasic的专业版和企业版中。
在VisualBasic中,一个对象包含其它对象的一般情况时有发生。
下面我们要详细讨论。
使用对象集合
集合对象有自己的属性和方法。
对象集合中的对象作为集合的成员被引用。
集合中的每个成员从0开始顺次编号;这就是成员的索引号。
例如,控件集合包含已给定窗体上的所有控件,如图5.10所示。
如果对集合中的所有对象都必须执行相同操作,则可用集合简化代码。
图5.10控件集合
例如,下列代码遍历控件集合,并在列表框中列出每个成员的名字。
DimMyControlasControl
ForEachMyControlInForm1.Controls
'把每个控件的名字送到列表框。
List1.AddItemMyControl.Name
NextMyControl
应用集合成员的属性与方法
有两种通用方法可用来对集合对象成员寻址:
•指定成员的名称。
以下两个表达式等价:
•Controls("List1")
•Controls!
List1
•利用成员的索引号:
•Controls(3)
一旦能够从整体上对全体成员寻址,而且还能够个别地对单个成员寻址,就可用下面随便一种方式应用属性和方法:
'将ListBox控件的Top属性设置为200。
Controls!
List1.Top=200
-或者-
DimMyControlasControl
ForEachMyControlInForm1.Controls()
'将每一个成员的Top属性设置为200。
MyControl.Top=200
NextMyControl
包含其它对象的对象
在VisualBasic中,一些对象包含其它对象。
例如,窗体通常包含一个或数个控件。
把一个对象当作其它对象的容器,这样做的好处在于,在代码中引用容器即可明了要使用哪个对象。
例如,图5.11说明在一个应用程序中可有两个不同的窗体,一个用来输入应付帐交易,另一个用来输入应收帐交易。
图5.11两个不同窗体可以包含同名的控件
两个窗口可以有名为IstAcctNo的列表框。
通过引用包含列表框的窗体就可准确指定要使用的列表框:
frmReceivable.lstAcctNo.AddItem1201
-或者-
frmPayable.lstAcctNo.AddItem1201
VisualBasic中的公共集合
在VisualBasic中一个对象包含其它对象的一般情况时有发生。
下表简要叙述VisualBasic中最常用的集合。
集合描述
Forms包含载入的窗体。
Controls包含窗体上的控件。
Printers包含可用的打印机对象。
在VisualBasic中也可实现对象控制。
详细信息关于对象容器的详细信息,请参阅“再论编程”中的“使用集合替代数组”。
关于打印机集合的信息,参阅“使用文本和图形”。
关于窗体集合和控件集合的详细信息,请参阅语言参考。
容器属性
在窗体内,可用Container属性改变对象的容器。
以下控件可包含其它控件:
•Frame控件
•PictureBox控件
•ToolBar控件(仅对专业版和企业版而言)
如何在窗体上将命令按钮从一个容器移动到另一个容器,该例对此作了演示。
打开新工程,并在窗体上画出Frame控件、PictureBox控件和CommandButton控件。
下列代码在窗体单击事件中,这些代码使计数器变量增加,并通过SelectCase循环使命令按钮在容器之间移动。
PrivateSubForm_Click()
StaticintXasInteger
SelectCaseintX
Case0
SetCommand1.Container=Picture1
Command1.Top=0
Command1.Left=0
Case1
SetCommand1.Container=Frame1
Command1.Top=0
Command1.Left=0
Case2
SetCommand1.Container=Form1
Command1.Top=0
Command1.Left=0
EndSelect
intX=intX+1
EndSub
详细信息请参阅语言参考中的“Container属性”。
对象之间的通讯
除了在VisualBasic中使用和创建对象外,还可与其它应用程序通讯并在自己的应用程序中操作其它应用程序的对象。
在应用程序之间共享数据的能力是MicrosoftWindows操作系统的关键性能之一。
有了VisualBasic,与其它应用程序进行通讯变得极为灵活。
详细信息关于使用其它应用程序的对象及其通讯的详细信息,请参阅“用部件编程”。
•
•创建对象讨论在运行时如何创建和使用对象。
创建对象
创建对象的最简单方法是在“工具箱”中双击控件。
但是,对VisualBasic中的所有可用对象以及来自其它应用程序的所有可用对象,要想充分体现它们的优势,可在运行时用VisualBasic的可编程性能创立对象。
•用对象变量创建对象引用。
•用类模块“从零开始”创建自己的对象。
•用集合对象创建自己的集合。
详细信息其它章节会介绍如何访问对象。
例如,在“用部件编程”中将讨论CreateObject和GetObject函数。
使用对象变量
除了存储值以外,变量可引用对象。
如同给变量赋值一样,基于下列相同理由,可把对象赋给变量:
•变量名往往比变量所含的值(或者,在此情况下,所含值就是它们引用的对象)短而好记。
•在运行代码时,为了引用其它对象,应改变变量。
•引用包含对象的变量比反复引用对象本身有更高的效率。
使用对象变量与使用常规变量一样,只不过多了把对象赋予变量这一步:
•首先声明变量:
DimvariableAsclass
•然后把对象赋予变量:
Setvariable=object
声明对象变量
声明对象变量的方法和声明其它变量一样,要用Dim、ReDim、Static、Private和Public。
仅有的不同在于可选的New关键字和Class参数,本章后面将会对New关键字和Class参数都作介绍。
语法是:
{Dim|ReDim|Static|Private|Public}variableAs[New]class
例如,可以声明一个对象变量,它引用应用程序中的被称做frmMain的窗体:
DimFormVarAsNewfrmMain'声明一个类型为frmMain
'的对象变量。
也可以声明一个对象变量,它引用应用程序中的任何窗体:
DimanyFormAsForm'一般窗体变量。
类似地,可以声明一个对象变量,它能够引用应用程序中的任何文本框:
DimanyTextAsTextBox'可以引用任何文本框
'(但只能是一个文本框)。
还可以声明一个对象变量,它能够引用任何类型的控件:
DimanyControlAsControl'一般控件变量。
注意,可以声明一个引用应用程序中的指定窗体的窗体变量,但不能声明引用特定控件的控件变量。
可以声明能够引用控件的特定类型(如TextBox或列表框)的控件变量,但不是引用那种类型的一个特定控件(如txtEntry或List1)。
但是,可把特定的控件赋予那种类型的变量。
例如,对于具有列表框lstSample的窗体可以这样编码:
DimobjDemoAsListBox
SetobjDemo=lstSample
赋值对象变量
用Set语句将对象赋予对象变量:
Setvariable=object
无论何时,只要希望对象变量引用对象,就可使用Set语句。
有时可用对象变量,尤其可用控件变量直接缩短要键入的代码。
例如,原来的代码是这样的:
IffrmAccountDisplay!
txtAccountBalance.Text<0Then
frmAccountDisplay!
txtAccountBalance.BackColor=0frmAccountDisplay