第三章 应用程序的框架和设计.ppt_第1页
第三章 应用程序的框架和设计.ppt_第2页
第三章 应用程序的框架和设计.ppt_第3页
第三章 应用程序的框架和设计.ppt_第4页
第三章 应用程序的框架和设计.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 应用程序的框架和设计,本章内容: 应用程序的基本结构 编译项目文件前的设置 项目文件 项目文件管理与优化 编译并运行项目 项目文件中Application和Screen对象 程序设计中的常用基本技巧,3.1 应用程序的基本结构,利用Delphi开发的应用程序从宏观上可分为三个层次,即项目文件、主单元文件和功能模块文件 。 项目文件是应用程序的主程序文件,它主要完成应用程序初始化及各种应用程序模块的管理工作。 主单元文件是用于控制应用系统操作的有窗体的单元文件,在项目文件中,主单元是由Application对象的Run过程调用执行的。 功能模块文件是能独立完成某项功能的程序,它一般由主单

2、元通过菜单调用来执行,功能模块通常是有窗体的单元文件或数据模块文件。,应用程序基本构成图示,3.2 开发应用程序前的系统设置,设置自动保存程序代码功能 执行菜单ToolsEnvironment Options,自动保存设置,设置自动保存程序代码功能,若选中Editor files,则表示当编译应用程序时,Delphi将自动保存当前正在编辑的程序文件。 若选中Project Desktop,则表示当编译应用程序时,Delphi自动保存当前项目的桌面信息(一旦保存了桌面信息,当下次启动Delphi时,系统会自动回到保存的桌面状态)。,2. 设置使用撤消操作,执行菜单ToolsEditor Opti

3、ons,设置处,3. 设置使用开发包,使用外来组件包需要如下2个步骤: (1) 安装组件包; (2) 设置组件包的搜索路径。 (1)安装组件 有两种方法,一种是安装未编译的组件包(即有源程序代码的包),另一种是安装已编译组件包。,1)未编译组件包的安装,首先打开要安装包的项目文件(扩展名为.dpk),则显示类似如右图所示的窗口(若系统没有出现此窗口,可单击菜单ProjectView Source,然后再按F12功能键),单击右图中的“Install”按钮即完成组件包的安装。,安装 按钮,2)已编译组件包的安装,由于未编译组件包不提供源代码,其安装方法为:ComponentInstall Pac

4、kages,则出现如下左侧图所示对话框,单击“ADD”按钮,选择要安装包.bpl文件,再按“打开”按钮即可。,单击,确认,(2) 设置组件包的搜索路径,单击菜单ToolsEnvironment Options,选择 “Library”页,并按下图操作。,加入,选择包所在路径,选择包所在文件夹,3.3 项目文件,项目文件是应用系统的主控文件,它的扩展名是dpr。 本节主要内容: 项目文件的建立 结构 加入或移出单元文件 设置,3.3.1 建立项目文件,方法: FileNewApplication,则建立一个名为Project1.dpr新项目文件.,3.3.2 项目文件的组成结构,查看项目文件内容

5、可使用ProjectView Source菜单。 项目文件内容主要有三大部分组成: 声明项目名部分、说明部分和执行部分。 (1) 声明部分 格式:program 项目名; 用于说明项目文件名,可通过File - save as菜单修改。,(2)说明部分,用于说明项目文件可引用的单元、资源文件及定义项目文件中使用的类型、常量、变量、过程或函数等。 除定义变量、过程或函数定义外,常用的格式语句:uses语句和资源引用语句 uses语句 单元名 in 文件名 窗体名 读取资源语句 $R *.RES 注意:这里的*表示与项目名重名。 资源文件一般存放应用程序使用图标、图片等数据 。,(3) 执行部分,

6、执行部分是项目文件中Begin.End之间的部分,它是应用程序启动时首先要执行的程序代码。本部分主要有三种语句: 1) 初始化应用程序语句:Application.Initialize; 2) 窗体对象实例化语句,格式为: Application.CreateForm(窗体类名,窗体名); 例如:Application.CreateForm(TForm1, Form1); 上格式语句可以有多个,Delphi系统将第一个使用CreateForm语句建立的窗体默认为应用程序的主窗体。 3)执行主窗体对应的程序:Aplication.Run; 上语句不仅显示主窗体,同时它负责当主窗体关闭时,退出应用

7、程序并返回到操作系统。 注意:项目文件一般是由系统自动维护的,除非特别需要,一般不修改其中的代码。,3.3.3 将单元文件加入或移出项目文件,用于应用系统的模块程序(单元文件)组合到项目中 加入移出单元文件步骤: 打开项目文件 执行FileOpen菜单,找到要打开的项目文件名(.dpr)并打开。 向项目文件中加入单元: 执行ProjectAdd to Project菜单,则出现一个对话框,在对话框中查找并选择你要加入的单元文件,最后再单击“打开”按钮。 注意:加入到项目文件中的单元,在项目文件中将以“单元名 in 文件名 窗体名”的格式出现在Uses语句中。,从项目文件中移出单元文件: 单击P

8、rojectRemove from Project菜单 注意: (1)没有任何单元文件的项目文件将编译成一个无任何功能应用程序。 (2)加入或移出单元文件还可通过使用工具栏上的快捷按钮来完成,如图所示。,加入 单元,移出 单元,3.3.4 设置项目编译环境,主要用于解决内存不够、文件存储等问题。 单击ProjectOptions菜单可进入项目编译环境设置对话框,设置方法如下: 设置窗体 通常情况下,除主窗体外,其余窗体应设置成可用窗体,设置方法是: 首先,在项目编译环境设置对话框上选择Forms页; 其次,在“Auto create forms”子窗口中选择窗体名后单击“”按钮,使其转移到“A

9、vialable forms”子窗口中,这样就使自动创建窗体变成可用窗体。 注意:主窗体必须是自动创建窗体。,设置主窗体,自动创建窗体,可用 窗体,设置应用程序 在项目编译环境设置对话框中选择“Application”页(如图所示),在此口主要做如下四个设置: 标题(Title) 它应用程序最小化时在任务栏上显示的标题,其最大长度为255个字符。 帮助文件(Help file) 用于设置当激活帮助时,应用程序自动调用的帮助文件。 图标(Icon) 用于设置应用程序在程序管理器中或当程序被最小化时显示的图标。 目标文件扩展名(Target file extension) 用于设置编译生成的可执行

10、文件的扩展名。,标题 设置,帮助 设置,修改 图标,设置 扩展名,3. 设置是否使用运行期包,应用程序可使用两种类型的包文件,一种包是设计期包,另一种是运行期包。应用程序使用的哪种组件包可通过项目编译环境设置对话框来设置,设置方法如下: 打开项目编译环境设置对话框,选择Packages页,则显示如图所示的对话框,若选中Build with Runtime packages 复选框,则说明当前项目文件在编译时将使用运行期包,否则,使用设计期包。 注意:若设置对话框中的Default检查框,则将当前设置作为以后新建项目的默认值。,设置否是使用运行期包,4.设置项目文件存放路径。,作为开发应用项目的

11、程序员,肯定需要编写大量的应用程序,为防止多种应用项目文件因存放而产生的混乱,合理分配每个应用程序的存放路径将显得非常重要。设置项目文件的存放位置可通过项目文件设置对话框来完成,如右图:,输出 目录,单元输出目录,搜索 目录,设置路径(Directories),下面是几个常用的设置 输出路径(Output directory) 用于设置Delphi编译生成的可执行文件(exe)的存放路径。 单元输出路径(Unit output directory) 用于设置单元编译后生成的文件(.dcu文件)的存放路径。 搜索路径(Search path) 用于指定编译器的搜索路径,3.3.5 项目中常用的文

12、件,单元文件 单元文件主要分为窗体单元文件、组件单元文件和通用单元文件三种类型: 窗体单元文件 窗体单元文件具有窗体的单元,实际还可分为窗体单元文件(Form)、框架单元文件(Frame)和数据模块单元文件(DataModule),后面如没有特别说明,窗体单元文件都是指的Form单元文件 组件单元文件 组件单元文件是创建新组件时建立的单元文件,有些组件单元文件有窗体,有些则没有对应的窗体。 通用单元文件 通用单元文件主要用于定义应用程序所有单元均可使用的数据类型、变量、过程、类等。,2. 窗体文件,窗体文件是单元文件的伴随文件,用于快速开发应用程序与用户进行信息交互的界面,窗体文件的扩展名为d

13、fm。 建立窗体文件的方法: 执行菜单:FileNewForm 在默认情况下,我们看到的窗体文件只是一个窗体。 按F12功能键可实现窗体与其对应单元代码编辑窗口的互换,本节要讲的内容,项目文件中使用的文件 资源文件、项目选项和桌面设置文件、备份文件、包文件 项目文件的管理与优化 编译并运行项目 项目中的Application对象,3. 资源文件,目的:用于存放应用程序的图标、图片和版本等信息。 使用资源文件方法: $R *.res 此语句常用于读取资源文件。其中,*表示与当前单元或项目文件重名。 建立资源文件方法:使用ToolsImage Editor菜单,右击,右击,4. 项目选项和桌面设置

14、文件,目的:保存项目或桌面设置。 项目选项文件的扩展名为dof ,它存储的是通过ProjectOptions菜单设置的选项。 桌面设置文件的扩展名为dsk,它存储的是通过ToolsOptions菜单设置的桌面选项。,5. 备份文件,备份文件是恢复误操作而准备的文件。 备份文件名与原文件重名,扩展名前加“”符号。 例如: 项目文件 dpr 单元 pas 窗体文件 dfm,设置保留备份,设置系统自动保留备份文件: Tools-Editor Options- Display,6. 包文件,作用:类似于动态链接库,保存可被其它程序调用的程序代码。 文件扩展名: dpk (Delphi package的

15、缩写),此文件编译时可生成两种文件: (1)扩展名是.dcp文件,它一种中间文件。 (2)扩展名是.bpl文件,它是能被程序使用的最终文件。,3.4 项目文件的管理与优化,常用的方法: 一个项目独占一个文件夹 可避免不同项目中同名文件的相互覆盖。 共享单元放在一个文件夹 可提高单元文件的利用效率。,3.5 编译并运行项目,编译的目的是将项目文件转化为可执行文件。 有两种编译项目文件的方法: (1)Compile 编译:用于编译做过修改的源程序。 (2)Build编译:对项目中的所有文件重新编译。 使用方法:Project - Compile 或 Build 运行编译后的文件: Run- Run

16、 (F9 编译并运行项目文件) 另外还有F7、 F8、 F4。,3.6 项目中的Application对象,为加快程序开发,在任何有窗体的项目中,系统自动定义了一个名为Application的对象,以便用其完成某些独特的功能。 本节讲解Application对象如下内容: 属性及应用 方法及应用 事件及应用,1. 属性及应用,Application对象有较多的属性,常用属性见下表:,属性名 含义 Active判断当前应用程序是否具有焦点。 ExeName返回应用程序所在文件名(含路径)。 Hint用于保存组件的提示信息。注意,当鼠标移动到某个组件上时,则组件的Hint属性值就被赋到此属性中。

17、Icon用于设置应用程序在任务栏上显示的图标。 MainForm返回当前应用程序的主窗体对象。 ShowHint设置是否显示应用程序的提示信息。 Title应用程序任务栏上显示的标题。,常使用ExeName属性取应用程序所在的路径名 例如: Label3.caption:= ExtractFilePath(Application.ExeName) ; 其中: ExtractFilePath函数用于返回字符串中的路径名。 另外,ExtractFileName返回字符串中的文件名。这两个函数用处很大,制作自动安装软件时要用到它。,2. Application对象的方法,在项目文件中常使用的方法 I

18、nitialize CreateForm Run 上述三种方法3.3.2节已经使用过,它们的作用分别是初始化应用程序、创建窗体和运行应用程序。 使用格式如下: Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run;,4. ProcessMessages方法,ProcessMessages用于从Windows消息队列中检索任何等待处理的消息并进行处理. 下面看一段代码: while J 64000 do begin Y := Random(J); Inc(J); Application.Pro

19、cessMessages; end; 若没有Application.ProcessMessages方法,则循环程序执行结束前不会响应用户的其它请求。,MessageBox方法 用于打开一个标准的Windows提示信息框。具体使用方法参见第5章提示信息窗口一节。 例如: if Application.MessageBox(提示信息,标题, MB_OKCANCEL)=idok then ShowMessage(ss); Minimize方法 用于把应用程序的主窗口最小化。 Restore方法 用于把应用程序的恢复主窗口显示状态。,3. Application对象的事件,Application有较多

20、的事件,Delphi专门为它提供了一个事件组件,如图所示。,事件 列表,Application较常用的事件列表如下:,事件 描述 OnActivate 当应用程序被激活时,将触发这个事件。 OnDeativate 当应用程序被挂起或切换到其它应用程序时将触发这个事件。 OnException当一个未处理的异常发生时,将触发这个事件。 OnHelp当用户请求帮助的时候将触发这个事件。 OnMessage当应用程序接收到一个消息时将触发这个事件。 OnHint当鼠标指向某个组件时将触发这个事件。 OnIdle当应用程序进入空闲状态时将触发这个事件。常使用此事件编写动画游戏。,例1:利用Applic

21、ation组件设计应用程序,要求在主窗体的Stutasbar组件中显示鼠标所指组件的提示信息。,提示: 在Application组件的Onhint 事件中加入下代码: Statusbar1.SimpleText := Application.Hint;,本次要讲内容,项目中的Screen对象 常用程序设计技巧 使用资源文件 修改屏幕分辨率 避免程序重复运行 设置程序运行权限 显示封面 重新启动与退出,3.7 项目中的Screen对象,Forms标准单元中定义的,其常用属性如下表,3.8 程序设计中的常用基本技巧,本节主要内容: 使用资源文件 修改屏幕分辨率 避免应用程序重复启动 设置应用程序启

22、动权限 显示封面 重启或退出Windows,1. 使用资源文件,使用资源文件(.res)就是使用资源文件中存放的位图、图标、光标等数据。 使用资源文件前提条件: 使用语句:$R 资源文件名.res。 资源名中的字母必须大写。 注意:若在程序计期修改了资源文件,请使用ProjectBuild All Projects重新编译后再执行程序。,读取资源的常用方法: 取图片格式:image1.Picture.Bitmap. LoadFromResourceName(hInstance, 图片名); 取图标格式: Application.Icon.Handle:=LoadIcon(hInstance,

23、图标名称); 其中hInstance表示包含资源文件的当前应用程序对象。 取光标格式: Screen.CursonsX:=Loadcursor(hInstance,光标名); Screen.Cursor :=X; 其中:X为正整数,因为默认光标取0到-22(即从crDefault到crSizeAll),2.修改屏幕分辨率,使用Windows API两个函数完成此功能,分别为: (1) 获取显示模式数据函数 定义格式: EnumDisplaySettings(lpDName, iMNum, lpDMode) 功能:获取指定的显示模式数据,若显示模式不存在,则返 回值为0(False)。 其中:l

24、pDName:一般设置为Nil。 iMNum :用于指定显示模式号。 lpDMode :是TDevMode类型的指针变量,用于保 存获取的显示模式数据。,Var DevModeArray: TList; /显示模式信息结构列表 var DevModeCount: Integer; /显示模式的个数 DevModeInfo: TDevMode; /定义一个指向显示模式的指针 begin DevModeArray := TList.Create; /创建列表对象 DevModeCount := 0; GetMem(DevModeInfo, SizeOf(TDevMode); /分配内存 枚举显示模

25、式,并将获取的属性值其保存在到DevModeInfo 变量中 while EnumDisplaySettings(NIL, DevModeCount, DevModeInfo) do begin DevModeArray.Add(DevModeInfo); /将屏幕信息保存 Inc(DevModeCount); /屏幕自信保存到ListBox1列表组件中 ListBox1.Items.Add(IntToStr(DevModeInfo.dmPelsWidth)+ IntToStr(DevModeInfo.dmPelsHeight)+, + IntToStr(Trunc(IntPower(2,De

26、vModeInfo.dmBitsPerPel)+ colors); GetMem(DevModeInfo, SizeOf(TDevMode); /分配内存 end; FreeMem(DevModeInfo, SizeOf(TDevMode); / 释放分配的内存 ListBox1.ItemIndex := 0; end;,(2) 设置屏幕的显示方式函数 定义格式: ChangeDisplaySettings(lpDevMode,dwflags) 功能:按指定模式修改显示器的分辨率。 其中: 1)lpDevMode是显示模式数据的TDevMode类型指针变量。 2)dwflags常使用CDS_U

27、PDATEREGISTRY,表示修改显示模式后,同时修改注册表。 3)函数返回值:当返回DISP_CHANGE_SUCCESSFUL时表示修改成功,当返回DISP_CHANGE_RESTART,则表示重启操作系统后才能使设置起作用。,部分程序代码: Var ModeChange: Longint; begin 更改显示模式,并修改注册表 ModeChange:=ChangeDisplaySettings(模式指针变量, CDS_UPDATEREGISTRY); if ModeChange=DISP_CHANGE_SUCCESSFUL then ShowMessage(动态改变屏幕分辨率成功)

28、else if ModeChange=DISP_CHANGE_RESTART then ShowMessage(需要重新起动才能使设置起作用); end;,3.8.3 避免应用程序重复启动,由于Windows是一个多任务的操作系统,因此可时运行同一程序的多个实例,但有时为了数据安全,要求应用程序只能运行一个实例。 主要有两种方法: 1. “查找窗口”法; 2. “创建互斥对象” 。,1. 查找窗口法,工作原理: 应用程序运行前使用FindWindow函数首先查找当前操作系统中是否加裁主窗体,如果有则不启动。 FindWindow函数使用格式: FindWindow(类名,窗体标题名); 其中:

29、“类名”表示表示查找窗体所属的类。 例如:将项目文件修改为如下格式: Var Hwnd:Thandle; begin Hwnd:=FindWindow(TForm1,Main); /查找主窗体 If Hwnd=nil then /如果没找到应用程序的主窗体则启动应用程序 Begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; end运行,2. 使用互斥对象,本方法是在应用程序中通过CreateMutex函数创建互斥对象,若创建不成功,则说明系统已经启动,则系统不再启动。

30、 使用格式: CreateMutex(lpMA, bIO, lpName) 功能:创建互斥对象。 其中: 参数lpMA是一个指向安全属性的指针,一般使用空指针nil,表示使用默认安全属性。 参数bIO表示互斥对象是否指定初始所有者,一般默认为True。 参数lpName用于设置要创建的互斥对象名。,项目文件中的部分代码: VAR Mutex:THandle; begin Mutex:=CreateMutex(NIL,True,Form1); /判断创建互斥对象是否成功 IF GetLastErrorERROR_ALREADY_EXISTS THEN BEGIN Application.Init

31、ialize; Application.CreateForm(TForm1, Form1); Application.Run; end; ReleaseMutex(Mutex); end.,4. 设置应用程序启动权限,通过项目文件中加入判断进入权限的代码,解决户身份的验证问题。 分析:由于应用程序运行是通过Application的Initialize、Createform、和Run三个过程实现的,因此在执行这丰类过程前加入判别用户权限的指令,若符合要求则启动,否则退出系统。程序基本格式如下: 输入口令 - Password if 系统口令=Password then begin 执行启动程序代

32、码; end else 退出系统;,请看 Initialize.dpr 的源程序实例: program Initialize; uses Forms, Dialogs, ChangeScreen in ChangeScreen.pas Form1; var Password: String; $R *.res begin if InPutQuery(登录口令,输入口令,password) then begin if password= Screen then /判断登录口令 begin Application.Initialize; Application.CreateForm(TForm1, Form1); Appl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论