版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Delphi概述
内容提要
Delphi简介
Delphi7集成开发环境
Delphi的文件结构简单应用程序实例1.1Delphi简介
Delphi是Borland公司推出的面相对象的可视化编程环境,特别适合于快速规范地开发Windows应用程序。从Borland公司推出Delphi1.0至今,Delphi已经发展了7代产品,每一代都是伴随Windows操作平台的升级而升级。使用Delphi,用户可以轻松地进行各种复杂应用程序的开发。
1.2Delphi的新特性Delphi具有简单、高效、功能强大的特点,而Delphi7在以下几个方面又进行了加强:
企业应用的MDA开发可视化的快速Web开发内建的对Linux的跨平台支持企业级的报表能力免费的DataSnap多层应用开发WindowsXP应用
1.4Delphi7的集成开发环境
Delphi7的集成开发环境(IDE)和
Delphi以前的版本基本一致。它把菜单、多个工具栏以及一组窗口和应用程序设计在一起,将代码以事件的形式与界面的每一元素建立联系,使用户很方便的在这个高度集成的开发环境里进行应用程序的开发和调试。
Delphi7的集成开发环境(IDE)是进行设计、运行和测试程序的工作系统。启动Delphi7,运行后可以见到它的开发环境如图1-1所示。1.4.1Delphi7集成开发环境的组成
主要包括以下几个窗口:主窗口;对象树形图、对象监视器窗口;窗体设计器窗口、代码编辑器窗口。(图1-1Delphi7开发环境)1.4.2Delphi7主窗体
Delphi7的主窗体位于屏幕的上端,主要包括四个部分:标题栏、菜单栏、工具栏和组件栏。Delphi7的主窗口如图1-2所示。(图1-2)
Delphi7的主窗口1.4.3对象树形图及对象监视器窗口
对象树形图窗口(ObjectTreeView)用树形表方式列出了项目中所有的对象,即窗口、组件、菜单等,并清楚地表明了它们之间的关系。对象树形窗口如图1-3所示。
在对象树形图窗口下方是对象监视器窗口(ObjectInspector),对象监视器窗口含有两个页卡:属性页卡(Properties),显示窗体中当前被选择部件的属性信息,并允许改变对象的属性;事件页卡(Events),列出了当前部件可以响应的事件。对象监视器窗口如图1-4所示。
图1-3对象树形图窗
图1-4对象监视器窗1.4.5窗体设计器在
Delphi7的开发过程中,大部分的设计是在窗体设计器中,主要是通过向窗体中添加组件以及更改窗体及组件的属性和填写事件来完成的。当创建一个
Windows应用程序时,Delphi会缺省的建立一个窗体
Form1。窗体设计器窗口如图1-5所示。
对象树形图窗口与对象观察器窗口、窗体设计器窗口同步,即在此三个工具的任何一个中改变焦点时,另外两个工具的焦点也会发生变化。图1-5窗体设计器窗口1.4.6代码编辑器代码编辑器是一个程序代码的输入和编辑工具,也称单元窗口。通常情况下隐藏在窗体设计器的下面,可通过菜单或工具栏上的按钮对它们进行切换。Delphi7的代码编辑器具有彩色高亮度语法显示、自动进行语法校验、代码参数提示输入和代码完善等功能。
启动Delphi或执行NewForm菜单项时,系统即生成一个新的窗体,并在代码编辑器中产生一个新页卡,在新页卡中可以编辑相应的单元代码。按F12可以在窗体设计器窗口和代码编辑器窗口之间转换。
图1-6代码编辑器窗口1.5Delphi的文件结构利用
Delphi开发
Windows应用程序都是以工程为中心的,即每个应用程序都对应一个工程。工程中可包含一个或多个文件,这些文件主要是工程文件、单元文件、窗体文件和资源文件等。
1.5.1工程文件工程文件是一个
Delphi应用程序的总体管理和描述的文件,它的文件后缀是
.dpr,是整个应用程序的主程序。工程文件由Delphi7自动生成,一般情况下不修改这个文件。下面是一个工程文件的程序清单。
programProject1; //保留字program说明这是一个工程文件
//文件名为Project1.dpruses//保留字uses对工程所引用的单元进行说明
Forms, //引用Forms单元
Unit1in'Unit1.pas'{Form1};
//引用Unit1单元,在当前目录的Unit1.pas文件中,相应的窗体为Form1{$R*.res}//系统编译命令,将扩展名为.res的二进制资源文件连接到.exe文件中去begin //工程执行部分的开始声明
Application.Initialize;//应用程序的初始化
Application.CreateForm(TForm1,Form1);//创建窗体Form1 Application.Run; //运行程序end. //工程执行部分的结束说明1.5.2单元文件
单元文件是
Delphi的核心文件,它的文件后缀是
.pas。在Delphi7中每个窗体都有一个单元文件与之相对应,窗体的单元文件包含了程序部分,用以控制窗体的行为。在一个工程中,还可以建立与窗体无关的单元文件,用来编写工程中公用的函数、过程或定义新的数据。许多工程还调用了Delphi7附加库或其单元文件中的过程或函数。uses子句中包含的公共单元文件包含了支持可视窗体及其控制的对象声明。这些单元也包含了用于激活窗体的事件处理过程程序。(详见本教程P20~P21)1.5.3窗体文件
窗体文件记录设计时窗体和组件的属性,它的文件后缀是
.dfm。一个或多个窗体文件,它们含有相应的单元文件。dfm文件在
Delphi7下是一种脚本化的文本文件。在Delphi7中,一个应用程序至少需要一个窗体。可以在窗体上单击鼠标右键,选择
【ViewasText】命令,窗体将在代码编辑器中显示为文本格式。
(代码省略,详见本教程P21~P22)1.5.4资源文件
资源文件中可以包含各种资源,用它可丰富应用程序,它的文件后缀是
.res。编译器可以把资源文件链接到可执行文件里。资源文件的生成和编辑需要有专门的工具,如
Delphi7附带的
ImageEditor,利用它就可以创建、打开、编辑和保存图片资源。1.5.5其他文件后缀格式为如下形式:*.~pas:Delphi单元的备份文件;*.dof:Delphi中的有关配置和选项文件;*.dcu:Delphi的中间编译单元文件;*.dpk:Delphi的包文件;*.dll:动态链接库(Delphi可创建的一种终端文件);*.ocx:ActiveX控件(Delphi可创建的一种终端文件);
*.exe:可执行文件(Delphi可创建的一种终端文件)。
1.6Delphi简单应用程序实例
本节要创建一个简单的应用程序。启动Delphi7程序,出现一个窗口,窗体标题栏中显示“演示程序”字样,在窗体上显示一行文字“欢迎使用Delphi7开发工具!”;单击窗体中“测试”按钮,弹出信息框告知“我成功了!”;单击窗体中的“退出”按钮,能够退出应用程序。通过设计一个简单的应用程序。掌握以下内容:
应用程序开发过程;
常用开发工具及功能;
应用程序组成;
应用程序编译及执行。
在Delphi7中开发的每个应用程序都被称为工程。Delphi7编程首先从创建一个新工程开始。创建新工程有以下两种方法:
1.6.1建立用户界面的对象(1)
新创建的工程中包含一个默认窗体(Form1)和它对应的单元(Unit1),根据工程的需要可添加窗体或单元。工程文件的扩展名为.dpr。打开一个已建立的工程的方法是:单击File菜单,指向OpenProject,然后选择工程文件即可。⑴启动Delphi7进入开发环境,此时系统自动生成一个工程,默认名为Project1;⑵选择File菜单,指向New,然后单击Application系统将创建一个新的工程。1.6.1建立用户界面的对象(2)
程序设计首先是窗体设计。因此第一项工作就是在窗体设计器完成窗体设计,在窗体中添加各种所需对象进行界面设计。将组件板上的组件添加到窗体上有三种方法。(1)单击组件板上所需组件的按钮,然后在窗体适当位置拖动鼠标画出组件,即可将组件添加到窗体指定位置。(2)双击组件板上所需组件的按钮,即可将组件添加到窗体中心位置。(3)按下Shift键不放,单击组件板上所需组件的按钮,所选择组件出现蓝色边框,同时对象选择按钮弹起。可以在窗体适当位置连续画出该类组件,用鼠标单击对象选择按钮,可以取消该类组件的连续添加操作。
本例中共涉及3个对象:1个TLabel组件和2个TBotton组件。Label组件用来显示信息,不能用于输入;Button组件用来执行有关操作;窗体是上述对象的载体
1.6.1建立用户界面的对象(3)
如果组件在窗体中的位置不合适,可以用鼠标拖动的方法进行移动,直到对所有组件的位置感到满意为止。刚添加到窗体中的组件,其边框上有八个黑色小方块,表明它是当前被选定的组件。可以用鼠标拖拉边框上黑色小方块使组件在相应方向上放大或缩小,也可用鼠标指向组件内部,按下鼠标左键并拖动鼠标到窗体的任意位置。按组合键Ctrl+C可以对所选组件进行复制,Ctrl+V可以在窗体中进行粘贴,按Delete键可以删除所选组件1.6.2对象属性设置(3)在
Delphi中,设置窗体和组件的属性是通过对象检查器实现的,对象检查器是设计界面过程中最频繁使用的工具。选中窗体上要设置属性的组件,对象检查器会显示该组件的所有属性,只需对要改变的属性后面的值进行修改就可以了。本例中,各组件的属性设置:
组件名称组件属性属性值说明Label1Caption空值使Label1中不显示任何文字AutoSizeTrue使Label1大小随里面的内容变化和适应Button1Caption测试在Button1按钮上显示指定文字Button2Caption退出在Button2按钮上显示指定文字1.6.3对象事件过程及编程(1)
建立了用户界面并为每个对象设置了属性后,就要考虑用什么事件来激发对象执行所需要的操作。这涉及到选择对象的事件和编写事件过程代码。为了在窗体上显示“欢迎使用
Delphi7开发工具!”,同时改变窗体的标题为“演示程序”,需对Form1窗体的OnCreate事件进行编程。代码如下:procedureTForm1.FormCreate(Sender:TObject);beginForm1.Caption:='演示程序';Label1.Caption:='欢迎使用
Delphi7开发工具!';end;1.6.3对象事件过程及编程(2)
为了实现单击“测试”按钮弹出对话框功能,需在Button1的OnClick事件中进行编程。方法是:选择Button1对象,在对象监视器中选择“事件”选项卡,在事件选项卡中选择OnClick事件,双击事件处理栏,Delphi自动生成该事件过程的代码框架,同时打开代码编辑窗口,将光标定位在代码框架过程体的首行处,在过程体中加入如下代码:ShowMessage('我成功了!');
输入完毕可以看到按钮Button1的鼠标单击事件处理程序的全部内容是:procedureTForm1.Button1Click(Sender:TObject);begin
ShowMessage('我成功了!');
end;end.1.6.3对象事件过程及编程(3)同样,输入完毕的Button2按钮的鼠标单击事件处理程序的全部内容是:procedureTForm1.Button1Click(Sender:TObject);begin
Close;
end;end.1.6.4编译、调试、执行
Delphi是先编译后执行的程序,它不是解释执行的。所以一般可先使用菜单【Project】|【BuildAllProjects】进行编译程序,但更多的时候是直接使用菜单【Run】|【Run】来直接运行一个程序,因为它会先编译,如果没错误再运行。
程序运行结果如图1-16所示,当出现一个名为Delphi7程序的窗口,单击窗口上的显示按钮,显示一行文字“第一个Delphi7程序”,单击窗体右上方关闭按钮时退出程序。在程序中除了语法错误,还有可能在程序运行中出现错误,这就要涉及到程序的调试。Delphi7为程序员提供了方便的程序调试手段。图1-15程序运行结果1.6.5保存工程
当程序调试完毕没有任何问题时,还要注意保存程序。可通过菜单【File】|【SaveAll】保存所有文件,也可以单个保存每一个要保存的文件。
打开Sample目录可以发现有六个文件,分别是Main.dfm、Main.pas、Sample.cfg、Sample.dof、Sample.dpr、Sample.res。应当注意,一个应用程序并不是只由一个文件组成,而是由许多不同类型的文件组成的。
OOPPascal基础知识
内容提要
OOPPascal基本知识
常用数据类型
运算和运算符常量和变量常用语句过程和函数2.1OOPPascal基本要素
Delphi是Borland公司推出的面向对象的可视化编程环境,特别适合于快速规范地开发Windows应用程序。从Borland公司推出Delphi1.0至今,Delphi已经发展了7代产品,每一代都是伴随Windows操作平台的升级而升级。使用Delphi,用户可以轻松地进行各种复杂应用程序的开发。
2.1.1标识符标识符是用来标识一个特定元素的,如类名、变量名、单元名、方法名等。利用标识符可以完成对变量、常量、数据类型、过程、函数、类等的引用。ObjectPascal标识符由字母、数字、下划线组成,其规定为:(1)必须以字母或下划线开始;(2)不能与保留字相同;(3)避免与ObjectPascal已经使用的标准标识符相同。2.1.2关键字
关键字又称保留字(ReservedWords)是由系统规定的、具有特定意义的单词。在编程时不能被重新定义或另作他用。ObjectPascal语言规定的保留字详见本教程P28页表2-1。
除了上述的保留字外,Private、Protected、Public、Published和Automated在定义对象类型时也作为保留字,而在其他场合则作为指令符。单词at和on也具有特殊的含义。
注意:ObjectPascal编程语言和许多编程语言不同,它对单词的大小写是不敏感的。ObjectPascal不区分大小写。IN、in和In都被看做是同样的意义。2.1.3指示字
注意:
可以定义一个跟指示字完全相同的标识符,但最好不这样做。
指示字(directives)也是具有特殊意义的单词,但与保留字不同的是可以将指令符定义为标识符,ObjectPascal不会指示出错,但这容易混淆。ObjectPascal规定的指令指示字见表2-2。2.2数据类型
OOPPASCAL语言是一种强类型语言,这表明每一个变量在赋值之前必须明确给出它的类型。即变量在访问之前必须声明。OOPPASCAL数据类型丰富,它允许使用17种类型的数据。其结构如P31图2-1所示。2.2.1简单类型
OOPPASCAL中的简单类型包括整形、字符型、布尔型、枚举型、子界类型以及实数类型。
其中,整形、字符型、布尔型、枚举型、子界类型统称为顺序类型(ordinaltypes)。在顺序类型中,除了第一个元素,每一个元素都有唯一的前趋;除了最后一个元素外,每一个元素都有唯一的后继。
1.整型
OOPPASCAL中将整数类型分为基本的(fundanmental)和一般的(generic)整数类型。基本的整数类型包括Shortint(短整型)、Smallint(小整型)、Longint(长整型)、Int64(64位整型)、Byte(字节型)、Word(字型)和Longword(长字型)。它们的取值范围和格式如表2-4所示:表2-4基本整数类型类型范围格式Shortint-127...1278位带符号数Smallint-32768…3276716位带符号数Longint-2147483648…214748364732位带符号数Int64-2^63…2^63-164位带符号数Byte0…2558位无符号数word0…6553516位无符号数Longword0…429496729532位无符号数2.字符型
字符类型也有基本类型和一般类型之分。基本类型包括AnsiChar和WideChar两种类型。其中,AnsiChar的格式为8位字节,取值的序数按扩展ANSI字符集排列;而WideChar的格式为16位字节,是为兼容UniCode字符集而设置的,它的前256个UniCode字符同ANSI字符相同。一般的通用字符类型为Char,它等价于AnsiChar。由于字符型也属于顺序类型,可用函数Ord来取出字符的序数,即Ord(‘A’)=65成立。也可用预定义的函数Chr来返回对应的字符值,即Chr(65)=’A’成立。
3.布尔型
布尔型数据用于进行逻辑运算,布尔型数据的值只有两个:True(真)和False(假)。ObjectPascal包括4种形式的布尔型数据,详见表2-7。表2-7ObjectPascal语言的布尔型类型名称字节数取值布尔型Boolean1只能为False(0)或True(1)字节布尔型ByteBool1False或True(非False)宽布尔型WordBool2False或True(非False)长布尔型LongBool4False或True(非False)4.枚举型
枚举类型定义了一组值的顺序集合。它们的次序根据标识符的枚举顺序而定。在Delphi中广泛使用了枚举类型来定义组件对象的属性。枚举类型是一种用户子定义类型,定义枚举类型的语法如下:Type类型名称(TypeName)=(值1,值2,值3,……,值n);如下是定义枚举类型的例子:
TypeFruits=(Apples,Oranges,Bananas,Grapes);
在程序中定义好了枚举类型后,可以象如下声明变量:
VarMyFruit:Fruits;
5.子界类型子界类型也是一种用户字定义类型,它规定了值域的上界和下界及取值的类型。字节类型必须是顺序类型中某范围的值,在想限制一个变量的取值范围时,子界类型是非常有用的。子界类型的定义如下:Type类型名称
=值域下界
…
值域上界;
定义子界类型必须注意以下几点:
上界和下界必须属于顺序类型,且为同一顺序类型。
上界和下界的类型定义了子界的基类型。
上界的序号必须大于下界的序号。正确的定义举例如下:
TypeSomeNumbers=0…15;
SomeCaps=‘A’…‘H’;
6.实型实数类型用于定义一个通常所说的浮点数所表示的数字的集合。它是属于数据类型中的简单类型,但已不属于顺序类型。实数类型也有基本类型和一般类型。基本类型包括:Real48、Single、Double、Extended、Comp和Currency;一般类型为:Real。详细的格式及表示范围如表2-6所示:
类型名表示范围有效位占用内存(字节)Real48±2.9*10^-39~1.7*10^3811~126Single±1.5*10^-45~3.4*10^3874Double±5.0*10^-324~1.7*10^30815~168Extended±3.6*10^-4951~1.1*10^493219~2010Comp-2^63+1~2^63-119~208Currency-922337203685477.5808~922337203685477.580719~208Real±5.0*10^-324~1.7*10^30815~1682.2.2字符串类型字符串型是存储字符串数据的类型。OOPPASCAL中提供的预定义类型如表2-7:
表2-7字符串类型类型名最大长度(字符)所需内存用途ShortString2552~256B向后兼容AnsiString2314~2GB8位ANSI字符WideString2304~2GBUniCode注:在
Delphi5.0以后的程序中可直接定义String类型,其默认为AnsiString类型(或者说是LongString类型),如果使用{$H-},则被解释为ShortString类型。
2.2.3结构类型
结构类型包括:集合(Set)、数组(Array)、记录(Record)、文件(File)以及类(Class)、类引用(ClassReference)、接口(Interface)等类型。它的实例中含有一个或多个值。
2.2.4指针类型指针是内存中数据结构的详细地址,相当于一个表示内存地址的变量。指针类型声明的一般形式为:
Type指针类型名
=^类型特殊符号
“^”
表明了是一个指针类型,其后面紧跟的类型确定了指针所指向的类型,可以是简单类型,如整型、实型、枚举等;也可以是结构类型,如数组、集合、记录等类型。“^”还有另外一种含义,跟在指针类型的变量后面,表示具体的值。配合指针操作的还有符号“@”,它是取址运算符,表示取地址操作。
2.2.5过程类型
过程类型变量相当于指针的角色,它可指向一个过程或函数,并且可以作为另一个过程或函数的参数使用。其定义的方式如下例:TypeTProcedure=Procedure;//声明一个无参数过程类型TIntegerFunction=Function:Integer;//声明一个无参数函数类型,返回值为整型TStringProcedure=Procedure(constS:String);//声明一个带有
String类型参数的过程类型VarProc:Tprocedure;IntF:TintegerFunction;StrP:TstringProcedure;2.2.6可变类型
用于标识可变类型的保留字是Variant,Variant类对象本质上是无类型变量,也就是它们可以自动显现不同的类型。可变类型就是为了解决在编译时数据类型无法确定的情况下,ObjectPascal才引入的数据类型。可变类型变量举例如下:VarX:Variant;S:String;BeginX:=10;S:=IntToStr(X+20);X:=‘ObjectPascal’;MessageDlg(X,mtConfirmation,mbYesNoCancel,0);End;2.3运算和运算符
运算是对数据进行加工处理的过程,描述各种不同运算的符号称为运算符,而参与运算的数据称为操作数。表达式是表示某个求值规则的运算公式,它由运算符和圆括号将常量、变量等操作数以合理的形式组合而成。表达式可以用来执行运算、操作或测试数据,每个表达式都会产生惟一的值。表达式的类型由运算符的类型决定。在ObjectPascal中有以下几种运算符:算术运算符、位运算符、字符串运算符、关系运算符、布尔运算符、集合运算符、指针运算符、类运算符和@运算符。本节介绍几种常用的运算和运算符。2.3.1算术运算
算术运算的操作对象为整形或实型,算术运算符包括
+,-,*,/,div和
mod,详细说明如下表2-8:
表2-8OOPPASCAL语言的算术运算符操作符操作操作数类型结果类型+加整形,实型整形,实型-减整形,实型整形,实型*乘整形,实型整形,实型/除整形,实型整形,实型Div整数除整形整形Mod取模整形整形
2.3.2布尔运算
布尔运算的操作对象的类型为布尔型,返回的结果值也是布尔类型。布尔运算符基本有四个,分别是
Not,And,Or,Xor,其详细说明如表2-9:
表2-9OOPPASCAL语言的布尔运算符
操作符操作操作规则Not取反NotTrue=False;NotFalse=TrueAnd与(布尔乘)TrueAndTrue=True;AAndFalse=FalseOr或(布尔加)FalseOrFalse=False;AOrTrue=TrueXor异或AXorA=False;AXor(NotA)=True2.3.3逻辑运算
逻辑运算实现的是按位的运算,它的操作及其操作的结果均为整数,逻辑运算的操作说明如下表2-10所示:
表2-10OOPPASCAL语言的逻辑运算符
操作符操作操作举例Not按位取反Not001101=110010And按位与001101And100001=000001Or按位或001101Or100001=101101Xor按位异或001101Xor100001=101100Shl左移13(001101)Shl2=52Shr右移13(001101)Shr2=32.3.4指针运算指针运算符及其说明如下表2-11:
表2-11OOPPASCA语言的指针运算符
操作符操作操作数类型结果类型+加法字符指针、整数字符指针-减法字符指针、整数字符指针、整数∧取值指针指针基类型=相等指针布尔<>不等指针布尔2.3.5集合运算
集合运算是以集合类型作为操作数的,它的运算符及其说明如下表2-12:
表2-12OOPPASCAL语言的集合运算符
操作符操作结果类型+并集集合-差集集合*交集集合<=子集布尔>=父集布尔=相等布尔<>不等布尔In属于布尔2.3.6关系运算
关系运算用于比较两个操作数,其返回值的类型是布尔型。关系运算符的操作说明如下表2-13:
表2-13OOPPASCAL语言的关系运算符
操作符操作操作数类型=相等简单类型、类、类引用、接口、字符串、紧缩字符串<>不等简单类型、类、类引用、接口、字符串、紧缩字符串<小于简单类型、字符串、紧缩字符串、PChar>大于简单类型、字符串、紧缩字符串、PChar<=不大于简单类型、字符串、紧缩字符串、PChar>=不小于简单类型、字符串、紧缩字符串、PChar2.3.7字符串运算
操作符
+可以用作算术运算符、指针运算符和集合运算符,还可以用作表示把两个字符串类型的操作数相连接,即连接两个字符串。例如:‘My’+‘String’=‘MyString’;
2.3.8取址运算
取址运算符@
,它返回变量、函数、过程或方法的地址。关于取址运算符@,其原则说明如下:如果
X是变量,则
@X
返回
X的地址;在默认的编译指示{$T-}下,@X的类型为
Pointer;而在{$T+}状态,
@X的类型为
^T,其中的
T为
X的类型。如果F是一个过程或函数,@F返回F的入口点,它的类型一定是Pointer。
2.3.9运算符的优先顺序在表达式中有多种运算符时,要注意各个操作符之间的优先级。通常情况下,先作括号里的运算,再从优先级由高到低的次序来做,同等优先级的,按从左到右出现的顺序处理。所以,在不清楚具体优先级的情形下,可以使用括号,来确保程序的正确性。
表2-14OOPPASCAL中运算符的优先级
优先级操作符最高@,Not次高*,/,Div,Mod,And,Shl,Shr,As次低+,-
,Or,Xor最低=,<>,<,>,<=,>=,In,Is2.4常量与变量
定义常量的目的基本上有两种:其一,在程序中经常用到某些常数值,为了书写方便及减少频繁输入造成错误,可把它定义为一个常量;其二,就是为了便于程序的阅读或修改,定义常量可使程序易于维护。
1.常量的声明常量可以在程序、单元、过程或函数的声明部分进行声明,常量在说明时就被赋予了一个值,在程序执行过程中是不可改变的。
声明常量的一般形式如下:Const
常量名1=常量值1;
常量名2=常量值2;
……
在程序设计中常用到两种形式的数据,一种是在程序执行过程中其值保持不变的数据,称为常量;另一种是在程序执行过程中其值可以改变的数据,称为变量。2.4.1常量2.类型常量类型常量主要是不能修改的只读变量。在声明常量时,直接声明其常量类型。类型常量的声明方法如下:
Const
常量名1:类型名=常量值1;
常量名2:类型名=常量值2;
……举例如下:ConstWeekDays:Integer=7;DayInYear:Integer=365;2.4.1常量(2)2.4.2变量变量实际就是程序员在内存中指定的一个带有标识符的地址空间,变量名则是这个指定内存地址的标识符,而变量的类型则确定了这个内存地址中存的值什么样是合法的或可能的,并且该内存地址里的值是可以改变的。1.变量的声明变量在使用之前,也必须先进行声明。声明变量的保留字为Var,其声明的一般形式如下:
Var
变量名1:类型名1;变量名2:类型名2;
……声明变量举例如下:
VarGz_Sum:Real;Value_1,Value_2:Integer;StrTitle:String;X:Variant;2.4.2变量2.变量的作用域变量的作用域是指它的可见性和生命期。可见性是指可以访问该变量的区域,生命期是指一个变量可以保持它的值和可见性的时间。在
Delphi7中,变量可以在程序、单元、函数或过程的声明部分进行声明,声明的位置则决定了变量的作用域。
声明在过程或函数内部的变量有时叫做局部变量,而在应用程序开始声明的变量叫做全局变量。全局变量可以在声明时对它进行初始化,格式为:
var<变量名>:<类型名>=<常量表达式>
其中常量表达式的值必须与变量定义的类型相兼容。2.4.2变量3.变量的强制类型转换由于
Delphi的编译器对各种类型的参数检查是非常严格的,类型不匹配则通不过编译器的编译检查,为通过编译器的编译检查,经常需要把一个变量的类型转换为另一个变量类型。强制类型转换就是一种技术,通过它能使编译器把一种类型的变量当作另一种类型变量,由此来通过编译器的编译检查。注:强制类型转换要求两种类型在内存中存储空间的大小必须相同,整数类型变量与实数类型之间不能进行这样的转换,应该通过预定义的标准函数,如:Trunc()或Round()函数。
2.5OOPPASCAL中的语句
ObjectPascal中的语句可分为简单语句和结构语句两种。简单语句有赋值语句、空语句、跳转语句(Goto语句)和过程语句;结构语句有复合语句、条件语句、循环语句和
开域语句(With语句)。
语句的书写规则⑴可以把多个语句放在一个程序行中,也可把一个语句分多行书写⑵每个语句都必须以分号“;”结束。
⑶对于较为复杂的程序常用到复合语句,复合语句是指将多个语句用begin和end两个保留字包围起来,格式如下:begin<语句1>;…;<语句n>;end;复合语句在ObjectPascal中被视为一个语句,因此在end后必须2.5.1简单语句1.赋值语句赋值语句用来显式地给变量赋值,即用表达式的值取代变量的当前值。赋值语句的一般形式如下:变量名
:=表达式
;如:MyNumber_1:=100;
2.空语句在
ObjectPascal中允许使用空语句,所谓空语句就是语句中没有任何表达式的值和赋值符号,只有一个分号。
可参见P57例题。2.5.1简单语句(2)
3.Goto语句和语句标号
Goto语句可以将程序的执行流程转移到程序指定的某个位置,即转移到其它语句处再继续执行。Goto语句必须借助语句标号才可能使程序知道转移的位置,ObjectPascal可以使用标号(Labels)来标识语句以提供Goto语句将跳转的确切位置。Goto语句的一般形式如下:
Goto语句标号;注:Goto语句所转向的语句标号必须和该语句同处于相同的程序段内,不能转入或转出一个过程或函数,也不能转入该程序段内其它的循环结构。
2.5.2复合语句
复合语句由若干个简单语句或结构语句构成,在这些语句前后加入保留字Begin和End即可。其一般形式如下:
Begin
语句1;语句2;
……
语句n;
End;例如:把两个变量的值进行交换的复合语句如下:
BeginX:=Number_1;
Number_1:=Number_2;
Number_2:=X;
End;
2.5.3条件语句(1)
ObjectPascal语言提供的条件语句有两种,即
If语句和
Case语句。
1.If语句
If语句需要计算一个表达式,并根据计算结果决定程序流程。If保留字后的表达式的值必须是一个布尔类型(Boolean)。其语句的一般形式如下:If<logicalexpression>Then<statement>;或语法中带有Else子句,如:If<logicalexpression>Then<statement>Else<statement>;其中,<logicalexpression>是一个逻辑型的表达式,其值为Boolean类型。当值为真(True)时,程序执行保留字Then后的<statement>;当值为假(False)时,程序则执行保留字Else后的<statement>。两种形式中的<statement>即可以是单语句也可以是复合语句。最后的“;”号代表着If语句的结束,所以在保留字Else之前不应加有“;”号。
2.5.3条件语句(2)2.Case语句
Case语句的一般语法形式为:
Case选择器表达式Of
情况常量表1:语句1;情况常量表2:语句2;
……
情况常量表n:语句n;
Else
语句
End;其中:选择器表达式的值必须为顺序类型(如整型、字符型、布尔型和子界型等)。情况常量列表中的值应是选择器表达式可能具有的值。由每一个情况常量列表列出的值在Case语句中必须是唯一的,相互间值的范围也不允许有重叠部分。Else提供了如果所列出的情况都不出现,应执行的语句,也就是说程序只能选择一个执行结果。根据需要也可以省略掉Else部分和它后面的语句。2.5.3条件语句(3)条件语句举例:以例题2.2为例,用Case语句来代替If语句的实现。程序代码如下:
CaseMarkOf90..100:ShowMessage('优');80..89:ShowMessage('良');70..79:ShowMessage('中');60..69:ShowMessage('及格');0..59:ShowMessage('不及格');ElseShowMessage('输入超出范围');End;2.5.4循环语句(1)
在编程过程中遇到的好多问题是重复单调的。比如从1加到100,问题虽然简单却要重复操作。我们可以把这些重复的动作交给计算机去完成。引例:求1+2+3+……+100的值。
OOPPascal语言提供了三种循环语句,每一种可分别适合某一特定情况。这三种循环分别是:Repeat、While和For循环语句。
循环结构只关心下面的三个要素:进入循环结构的条件是什么?在什么情况下结束循环过程?循环体内部要完成的操作及在循环体内如何改变循环条件?
2.5.4循环语句(2)
1.Repeat循环语句
Repeat循环语句是以Repeat开始,以Until结束。它可以重复执行Repeat和Until之间的语句,直至Until后的表达式为真,则退出循环执行其后的语句。Repeat循环语句的一般形式为:
Repeat
语句1;语句2;
……
语句n;
Until<逻辑表达式>;循环体2.5.4循环语句(3)
2.While循环语句While循环语句在多数场合下都可以代替Repeat循环语句,但与Repeat循环语句不同的是,它的布尔类型的表达式在While之后,即在循环刚开始处,所以While循环是先进行判断,再执行循环语句。While循环语句的一般形式为:
While<逻辑表达式>Do<循环体语句>
其中,表达式必须是一个具有Boolean类型值的表达式。如果表达式的值为真(True)则执行
Do后的循环体语句;如果表达式的值为假(False),则不执行
While循环体而直接跳到
While循环体后再执行其它语句。Do后的循环体语句,可以是简单语句、复合语句或其它结构语句。
2.5.4循环语句(4)
3.
For循环语句
For循环语句可以执行一定的次数,它需要一个循环变量来控制循环的次数。For循环语句有两种形式:增量循环和减量循环。
增量循环
For语句的一般形式为:
For循环变量名:=初值
To终值
Do语句
减量循环
For语句的一般形式为:
For循环变量名:=初值
DownTo终值
Do语句其中,循环变量必须是一个顺序类型的局部变量,也不允许带有限定符。初值和终值的类型应和循环变量的类型兼容。循环体中的语句可以是简单语句、复合语句或结构语句。
2.5.4循环语句(5)
3.
For循环语句
For循环语句可以执行一定的次数,它需要一个循环变量来控制循环的次数。For循环语句有两种形式:增量循环和减量循环。
增量循环
For语句的一般形式为:
For循环变量名:=初值
To终值
Do语句
减量循环
For语句的一般形式为:
For循环变量名:=初值
DownTo终值
Do语句其中,循环变量必须是一个顺序类型的局部变量,也不允许带有限定符。初值和终值的类型应和循环变量的类型兼容。循环体中的语句可以是简单语句、复合语句或结构语句。
2.5.4循环语句(6)
三种循环的比较以上三种循环都可用来实现循环,它们的使用特点归结为:如果知道循环执行多少次的话,可以使用For循环语句结构。For循环执行速度快,效率高。如果不知道循环要执行多少次,但至少会执行一次的话,选用Repeat…Until循环语句结构比较合适;当认为程序可能一次都不执行的话,最好选用While…Do循环语句结构。Break()过程和Continue()过程在While、Repeat或For三种的循环体中,可调用Break()过程,使得程序的执行流程发生改变,即在循环体中当某个条件成立时跳出循环体。如果想跳过循环体中部分代码重新开始下一次循环,调用Continue()过程。
2.6过程和函数一般来说每个程序都由若干个主要的任务构成,每个主要任务又可分成若干个子任务,这样逐层细化,一直细化到每个子任务都只完成一个简单的基本功能为止。
为此,可以把某些功能完全相同或非常相近的子任务单独提取出来,划分成程序的基本单元,其它程序可以重复调用。这样做提高了编程效率,是程序更加规范化,也减少了代码的出错率。
函数和过程就是OOPPascal语言中的两种子程序,它们可以随时被调用。函数在执行时将返回一个值,而过程执行时不返回任何值。
2.6.1过程的声明过程声明的一般语法形式为:
procedure过程名(形式参数表);指令符;局部声明:begin执行语句
……end;在Delphi7的单元中声明过程或函数时,只需要在单元内声明过程或函数头部(可在单元的接口部分,也可在单元的实现部分),然后把光标定位在头部内,点击鼠标右键弹出快捷菜单,在该菜单中单击【CompleteClassatCursor】菜单项即可。Delphi7会帮助完成自定义过程、函数或类的输入。2.6.2函数的声明函数声明的一般语法形式为:
Function函数名(形式参数表):返回类型;指令符;局部声明部分begin执行语句……end;需要特别注意的是:函数必须有返回值,所以在函数声明时要给出返回值的类型;而过程没有返回值,声明时也就没有返回类型。
2.6.3过程和函数的调用1.过程调用调用过程的一般形式如下:过程名(实参数表);如果声明的过程没有形参,调用时便可以省略后面的实参表,其形式如下:过程名;2.函数的调用调用函数的一般形式如下:函数名(实参数表);在调用过程和函数时要注意:在过程与函数声明的作用域内才可调用该过程或函数;调用过程或函数时还要注意有参数时,参数的类型一定要保持相同。2.6.4参数传递方式在上面的调用过程或函数时,程序将把实参传递给形参,按传递方式的不同,OOPPascal中过程和函数的参数可分为:值参数、常量参数、变量参数和外部参数。1.值参数如果形式参数表中的参数前面没有Const、Var或Out声明的参数,该参数则为值参数类型。
在OOPPascal中值参数是按“值传递”方式将实参的值传送给形参的。值传递指的是在调用子过程语句被执行时,带实参值的调用语句将实参复制给子过程中的形参。所以要求实参的个数、数据类型与形参个数、数据类型完全匹配。2.6.4参数传递方式2.常量参数如果形式参数表中的参数前面有
Const声明的参数,该形式参数则为常量参数。常量参数在过程或函数中是绝对不允许改变的参数值,也不能再作为实参传送给该过程或函数体中另一个过程或函数的变量形参。如果在一个过程或函数中其形参在执行过程中不应该改变其数值的话,那么就应该使用一个常量参数。这样可以保护形参而杜绝发生意外的情况。Delphi7系统
在
Sysutils中声明的字符串比较函数,如
CompareStr()函数中的形参就是常量参数,它的首部如下:
FunctionCompareStr(ConstS1,S2:String):Integer;2.6.4参数传递方式3.变量参数如果形式参数表中的参数前面有
Var声明的参数,该形式参数则为变量参数类型。变量参数的参数传递方式为“地址传递”方式。地址传递指的是调用过程语句被执行时,过程中的形参直接引用了调用语句中的实参。所以形参与实参实质上是用同一个存储单元。如果在子过程中修改了形参值,就会直接体现在实参上,在某些情况下,会造成负面影响。2.6.4参数传递方式4.外部参数如果形式参数表中的参数前面有
Out声明的参数,该形式参数则为外部参数类型。外部参数与变量参数一样在实参与形参之间的值传递是按地址传递方式进行的。但是使用时与变量参数有很大的区别。当调用含有外部参数的过程或函数时,所引用的实参(变量)的初始值将被抛弃,该变量仅被用来作为一个容器来存储过程或函数执行的中间结果。在编写应用象COM、CORBA这样的分布式对象模型的程序中,会经常使用外部参数。
可视化组件的应用
内容提要
窗体与组件常用组件的使用3.1窗体与组件在Windows环境中,人机交互主要是在一些窗体和对话框中进行的。在Delphi中,窗体指的就是窗口和对话框,进行可视化程序设计一般就是从窗体开始并在窗体中完成的。窗体本身就是一个组件,它与其他组件不同的是:窗体像一个可以放置东西的容器,可以根据任务的需要在其上放置各种各样的组件。窗体与组件的关系参见图3-1。3.1.1窗体与组件的关系图3-1窗体与组件3.1.2组件的公共属性和事件
不同的组件具有不同的属性、方法和事件,但有些属性和事件是公共的,也就是它们虽然出现在不同的组件中但含义和使用方法相同。
1.常用的公共属性(1)Action属性。用来设置与菜单项相关的动作对象,可以通过动作列表编辑器来设置。(2)Align属性。用于决定组件在窗体或上一级组件中的位置和尺寸。(3)Autosize属性。用于决定组件是否随其所包含内容的大小而调整尺寸。(4)Caption属性。用来设置组件的标题。(5)Color属性。用来设置组件的颜色。
(6)Cursor
属性。用于设定当鼠标的光标落入该组件的区域时鼠标光标的形状。(7)Font
属性。用于设置组件上所显示的文字的字体。(8)Height
属性和Width属性。用于设置组件的高度和宽度。(9)Hint
属性和ShowHint属性。Hint属性用于设置鼠标在组件上停留是显示提示信息的内容;ShowHint属性用于指定鼠标在该组件上停留时是否显示提示信息。(10)Left
属性和Top属性。指定该组件在窗体中的左上顶点的坐标值。(11)Name
属性。这是每个组件都具有的属性,该属性用于指明组件对象的名字,通过组件对象的名字来使用组件。(12)ParentColor
属性。
ParentFont属性和ParentShowHint属性。当这些属性值设置为Ture时,组件使用它的上一级组件的同一属性的设置植,这样可以使程序保持一致的风格。(13)PopUpMenu
属性。用于指定当右击该组件时弹出时的弹出式菜单PopUpMenu的名字,此时这个弹出式菜单应该已经存在,PopUpMenu本身也是一个组件。(14)Text属性。 用于指定文本类组件显示的文本,类似于Caption属性。(15)Visible属性。决定组件是否可见。当设置为True时,在运行时可以看到该组件;设为False时运行时不可见。2.常用的公共事件
⑴
onClick事件。鼠标左键单击某组件时触发该事件。⑵
onDblClick事件。鼠标左键双击某组件时触发该事件。⑶
OnEnter事件和OnExit事件。
当通过鼠标单击组件或Tab键跳转到组件上时,该组件获得焦点,此时该组件的OnEnter事件被触发;该组件由焦点状态转为非焦点状态时将触发OnExit事件。⑷
OnMouseDown事件、OnMouseMove事件和OnMouseUp事件这是响应鼠标的一组事件。其中当鼠标在组件上被按下时触发OnMouseDown事件;当鼠标在组件的显示区域内移动时触发OnMouseMove事件;当释放了在组件区域内按下的鼠标键时触发OnMouseUp事件。这三个事件不仅可以判断鼠标按下的是左、中、右键中的哪一个键,还可以判断是否同时按下了Alt、Shift或Ctrl键。具体应用请看下面章节的组件介绍。⑸OnKeyDown事件、OnKeyUp事件和OnKePress事件这是响应键盘的一组事件。组件处于激活的焦点状态时,按下了键盘上的键时将触发OnKeyDown事件,返回的是按下键的键值,可以是复合键;释放一个按下的键时将触发OnKeyUp事件;键盘上的键一次完整地按下和释放操作将触发OnKeyPress事件。
3.2常用组件的使用Delphi封装了大量的可视化组件,使程序员能够在拖拖放放中轻松地设计程序界面。Delphi中提供的【Standard】、【Additional】和【Win32】三个标签页放置基本组件。这些组件都是任何程序设计必不可少的。本节将详细介绍常用组件的使用方法。3.2.1Label组件
Label(标签)组件在Standard标签页中,主要用于在窗体中显示提示信息,常与Edit组件一起使用,是显示文本的主要组件。其特殊属性有:1.Autosize属性 该属性用来判断Label(标签)组件是否随Caption属性值自动调整大小。如果该属性值为True,则Label的长度随着Caption属性值自动调整大小;如果该属性值为False,则Label保持设计时定义的大小不变,此时,若标题太长,则只能显示部分内容。2.Caption属性 该属性用来设置在标签上显示的文本。3.Wordwrap该属性 该属性用于设置Caption属性的显示方式。缺省为False,表示标签上的标题(提示信息)不能自动换行;如果该属性为True,则标签将在垂直方向变化大小,以使其与显示的文本相适应,而水平方向的大小不变。但若想使该属性起作用,还必须将Autosize属性设为True。4.Layout该属性 该属性可以改变文本在标签中的位置。5.Transparent该属性 该属性决定标签的背景是否透明。其值为True时,透明,即标签不会挡住它下面的组件。默认值为False。3.2.2Edit组件
Edit组件在Standard标签页中,也称编辑框组件是Windows程序中常用的组件,它主要用于输入单行文字。Edit组件的常用属性有:1.AutoSelect属性
该属性确定当编辑框获得输入焦点时,编辑框中的文字是否自动被选中。2.AutoSize属性该属性确定编辑框是否随字体变化而自动变动尺寸,缺省为True。3.BorderStyle属性该属性确定Edit控件是否有边框。4.CharCase属性该属性设置文本框内字符的大小写,其值为:ecLowerCase,全部转换为小写;ecNormal,不转换;ecUpperCase,全部转换为大写。5.HideSelection属性该属性决定当输入焦点从Tmemo组件移走后,编辑框内原来被选中的文本是否依然保持选中状态。其设置为True,不保持;其值为False,保持。该属性的默认值为True。6.MaxLength属性该属性确定编辑框最多可以输入的字符数,缺省值为0,表示可以输入任意多的字符;如果该属性不为0,只能向编辑框中输入小于或等于设定值的字符数。7.Modified属性该属性确定编辑框中的内容自建立以来或者Modified属性最后一次被设置为False之后是否被修改。8.PasswordChar属性该属性在一些编辑框组件如TMaskEdit、TDBEdit中都有。缺省时该属性为#0,即没有掩码。用户可以自己设置一个掩码,如‘*’,则用户在编辑框中输入的字符都将以‘*’字符显示,而隐藏真实的字符。9.Text属性该属性用于显示和保存编辑框中的内容。10.ReadOnly属性该属性确定程序运行时,用户是否可以改变编辑框中的内容。若为True,表示编辑框是只读的,其内容不可以编辑修改。11.SelLength属性该属性可以返回在编辑框中被选中的文本的长度。12.SelStart该属性该属性确定在编辑框中被选中文本的起始位置(第一个字符的序号为0)。13.SelText属性该属性用来设置或指示选中的文本。
Edit组件的主要方法方法说明Clear使用该方法可以清除文本框中的文本内容。CanFocus该方法用来测试Memo控件是否可以接受焦点。如果其值为False,则控件不能接受焦点;反之可以接受焦点。ClearSelection该方法将删除Memo框中被选中的文本。如果在Memo控件中没有被选择的内容,那么该方法不删除任何东西。CopyToClipboard使用该方法可以将文本框中选中的内容复制到剪切板中。CutToClipboard使用该方法可以将文本框中选中的内容剪切到剪切板中。PasteFromClipboard使用该方法可以将剪切板中的内容粘贴到文本框中。SelectAll使用该方法将选中文本框中的所有内容。
Edit组件常用的几个事件有:OnChange、OnKeyPress、OnEnter事件。Edit组件的常用事件
事件说明OnChange当编辑框中的内容发生变化时,触发该事件,它是Edit中最常用,也是最有用的事件之一。OnKeyPress当按下一个按键时,触发该事件。OnEnter编辑框获得输入焦点时,触发该事件。3.2.3Memo组件Memo组件在Standard标签页中,Memo组件为用户提供了一种处理多行文本的方法,还可用它快速地阅读文件中的数据,而且读取和保存文本的最大长度可达255KB。
Memo组件的属性
Memo组件的属性、方法和事件与Edit组件大致相同。其特有的几个属性有:1.Lines属性按行处理文本。2.ScrollBars属性该属性用来设置备注框是否出现滚动条以及滚动条的种类。3.WordWrap属性该属性用来决定当输入的文本到达右边界时是否插入软回车,以便换到下一行再输入。3.2.3Memo组件Memo组件的方法⑴
使用剪贴板(Clipboard)
Memo组件同Edit组件一样,也可使用CutToClipboard、CopyToClipboard和PastFromClipboar这三种方法,实现将Memo组件中被选择文本剪切或复制到剪贴板上,以及将剪切板上的内容粘贴到Memo组件中。 将Memo中的选中文本剪切到剪贴板的语句如下:
ifMemo1.SelLength>0then Memo1.CutToClipboard;2.文本的添加(Add方法)
利用Lines属性,可以增加、删除一行文本,也可以移动一行文本。下面的代码将文本添加到Memo中的最后一行:
Memo1.Lines.Add(‘在Memo1的最后添加一行文本’);3.文件的保存和装载(LoadFile方法、SaveToFile方法)
Memo1.Lines.LoadFile(Opendialog1.FileName)
可以将Memo组件中的文本保存成文本文件,也可以将文本文件装载到Memo中。这需要配合使用SaveDialog组件和OpenDialog组件。将Memo中的文本保存为文本文件的语句为:
ifSaveDialog1.Executethen//打开保存
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
以上语句先打开保存对话框,然后将Memo中的文本保存对话框到一个文件中,文件名为我们在SaveDialog中输入的文本。在Memo中装载文本文件的语句为:
ifOpendialog1.ExecutethenMemol.Lines.LoadFile(Opendialogl.FileName);
3.2.4MaskEdit组件
MaskEdit组件在Additional标签页中,MaskEdit组件(也称掩码编辑框)是一种特殊的编辑框,它的主要属性是EditMask。使用它
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 7944:2024 EN Optics and photonics - Reference wavelengths
- 客户管理沟通
- 四年级数学几百几十数乘以一位数过关监控试题大全附答案
- 输液反应及护理
- 现代家政学导论模块二家庭与家庭制度
- 项目生命周期社会工作专业教学案例宝典
- 四中国社会工作的发展第一部分社会工作的产生与发展
- 团主题教育实践活动汇报
- 《品牌构造方案》课件
- 大班健康领域活动加
- 运动训练学-运动训练方法与手段
- ESD静电防护检测及管控标准
- 打印版大学生择业效能感量表龙燕梅
- 工程施工现场应急方案
- 人教版小学道德与法治感受生活中的法律教学设计省一等奖
- 【大数据时代个人隐私保护的法律对策6200字(论文)】
- 平行四边形面积的计算课件(共27张PPT)五年级上册数学人教版
- 监理日常安全巡视要点监理日常安全巡视要点
- 法律顾问服务职业发展研究报告
- 展厅设计布展投标方案(完整技术标)
- 静脉中等长度导管临床应用专家共识-
评论
0/150
提交评论