工程选项是另一个容易忽视的特性。因为对于初学者,缺省设置就足够用了。毕竟,当一个人忙于学习一个新编程环境时,哪有时间去关心那些编译器/链接器选项呢?但是,到一定时候,就会开始对这些选项感兴趣,并想知道它们是作什么用的。
下面将讲述工程选项对话框。可从主菜单选择【Project | Options】来调用该对话框。工程选项对话框是一个多页面对话框,它有如下页面:
- Forms
- Application
- Compiler
- Compiler Messages
- Linker
- Directories/Conditionals
- Version Info
- Packages
Note
Project Options对话框每个页面的底部都有一个Default复选框。如果要把当前设置当做新建工程的缺省设置,就要选中“Default”复选框,点击OK,即可将当前设置变成新的缺省设置。
窗体页面(The Forms Page)
Project Options对话框的Forms页面用于控制应用程序处理窗体的方式。如下图:
Forms页面的顶部是“Main from”选择框,此处选择应用程序的主窗体;如果缺省,则把第一个创建的窗体作为主窗体;如果修改了工程,希望另一个窗体称为主窗体,则必须修改这一设置,使新窗体成为应用程序的主窗体。
该对话框的中部是两个列表框,左边的列表框标有“Auto-create forms”,右边标有“Available forms”,在详细介绍这两个列表的用法前,先介绍下窗体的自动创建(Auto-create)。
New Term
自动创建(Auto-create)是指在应用程序启动过程中Delphi创建窗体。
每次创建窗体时,Delphi把所建窗体放到应用程序的自动创建列表中。自动创建窗体比非自动创建窗体显示得快。自动创建窗体的缺点之一是应用程序要占用更大的内存;另一个缺点是当应用程序中有很多自动创建窗体时,装入这个应用程序的时间会增加。
Note
Auto-create forms列表中的第一个窗体总是主窗体。如果要更换主窗体,则新换主窗体会移到Auto-create forms列表框顶部。设定主窗体的另一个方法是将Auto-create forms列表框中任一窗体拖放到列表框的顶部。
自动创建的好处是:显示自动创建窗体很方便,只需调用该窗体的Show或ShowModal函数:
AboutBox.ShowModal;
如果不让Delphi自动创建窗体,我们必须要在使用窗体前负责创建它:
procedure TForm1.Button1Click(Sender: TObject); var About: TAboutBox; begin About := TAboutBox.Create(Application); About.ShowModal; About.Free; end;
这个例子未使用Delphi生成的、指向About框的指针,它创建一个局部指针,显示该窗体,并且当不再需要改窗体时就立刻删除指针。正如Object Pascal编程一样,可采用多种方式来完成这一任务。由于Delphi总要创建指向窗体对象的指针,因此可如下编写前面的代码:
if not Assigned(AboutBox) then AboutBox := TAboutBox.Create(Self); AboutBox.ShowModal;
上面的代码检查窗体是否已经创建,如果没有创建,则创建窗体并调用ShowModal方法。采用何种方法创建窗体由编程人员自己决定,但本人更喜欢前一种方法,因为它所做的任何处理都是在局部进行的。
Note
每当在Form Designer中创建窗体时,Delphi会创建一个指向所建窗体的指针。如果让Delphi自动创建窗体,编程人员就不必去考虑该指针是否有效。如果不选择自动创建窗体,则指向窗体的指针为空,直至显式地创建该窗体并初始化指针。如果在初始化指针之前使用指针,Windows会产生一个错误。
好了,再把注意力集中到Project Options对话框上来。Auto-create forms列表框中列出的是将要自动创建的窗体。如果不希望自动创建某个窗体,可把它从Auto-create forms列表框拖到Available forms列表框中。要一次移动多个窗体,可先选择要移动的多个窗体,然后一起拖放这些窗体。
Note
可使用位于两个列表框之间的按钮来把窗体从一个列表框移到另一个列表框,但是,使用鼠标拖放更方便。
应用程序页面(The Application Page)
Project Options对话框的Application页面非常简单。如下图:
Title字段用于设定应用程序的标题,当应用程序最小化后,它会出现在Windows任务栏上。
Note
应用程序的标题和主窗体的标题是完全不同的两个概念。如果希望在程序最小化后显示程序名,则必须在Project Options对话框中设置应用程序标题。如果不提供应用程序标题,则使用工程文件名作为缺省标题。
Application页面上的Help file字段用于设置应用程序使用的帮助文件。在应用程序运行期间按下F1键,该应用程序就会装入这个帮助文件。如果不记得帮助文件的文件名或所在目录,可使用Browser按钮来查找。若不提供帮助文件,则在应用程序运行时,按下F1键就不会有任何作用。
Icon选项用来为应用程序选择图标。当应用程序运行时以及被最小化时,这个图标就会显示在Windows任务栏中。此外,这个图标还会显示在主窗体的标题栏上,除非显式地设置一个主窗体图标。
Target file extension字段用于指定当工程被编译链接时该工程的文件扩展名。例如,要创建一个屏幕保护程序,则可以将该字段设置为scr,这样,所创建的屏幕保护程序就带有src扩展名了。Control Panel控制面板程序又是一个例子,是以.cpl扩展名保存的。对于普通工程,不必为此字段设置。
编译器页面(The Compiler Page)
Project Options对话框的Compiler页面用于设定编译器编译工程时使用的选项。如下图:
Compiler页面有四个部分,下面分别来介绍:
1、代码生成(Code Generation)
可配置编译器来执行代码优化。如果不选中“Optimization”复选框,则编译器不优化代码;若选中“Optimization”复选框,则编译器就会生成速度最快的代码,而不考虑代码大小。在大多数情况下应使用该选项的缺省设置;但有些时候最好是关闭此选项(如在调试应用程序期间)。
“Record field alignment”选项用于控制记录在内存中对齐的方式。默认设置为8字节边界对齐。
调试程序时应选中“Stack Frames”选项,调试结束后可将它关闭。当“Stack Frames”选项关闭时,编译器生成的代码体积更小,速度更快,但编译时间要稍长一些。
选中“Pentium-Safe FDIV”选项,可使编译器生成检测故障浮点除法指令的代码。
2、语法选项与运行阶段错误(Syntax Options and Runtime Errors)
这两个区域中的选项对编译器生成工程代码有影响。Delphi提供的帮助文件中解释了其中的每一个选项,此处就不再重复了。要显示有关编译器选项的帮助内容,点击“Compiler”页面上的Help按钮或按键盘上的F1键。
3、调试(Debugging)
Project Options对话框的“Compiler”页面的“Debugging”中的选项控制编译器为调试会话声场代码的方式。当选中“Debug information”时,Delphi为工程生成调试信息。如果不生成调试信息,则在调试期间程序不能在断点和检查变量处停住。要调试程序,必须要让Delphi生成调试信息,除此之外,别无他法。
Note
如果改变了Compiler页面上的选项,应立即进行一次编译、链接,这样可保证所有的单元都是用相同的编译器设置进行编译、链接的。
编译提示与警告(Compiler Messages)
该区域中选项用于确定要不要在编译器在编译后报告提示和警告。建议将“Show hints”和“Show warnings”两个选项都选上。不应该忽视提示和警告。
通常,编译器报告的警告性错误可以排除也应该排除,要学会把提示和警告当作错误来对待,高质量的代码编译时是不会有警告信息的。
链接器页面(The Linker Page)
此页面上的选项用户指定链接器的操作方式。如果不是对Delphi特别熟悉,最好不要自己去设置这些选项,接受这些选项的缺省值设置即可。如下图:
1、Map File(映像文件)
“Map File”区中的选项用于控制:是否生成映像文件,以及映像文件包含多少细节内容。
映像文件是一种高级调试工具,在深入学习Delphi之前,很可能不会去用它。因此在此处不对“Map File”选项作详细介绍。
2、EXE and DLL Options
该选项确定Delphi为应用程序工程生成何种类型的可执行文件。当选中“Generate console application”复选框,Delphi生成一个与GUI应用程序相对的控制台应用程序。
“Include TD32 debug info”选项使链接器把调试信息链接到EXE或DLL中。(TD32是指过去的Turbo Debugger的32位版本,TD32是一个高级调试器,Borland C++产品和Delphi的某些版本都带这个调试器)。有些调试工具使用TD32格式的调试信息。当要使用这些TD32格式的调试信息的调试工具时,要选中这个选项。
“Include remote debug symbols”选项生成“remote debugging of Web broker applications”所需的调试符号。
3、Linker Output(链接器输出)
“Linker Output”中的选项确定链接器生成何种类型的编译后二进制文件。通常,链接器生成DCU文件(Delphi的缺省类型)。但是,有时可能希望生成C或C++目标文件(OBJs),而不是DCUs;从而使Pascal单元可用在Borland C++ Builder建立的C或C++程序中。
4、Memory Sizes
普通用户可将“Memory Sizes”中的选项忽略。其缺省值对所有应用程序都是适用的。在某些情况下,比如建立DLL时,可能需要修改Image基地址(Image base address),但需要这样做的时候极少。
5、Description
“EXE Description”字段用于指定一个字符串,这个字符串将要嵌入到应用程序中。这个字段有时也用来将版权信息添加到EXE或DLL中。大多数时候是使用Version Info把版权信息存储到一个文件中。而不是使用本页上的“EXE Description”。在之后的“Version Info”页面将要讲解。
目录/条件页面(The Directories/Conditionals Page)
Project Options对话框的"Directories/Conditionals”页面用于设置使用工程查找库文件的目录。如下:
1、Directories
本区域内的字段用于确定Delphi在编译工程期间查找各种源文件的位置。在编译、链接工程时,编译器和链接器创建的文件存放何处也由其中的字段确定。
- “Output directory”字段指定存放最终可执行文件或DLL的目录。
- “Unit output directory”字段确定存放被编译单元的DCU文件的位置。
- “Search path”字段用于指定附加库(additional libraries)所在的目录,编译、链接工程时需要这些附加库。
- “Debug source path”字段用于指定需要调试而又不在当前工程目录中的源单元路径。例如,要调试一个DLL,就必须在本字段中输入该DLL源代码存放位置路径。
- “BPL output directory”和“DCP output directory”字段指定编译、链接程序包时存放BPL文件和DCP文件的位置。
注意,“Directories/Conditionals”页面上有些字段后面有一个带有省略号“…”的按钮,点击按钮会显示一个编辑器,在编辑器中可以添加、删除和调整排列顺序。如下图,为“Search path”字段的编辑器:
2、Conditionals
该字段,用于指定要在工程层(project level)增加的定义。举个例子,工程中有段代码,仅当符号TRIALRUN被定义时,才编译它。此时把TRIALRUN添加到“Conditional Defines”中,如果要定义多个符号,用分号将符号分隔开。
3、Aliases
“Unit aliases”字段用于指定单元别名。例如,Delphi1中把Windows专用单元叫做WinTypes.pas和WinProcs.pas,而在Delphi2、3、4中把Windows专用单元叫做Windows.pas,用以代替WinTypes.pas和WinProcs.pas。"Unit aliases”字段使用别名WinTypes和WinProcs指向Windows单元。在这种情况下,Delphi1编写的程序不需要修改uses列表就能在Delphi4中编译了。
版本信息页面(The Version Info Page)
“Version Info”页面能设置应用程序的版本信息,版本信息存储到程序的EXE文件、DLL或ActiveX文件中。在安装程序中使用版本信息可以确定系统中安装的文件是新的或旧的。
可以从Windows资源管理器中查看一个文件的版本信息;用鼠标右击该文件,并从快捷菜单中选择“属性”,弹出属性对话框。
“Project Options”对话框的“Version Info”页面如下图:
页面的最头是“Include version information in project”复选框,若选中这个复选框,则版本信息将包括到工程的可执行文件中。若不选中这个复选框,则工程不包括版本信息,并且页面上的其他选项都失效。
“Version Info”页面上的其余字段用于指定版本信息的各项内容。“Major version”、“Minor version”、“Release”和“Build”一起形成文件版本号。上图中显示的是Version 2.0,Build 0。若选中“Auto-increment build number”复选框,则每执行一次编译、链接,build号都会自动加1。
“Module attributes”中的选项用于确定腰围文件指定的专用属性。
“Language”中选项用于为文件选择本地标识(locale identifier)。有关“Locale ID”的各种取值,可以参看Windows API联机帮助。
“Version Info”页面底部的表格用于设定各种信息,这些信息包括公司名称、文件描述、文件内部名、合法版权、产品名称、产品版本及各种注释。可以为这些字段中任何字段提供信息,也可以空着(FileVersion字段的设定要基于Module Version Number中的设置)。甚至可以向表格中添加用户定制的版本信息字段。要添加定制版本信息字段,可点击版本信息表格并用向下箭头滚动到表格末尾,再按下向下箭头,会弹出一个对话框请求输入要添加的版本关键字,输入版本关键字后,该版本关键字就被添加到工程的版本信息中。添加版本信息到工程,再没有比这更简单的了。
程序包页面(The Packages Page)
Packages页面用于确定工程要使用的链接类型。如下图:
页面上部的“Design packages”用于添加删除设计程序包,但它实际上与当前工程毫无关系。与当前工程有关的选项只有“Build with runtime packages”复选框。
当选中“Build with runtime packages”复选框时,应用程序动态连接VCL和任何第三方组件,这意味着可执行文件会小些,但必须传输用到的程序包。若不选中复选框,应用程序使用静态链接。静态链接意味着应用程序用到的VCL代码和第三方组件代码都直接链接到可执行文件中。
以上代码均在Delphi7中测试通过。