实验6机械工程数据库应用系统开发工具软件的使用.docx
《实验6机械工程数据库应用系统开发工具软件的使用.docx》由会员分享,可在线阅读,更多相关《实验6机械工程数据库应用系统开发工具软件的使用.docx(33页珍藏版)》请在冰豆网上搜索。
实验6机械工程数据库应用系统开发工具软件的使用
机械工程数据库应用系统开发工具软件的使用
(通过C++Builder学习C++面向对象程序设计)
——简单算术自测程序
一.程序设计的目标
用户界面设计目标
●具有两个以上的窗体(见图1与图2)
●具有下拉菜单、弹出式菜单、工具栏、状态栏等典型Windows界面(见图3)
图1窗体1(主窗体)界面
图2窗体2(参数设置窗体)界面
a)两个下拉菜单b)弹出式菜单c)工具栏d)状态栏
图3主菜单、弹出式菜单、工具栏与状态栏
1.程序功能设计目标
●可进行加、减、乘、除等运算
●可设定运算类型
●可设定运算数的大小
●可显示统计信息及得分情况
●可以记录所做过的全部题目及显示每道题的评判结果
●可播放/停止背景音乐
二.C++与C++Builder简介
C++是一种面向对象的程序设计语言,它使得程序的各个模块的独立性更强,程序的可读性、可移植性、可扩充性也更强,程序代码的结构更加合理。
与C相比,C++提出了一些更为深入的概念,尤其是它所支持的面向对象的概念为程序员提供了一种与传统结构程序设计完全不同的思维方式和编程方法。
可视化(visual)程序设计是一种全新的程序设计方法,它全面采用面向对象的程序设计技术,使用“事件驱动”机制进行程序设计。
利用可视化开发工具可以快速、高效地开发应用程序。
可视化的开发工具有很多,如Microsoft公司推出的VisualStudio软件系列,Inprise(Borland)公司的Delphi、C++Builder系列等。
其中,C++Builder是这些工具中的佼佼者,是基于C++语言的快速应用程序开发(RapidApplicationDevelopment,RAD)工具。
C++Builder充分利用已经发展成熟的可视化组件库(VisualComponentLibrary,VCL),吸收BorlandC++优秀编译器的诸多优点,结合先进的基于组件的程序设计技术,已成为一个非常成熟的可视化应用程序开发工具,可以快速、高效地开发出基于Windows环境的各类程序,尤其在数据库应用和网络应用方面,C++Builder更是一个十分理想的软件开发平台。
三.使用C++Builder开发基于Windows的面向对象的可视化用户界面
1.启动C++Builder6
启动C++Builder6后的初始开发界面如图4所示:
图4C++Builder6初始开发界面
它由五部分组成:
①上方的包含下拉菜单、工具栏及组件选项卡在内的主窗口;②左侧上部的对象列表树(ObjectTreeView)窗口;③左侧下部的对象检查器(ObjectInspector,包含属性面板和事件面板)窗口;④右侧的用户窗体界面;⑤后面的含有类游览器的代码编辑器窗口(这个窗口中同时打开了多个文件,比如以“.h”为扩展名的头文件和以“.cpp”为扩展名的程序源文件等)。
2.关于C++中的类与对象
为了解释C++的OOP编程中关于“类”、“对象”、“属性”、“方法”、“事件”等相关概念,先来看一下代码编辑窗口中头文件Unit1.h的内容,它现在如图5所示:
图5C++Builder6代码编辑器(头文件Unit1.h内容)
由图5可以看出,C++Builder在Unit1.h中创建了一个窗体类(class),其类名为TForm1,它由TForm类继承而来(TForm类是TForm1类的基类,两者之间有一个冒号),“继承”是C++语言的特性之一,许多类都可能由其基类继承而来。
类把数据(成员变量)和操作数据的函数(成员函数)封装在一起。
就现在而言,TForm1类还没有成员变量,仅有一个与类名相同的构造成员函数。
随着程序设计的进行,稍后可以看到TForm1类的变化。
知道了类及其定义之后,再来看一下什么是对象。
其实对象(Object)就是类的一个实例(Instance)。
现在需要观察代码编辑窗口中程序源文件Unit1.cpp的内容,此时如图6所示:
图6C++生成类的实例
在图6所示的源文件中,用“TForm1*Form1;”语句生成了TForm1类的一个实例(即对象),这个对象就是可视化的窗体,它是C++Builder为一个新的工程自动生成的一个对象(主窗体)。
类与对象的关系相当于图纸和实物的关系,也可以说是抽象与具体的关系。
例如,要制造一台汽车,首先要进行设计,以生成图纸,然后才能根据图纸生产出汽车。
这里说的图纸就是类,而汽车就是对象。
对象是现实世界中的一个实体,其特性是:
(1)每一个对象都必须有一个名字,以区别于其它对象;
(2)用属性(数据)来描述对象的特征;
(3)有一组操作(对数据的操作处理),每一个操作决定对象的一种行为。
综上所述,对象的两个要素是属性和行为。
属性是对象的特征,通过定义成员变量来描述;行为是对象的动作,通过定义成员函数完成。
C++面向对象编程的思想就是将对象的属性和行为“封装”在一起。
所以说,类是面向对象编程的程序基本单位。
在可视化语言编程环境中,用户界面上出现的元素(例如命令按钮、文本编辑框和列表框等组件,组件也称控件),都是对象。
组件是C++Builder程序设计的核心,C++Builder已经设计好了各种对象,程序员可以直接使用这些组件对象,也可以使用第三方开发人员提供的组件对象。
3.建立编辑框、标签和按钮控件对象
现在用C++Builder的VCL(即可视化的组件库)在窗体对象(窗体对象是个容器对象)内生成几个新的对象。
从组件选项卡的“Standard”页中,分别选择“Edit”控件、“Label”控件和“Button”控件,在窗体上分别放置三个编辑框、两个标签和一个按钮控件,用户界面如图7所示(控件的位置和大小可直接用鼠标拖动操作进行设置):
图7放置编辑框、标签和按钮控件后的用户界面
如此一来,就建立了六个对象(一个控件就是一个对象)。
4.修改对象的属性
每个对象都有属性。
属性是对象的性质或是描述对象的数据,用于定义对象的特征。
改变对象的属性,便可控制其在程序中的作用。
对象有哪些属性,每个属性是什么含义,可以参考C++Builder的帮助系统,那里有非常详细的说明。
对象的属性可以进行设置和修改。
几乎所有的属性(例如,影响一个组件在运行时是否可见Visible、对象的名称Name、文本编辑框的内容Text、标题Caption、字体Font等属性)可以在程序设计时通过属性面板来定义和修改,但也可在程序运行时通过编写代码来设置和修改(Name属性除外)。
按表1所给内容,通过属性面板修改上述六个控件的属性(仅修改表格中第4~7列所给出的属性):
表1编辑框、标签和按钮的属性
控件所属的选项卡
默认控件名
控件
Name属性
Text属性
Caption属性
TabOrder属性
备注
Standard
Edit1
编辑框
n1
(空)
“默认控件名”后的数字可能不完全相同
Standard
Edit2
编辑框
n2
(空)
Standard
Edit3
编辑框
n
(空)
0
Standard
Label1
标签
op
+
Standard
Label2
标签
(不变)
=
Standard
Button1
按钮
done
查看成绩
修改后的用户界面如图8所示(可以通过修改Font属性获得满意的字体、字号、颜色等):
图8修改各控件属性后的用户界面
此时,代码编辑器窗口的内容自动变成图9所示的内容:
图9修改各控件属性后的代码编辑器窗口内容
由图9可以看出,类浏览器和代码窗口里的头文件同时显示了TForm1类的六个数据成员(每个数据成员名即为相应控件的Name属性的值)。
5.建立组框、带标签的编辑框控件对象
按照表2在窗体上添加一个组框控件并设置属性:
表2组框控件的属性
控件所属的选项卡
默认控件名
控件
Name属性
Enabled属性
Caption属性
Standard
GroupBox1
组框
false
统计信息
按照表3在组框控件内添加三个带标签的编辑框控件并设置属性:
表3带标签的编辑框属性
控件所属的选项卡
默认控件名
控件
Name属性
EditLabel/Caption属性
LabelPosition属性
Additional
LabeledEdit1
带标签的编辑框
nRight
正确
lpLeft
Additional
LabeledEdit2
带标签的编辑框
nWrong
错误
lpLeft
Additional
LabeledEdit3
带标签的编辑框
Scores
得分
lpLeft
此时的用户界面如图10所示:
图10放置组框、带标签的编辑框控件并修改各控件属性后的用户界面
6.建立标签与多行文本框控件对象
按照表4在窗体上添加一个标签控件并设置属性:
表4标签属性
控件所属的选项卡
默认控件名
控件
Name属性
Enabled属性
Caption属性
Standard
Label1
标签
评判结果
按照表5在窗体上添加一个多行文本框控件并设置属性:
表5多行文本框属性
控件所属的选项卡
默认控件名
控件
Name属性
Lines属性
ScrollBars属性
Standard
Memo1
多行文本框
(空)
ssVertical
此时的用户界面如图11所示:
图11放置标签、多行文本框控件并修改各控件属性后的用户界面
7.建立带图片的按钮、状态栏控件对象
按照表6在窗体上添加两个带图片的按钮控件并设置属性:
表6带图片的按钮控件属性
控件所属的选项卡
默认控件名
控件
Name属性
Kind属性
Caption属性
Additional
BitBtn1
带图片的按钮
ReTry
bkRetry
从头再来
Additional
BitBtn2
带图片的按钮
Exit
bkIgnore
不玩了
按照表7在窗体上添加一个状态栏控件并设置属性:
表7状态栏控件属性
控件所属的选项卡
默认控件名
控件
Name
SimplePanel
SimpleText
备注
Win32
StatusBar1
状态栏
(不变)
true
加减乘除随机出题
状态栏会自动布置在窗体下方
此时的用户界面如图12所示:
图12放置图片按钮、状态栏控件并修改各控件属性后的用户界面
8.保存工程中的的所有文件并运行程序
点击C++Builder主工具栏上的“SaveAll”按钮,保存工程文件和窗体文件到指定的文件夹下。
(这里应注意:
所有的文件都应保存在同一个文件夹下)
可以试着运行一下现在所设计的程序。
点击C++Builder主工具栏上的Run按钮
,程序经过编译后自动生成EXE文件,并且立即运行,所看到的程序界面应和所设计的界面一致,此即“所见即所得”。
如果打开工程所在文件夹,可以看到里边有许多文件,其中.bpr是工程项目文件,.h是头文件,.cpp是程序源文件,.dfm是窗体定义文件,.ddp是Diagram图文件,.res是资源文件,.tds是外部调试符号表文件,.obj是目标文件,.exe是可执行文件,.~*是前面所述多种文件的备份文件。
9.建立媒体播放器、主菜单、弹出式菜单、工具栏、加速按钮控件对象
终止程序的运行,回到设计环境。
按照表8在窗体上添加一个媒体播放器控件并设置属性:
表8媒体播放器控件属性
控件所属的选项卡
默认控件名
控件
Visible属性
FileName属性
System
MediaPlayer1
媒体播放器
false
献给爱丽丝.mid
备注
事先应将“献给爱丽丝.mid”音乐文件拷贝到程序所在的文件夹下
下面制作主菜单(下拉菜单)。
按照表9在窗体上添加一个主菜单控件并设置属性:
表9主菜单控件属性
控件所属的选项卡
默认控件名
控件
Name属性
Items属性
备注
Standard
MainMenu1
主菜单
(不变)
(点击该属性后面的相应按钮,会出现专门的菜单设计界面,根据要求进行菜单的设计)
主菜单会自动显示在窗体界面上
小技巧:
菜单项之间的横线也算一个菜单项,制作方法是将其Caption属性设置为“-”即可。
图3a所示下拉菜单中的各菜单项的Name与Caption属性如表10所示:
表10主菜单各菜单项属性
菜单
菜单项Name属性
菜单项Caption属性
菜单项RadioItem属性
运算类型
m1
加法
true
m2
减法
true
m3
乘法
true
m4
除法
true
m5
随机
true
系统
Option
运算参数设置
false
Exit3
结束程序
false
把运算类型菜单中的五个菜单项的RadioItem属性值都设为true,会使它们有互斥效果,就像一组单选按钮一样。
下面制作弹出式菜单。
按照表11在窗体上添加一个弹出式菜单控件并设置属性:
表11弹出式菜单属性
控件所属的选项卡
默认控件名
控件
Name属性
Items属性
Standard
PopupMenu1
弹出式菜单
(不变)
(与主菜单的制作方法相同)
图3b所示弹出式菜单中的菜单项的Name与Caption属性如表12所示:
表12弹出式菜单中的菜单项属性
菜单项Name属性
菜单项Caption属性
Exit2
退出程序
下面制作工具栏。
按照表13在窗体上添加一个工具栏控件并设置属性:
表13工具栏控件属性
控件所属的选项卡
默认控件名
控件
Name属性
备注
Win32
ToolBar1
工具栏
(不变)
工具栏会自动布置在窗体上方
按照表14在工具栏上添加六个加速按钮控件并设置属性:
表14加速按钮控件属性
控件所属的选项卡
默认控件名
控件
Name属性
Glyph属性
Additional
SpeedButton1
加速按钮
(不变)
Mp3.bmp
Additional
SpeedButton2-6
加速按钮
备注
事先应将“mp3.bmp”位图文件拷贝到程序所在的文件夹下
最后,将窗体对象的Caption属性设置为“简单算术自测程序”。
再次保存所有文件。
完成后的窗体用户界面如图13所示:
图13放置媒体播放器、主菜单、弹出式菜单、工具栏和加速按钮控件并修改各控件属性后的用户界面
此时,代码编辑器窗口的内容如图14所示:
图14完成所有控件布局及属性设置后的代码编辑器窗口
10.生成窗体2
以上完成了窗体1(主窗体)用户界面部分的设计,下面制作窗体2(参数设置窗体)。
点击C++Builder6主工具栏上的“NewForm”
按钮,这时会自动出现一个新的窗体Form2(同时产生Unit2.h和Unit2.cpp两个文件)。
小技巧:
以后如果想要查看并修改某个窗体,可点击C++Builder6主工具栏上的“ViewForm”
按钮进行选择。
修改窗体2的“Caption”属性值为“运算参数设置”。
11.建立标签、带图片的按钮、旋转编辑器控件对象
在窗体2上放置四个标签和一个带图片的按钮控件,并按图2设置其相关属性(OK按钮的Name属性设置为SetDone)。
按照表15在窗体2上放置四个旋转编辑器控件并设置属性:
表15旋转编辑器控件属性
控件所属的选项卡
默认控件名
控件
MinValue属性
MaxValue属性
Value属性
Samples
CSpinEdit1
旋转编辑器
2
50
(用默认值)
Samples
CSpinEdit2
旋转编辑器
2
50
Samples
CSpinEdit3
旋转编辑器
2
20
Samples
CSpinEdit4
旋转编辑器
10
400
完成设置后的窗体2如图15所示:
图15完成所有控件布局及属性设置后的窗体2
点击C++Builder主工具栏上的“SaveAll”按钮,保存工程文件和两个窗体文件。
以上完成了程序的用户界面部分的设计。
四.编写程序代码
前面曾经说过,对象的两个要素是属性和行为,而到此为止所做的全部工作也仅仅是在用属性来描述对象的外部特征,只有通过编写代码才能规定对象的行为。
下面编写程序代码。
1.声明TForm1类的私有成员变量
在代码编辑器窗口中的Unit1.h头文件(窗体1的头文件)中,找到“private:
”这行代码,在其下方添加TForm1类的私有成员变量,这些私有成员变量将只可以被该类的成员函数访问:
//声明TForm1类的私有成员变量
intopType;//运算类型,1-加法,2-减法,...,5-随机
intop1,op2,answer,right;//两个运算数、答案和正确答案
intcorrect,total;//答对的题目数量与答题总数
intAddMax,SubMax,MultiMax,DivMax;//四种运算数的最大值(出多少以内的运算题)
小技巧:
为类添加成员变量,也可以这样操作:
在类浏览器窗口中单击鼠标右键,在弹出的快捷菜单中选择“NewField…”,随后可根据对话框进行操作。
但用这种方法进行操作,一次只能添加一个成员变量。
在类浏览器窗口中,展开TForm1前面的“+”号,可以看到多行
与
灰色图标,图标上若有一把锁,则表明这个成员变量或成员函数是“私有”的,否则就是“公有”的。
由于刚才所添加的成员变量全部是私有的,所以可以看到它们前面的图标上都带有一把锁。
(如果看不到,则不用管它。
)
2.包含必需的头文件
在代码编辑器窗口中的Unit1.cpp文件(窗体1的程序源文件)中,找到#include"Unit1.h"这行代码,在其下方添加包含三个头文件的宏命令:
#include"Unit2.h"//需要调用第2个窗体
#include"stdlib.h"//产生随机数头文件
#include"math.h"//数学运算头文件
3.为TForm1类添加成员函数(方法)
对象的方法(Method)是让对象实施一个动作或产生一个行为的途径,即方法告诉对象应处理的事情。
每一个对象都包含对数据进行操作的代码段,这段代码就是对象能够执行的一个操作,即方法。
例如,列表框有AddItem、Removeltem和Clear等方法来维护其列表中的内容。
下面为TForm1类添加几个成员函数(成员函数即类的方法Method)。
在类浏览器窗口的TForm1上面单击鼠标右键,在弹出的快捷菜单中选择“NewMethod…”菜单项,会弹出下面的“AddMethod”对话框,如图16所示:
图16AddMethod对话框
在MethodName后的文本框中,输入“Add”,在FunctionResult后的下拉列表框中挑选“void”(这表明函数不返回值),然后点击“OK”按钮,代码窗口中将自动出现以下几行代码:
voidTForm1:
:
Add()
{
//TODO:
Addyoursourcecodehere
}
在注释处添加下面加粗显示的四行程序代码,结果如下所示:
voidTForm1:
:
Add()//产生两个加数并求和的成员函数
{
this->op1=2+rand()%(this->AddMax-2);//产生第一个随机数并保存在相应的成员变量中
this->op2=2+rand()%(this->AddMax-2);//产生第二个随机数并保存在相应的成员变量中
this->right=this->op1+this->op2;//运算并保存正确答案
op->Caption="+";//在窗体上显示相应的运算符号
}
以上程序代码的作用在每行后都有详细说明,不再赘述。
简单说一下代码中访问成员变量和对象的属性的书写格式。
类的成员函数可以访问类的私有成员变量,代码书写格式是:
类实例名->成员变量名,例如上面代码中this->right。
在C++中,this是一个指针,this指针存在于类的成员函数中,它指向被调用函数所在的类实例的地址,也就是TForm1类的实例Form1的地址。
因此,this->right也可以写成 Form1->right,当然,如果只写right也是可以的。
由于在C++Builder中,所有的对象都被声明成指针类型的,所以访问对象的属性的代码格式是:
对象名->属性,例如op->Caption。
打开Unit1.h头文件,可以看到如下的声明语句:
public:
//Userdeclarations
__fastcallTForm1(TComponent*Owner);
voidAdd();
这说明,所添加的Add成员函数是“公有”的。
另外,在类浏览器窗口中,也可看到相应的
项。
蓝色图标表示这是成员函数,而非成员变量。
显然,成员函数一旦被执行,对象也就有了“行为”。
以上完成了为TForm1类添加Add成员函数。
用同样的方法为TForm1类添加下面几个成员函数:
voidTForm1:
:
Sub()//产生出减法题所需的被减数和减数
{
this->op1=2+rand()%(this->SubMax-2);
this->op2=2+rand()%(this->SubMax-2);
if(this->op1op2){
shortintt=this->op1;this->op1=this->op2;this->op2=t;//保证被减数大于减数
}
this->right=this->op1-this->op2;
op->Caption="-";
}
voidTForm1:
:
Multi()//产生出乘法题需要的乘数与被乘数
{
this->op1=2+rand()%(this->MultiMax-2);
this->op2=2+rand()%(this->MultiMax-2);
this->right=this->op1*this->op2;
op->Caption="×";
}
voidTForm1:
:
Div()//产生出除法题所需要的被除数与除数
{
this->op1=2+rand()%int(s