窗体和控件的概念
窗体和控件的概念-----------(初学天地)
Visual Basic概念
为了理解应用程序开发过程,先要理解Visual Basic 赖以创建的一些关键
概念。因为Visual Basic 是Windows 开发语言,所以有必要与Windows环
境保持一定的相似性。如果不熟悉Windows 编程,就需要明白在Windows环
境下编程和在其它环境下编程的一些根本性的差别
Windows 的工作方式:窗口、事件和消息
全面地讨论Windows 的内部工作机制将需要整整一本书的篇幅。没有必要深
入了解所有的技术细节。Windows的工作机制,简单地说就是三个关键的概
念:窗口、事件和消息。
不妨简单地将窗口看做带有边界的矩形区域。也许已经了解几种不同类型的
窗口:如,Windows 95的“资源管理器”窗口、文字处理程序中的文档窗
口或者弹出提示有约会信息的对话框。除了这些最普通的窗口外,实际上还
有许多其它类型的窗口。命令按钮是一个窗口。图标、文本框、选项按钮和
菜单条也都是窗口。
Microsoft Windows操作系统通过给每一个窗口指定一个唯一的标识号(窗
口句柄或hWnd)来管理所有的窗口。操作系统连续地监视每一个窗口的活
动或事件的信号。事件可以通过诸如单击鼠标或按下按键的操作而产生,也
可以通过程序的控制而产生,甚至可以由另一个窗口的操作而产生。
每发生一次事件,将引发一条消息发送至操作系统。操作系统处理该消息并
广播给其它窗口。然后,每一个窗口才能根据自身处理该条消息的指令而采
取适当的操作(例如,当窗口解除了其它窗口的覆盖时,重显自身窗口)。
可以想象,处理各种窗口、事件和消息的所有可能的组合将有惊人的工作量。
幸运的是,Visual Basie使你摆脱了所有的低层消息处理。许多消息由
Visual Basic 自动处理了,其它的作为事件过程由编程者自行处理。这样可
以快速创建强大的应用程序而毋需涉及不必要的细节。
事件驱动模型
在传统的或“过程化”的应用程序中,应用程序自身控制了执行哪一部分代
码和按何种顺序执行代码。从第一行代码执行程序并按应用程序中预定的路
径执行,必要时调用过程。
在事件驱动的应用程序中,代码不是按照预定的路径执行,而是在响应不同
的事件时执行不同的代码片段。事件可以由用户操作触发、也可以由来自操
作系统或其它应用程序的消息触发、甚至由应用程序本身的消息触发。这些
事件的顺序决定了代码执行顺序,因此应用程序每次运行时所经过的代码
的路径都是不同的。
因为事件顺序是无法预测的,所以在代码中必须对执行时的“各种状态”
作一定的假设。当作出某些假设时(例如,假设在运行来处理某一输入字段
的过程之前,该输入字段必须包含确定的值),应该组织好应用程序的结构,
以确保该假设始终有效(例如,在输入字段中有值之前禁止使用启动该处理
过程的命令按钮)。
在执行中代码也可以触发事件。例如,在程序中改变文本框中的文本将引发
文本框的 Change 事件。如果Change 事件中包含有代码,则将导致该代码
的执行。如果原来假设该事件仅能由用户的交互操作所触发,则可能会产生
意料之外的结果。正因为这一原因,所以在设计应用程序时理解事件驱动模
型并牢记在心是非常重要的。
交互式开发
传统的应用程序开发过程可以分为三个明显的步骤:编码、编译和测试代码。
但是VisualBasic与传统的语言不同,它使用交互式方法开发应用程序,
使三个步骤之间不再有明显的界限。
在大多数语言里,如果编写代码时发生了错误,则在开始编译应用程序时该
错误就会被编译器捕获。此时必须查找并改正该错误,然后再次进行编译,
对每一个发现的错误都要重复这样的过程。Visual Bdsic在编程者输入代
码时便进行解释,即时捕获并突出显示大多数语法或拼写错误。看起来就象
一位专家在监视代码的输入。
除即时捕获错误以外,Visual Basic也在输入代码时部分地编译该代码。当
准备运行和测试应用程序时,只需极短时间即可完成编译。如果编译器发现
了错误,则将错误突出显示于代码中。这时可以更正错误并继续编译,而不
需从头开始。
由于Visual Basic的交互特性,因此可以发现在开发应用程序时,你自己
正频繁地运行着你的应用程序。通过这种方式,代码运行的效果可以在开发
时进行测试,而不必等到编译完成以后。
集成开发环境的元素
Visual Basic的工作环境常常是指集成开发环境或IDE,这是因为它在一
个公共环境里集成了许多不同的功能,例如,设计、编辑、编译和调试。在
大多传统开发工具中,每个功能都是以一个独立的程序运行,并都有自己的
界面。
启动 Visual Basic IDE
当运行 Visual Basic安装程序时,允许将程序项置于已存在的程序组中,
或在Windows中为Visual Basic创建一个新的程序组和程序项。这时可准
备从Windows启动Visual Basic。
从wLndows启动Visual Basic
1.单击任务条上的“启动”。
2.选择“程序”,接着选取“VisualBasic 5.O”。或者,在任务条上单
击“启动”,选定“程序”。使用“WltldOws资源管理器”寻找VisualBasic
可执行文件(VB5.由e)。
3.双击Visual Basic图标。
也可以创建一个Visual队sic快捷键,并双击该快捷键。
当第一次启动VisualBasic时,可以见到集成开发环境的界面。
窗体
用Visual Basic创建一个应用程序,第一步是创建界面,它是用户与应用
程序进行交互操作的可视部分。宙体和控件是创建界面的基本构造模块;也
是创建应用程序所使用的对象。
窗体是一种对象,由属性定义其外观,由方法定义其行为,由事件定义其与
用户的交互。通过设置窗体属性并编写响应事件的VisualBasic代码,就
能定义出满足应用程序需要的对象.
控件是包括在窗体对象内的对象。每种类型的控件都有自己的一套属性、方
法和事件,以适用于特定的目的。一些控件最适合在应用程序中输入或显示
文本。另一些控件能够访问其它的应用程序和处理数据,就象这些远程应用
程序是用户自己的代码一样。
设计窗体
窗体对象是Visual Basic 应用程序的基本构造模块,是运行应用程序时,与
用户交互操作的实际窗口.窗体有自己的属性,事件和方法,控制窗体的外观和行为.
设计窗体的第一步是设置它的属性.这可以在设计时在"属性"窗口中完成,或者运行
时由代码来实现.
设置窗体属性
窗体的许多属性会影响窗体的外观。Caption属性决定窗体标题栏中显示
的文本;图标属性设置窗体最小化时显示的图标。MaxButton和MinButton
属性决定窗体是否能最大化或最小化。通过改变BorderStyle属性,可以
控制窗体如何调整大小。
Height和Width属性决定的窗体初始大小;Left和Top属性根据屏幕
的左上角确定窗体的位置。WindowState属性可以把窗体设成在启动时最
大化、最小化或正常大小。
Name属性设置窗体的名称,在代码中用这个名称引用该窗体。首次在工程
中添加窗体时,该窗体的名称被缺省为Forml;添加第二个窗体,其名称
被缺省为Form2,以此类推。最好给Name属性设置一个有实际意义的名
称,如给一个条目窗体命名为“frmEntry”。
熟悉这些窗体属性,最好的办法是实践。在“属性7L窗口(图3.3)中更
改窗体的一些属性,然后运行该应用程序并观察修改的效果。如果想得到关
于每个属性的详细信息,可以选择该属性并按Fl键查看联机帮助。
窗体事件和方法
窗体作为对象,能够执行方法并对事件作出响应。
无论是因为用户交互,还是通过代码调整窗体的大小,都会触发一个
Resize事件。当窗体尺寸变化时,允许您在窗体上进行移动控件或调整控
件大小等操作。
每当一个窗体变成活动窗体时,就会产生一个Activate事件;当另一个窗
体或应用程序被激活时,就会产生Deactivate事件。这些事件对初始化或
结束窗体行为十分方便。例如,在Activate事件中,可以编写代码突出显
示一个特定文本框中的文本;在Deactivate事件中,可以把更改保存到一
个文件或数据库中。
要使一个窗体可见,调用Show方法。
Form2.Show
调用Show方法与设置窗体 Visible 属性为True具有相同的效果.
窗体的许多方法都调用文本或图形. Print Line Cricle 和 Refresh
方法可用于直接在窗体表面上写和画.
控件
控件用来获取用户的输入信息和显示输出信息.应用程序中可用的控件包括问本框
命令按扭和列表框.而通过另外一些控件可访问其他应用程序并处理数据,这时,那些
远程应用程序就好象是代码的一部分.每个控件都有一组属性,方法和事件.
控件分类
Visual Basic 的控件有三种广义分类:
1.内部控件,例如 Commandbutton和Frame控件。这些控件都在
Visual Basic的 .exe文件中。内部控件总是出现在工具箱中,不象ActiveX
控件和可插入对象那样可以添加到工具箱中,或从工具箱中删除。
2.Activex控件,是扩展名为.ocx的独立文件,其中包括各种版本
Visual Basic提供的控件(DBGrid、DBcombo、DBList控件等等)和仅在企
业版和企业版中提供的控件(例如Listview、Toolbar、Animation 和
标记对话控件),另外还有许多第三方提供的的ActiveX控件。
注意 具有文件扩展名.vbx的ActiveX控件使用了老的技术,在
Visual Basic的早期版本编写的应用程序中可以找到这些控件。当
Visual Basic打开包含.vbx控件的工程时,在缺省情况下用.ocx控
件取代.vbx控件,当然,这只有在控件的.ocx版本存在时才可以。关
于将控件更新为.ocx格式的信息,请参阅本章后面的“更新旧版vi
Basic控件”一节。
3.可插入的对象,因为这些对象能添加到工具箱中,所以可把他们当作控件使用。
其中一些对象还支持自动化(正式的名称为OLE自动化),使用这些控件就可在Visual Basic
应用程序中编程控制另一个应用程序的对象。
使用控件数组
控件数组是一组具有共同名称和类型的控件。它们的事件过程也相同。一个
控件数组至少应有一个元素,元素数目可在系统资源和内存允许的范围内增
加;数组的大小也取决于每个控件所需的内存和Windows资源。在控件数
组中可用到的最大索引值为32767。同一控件数组中的元素有自己的属性
设置值。常见的控件数组的用处包括实现菜单控件和选项按钮分组。
为何使用控件数组
在设计时,使用控件数组添加控件所消耗的资源比直接向窗体添加多个相同
类型的控件消耗的资源要少。当希望若干控件共享代码时,控件数组也很有
用。例如,如果创建了一个包含三个选项按钮的控件数组,则无论单击哪个
按钮时都将执行相同的代码。
若要在运行时创建新控件,则新控件必须是控件数组的成员。使用控件数组
时,每个新成员继承数组的公共事件过程。
没有控件数组机制是不可能在运行时创建新控件的,因为全新控件不具有任
何事件过程。控件数组解决了这个问题,因为每个新控件都继承为数组编写
好的事件过程。例如,如果窗体上有若干文本框,而且每个文本框都接受一
个日期数值,则可创建一个控件数组,使所有文本框共享同一个合法性检查
代码。
设计时创建控件数组
1.将相同名字赋予多个控件.
2.复制现有的控件并将其粘贴到窗体上.
3.将控件的Index 属性设置为非Null数据
(注意:必须在“菜单编辑器”中创建菜单控件数组。)
通过改变控件名称添加控件数组元素
1.绘制控件数组中要添加的控件。(必须为同一类型的控件。)决定哪一个
控件作为数组中的第一个元素。
2.选定控件并将其Name设置值变成数组第一个元素的Name 设置值。
3.在数组中为控件输入现有名称时,Visual Basic 将显示一个对话框,要
求确认是否要创建控件数组。此时选择“确定” 确认操作。
例如,若控件数组第一个元素名为 cmdCtlArr,则选择一个CommandButton
将其添加到数组中,并将其名称设置为cmdCtlArr,此时将显示这样一段
信息:“已经存在名为’cmdCtlArr’的控件。是否要创建控件数组?”。
选择“确定”确认操作。
用这种方法添加的控件仅仅共享Name属性和控件类型:其它属性与最初绘
制控件时的值相同。
通过复制现存控件添加控件数组元素
1.绘制控件数组中的控件。
2.当控件获得焦点时,选择“编辑”菜单中的“复制”命令。
3.在“编辑”菜单中,选择“粘贴”命令。Visual Basic将显示一个对话
框询问是否确认创建控件数组。选择“确定”确认操作。
指定给控件的索引值为l。绘制的第一个控件具有索引值0。
每个新数组元素的索引值与其添加到控件数组中的次序相同。这样添加控件
时,大多数可视属性,例如高度、宽度和颜色,将从数组中第一个控件复制
到新控件中。
运行时添加控件数组
在运行时,可用Load和Unload语句添加和删除控件数组中的控件,然而,
添加的控件必须是现有控件数组的元素。必须在设计时创建一个(在大多数
情况下)Index属性为O的控件,然后在运行时使用如下语法:
Load object(index%)
Unload object (lndex%)
参数描述
object 在控件数组中添加或删除的控件名称
index% 控件在数组中的索引值
加载控件数组的新元素时,大多数属性设置值将由数组中具有最小下标的现
有元素复制,本例中是索引值为O的元素。因为不会自动把Visible,
lndex和Tablndex属性设置值复制到控件数组的新元素中,所以,为了使
新添加的控件可见,必须将其Visible属性设置为True。
注意试图对数组中已存在的索引值使用Load语句时,VisualBas
将生成一个错误。
重点
可用Unload语句删除所有由Load语句创建的控件,然而
Unload无法删除设计时创建的控件,无论它们是否是控件数组的一部分。