Delphi Project 之工程选项Project Options

工程选项是另一个容易忽视的特性。因为对于初学者,缺省设置就足够用了。毕竟,当一个人忙于学习一个新编程环境时,哪有时间去关心那些编译器/链接器选项呢?但是,到一定时候,就会开始对这些选项感兴趣,并想知道它们是作什么用的。

0262

下面将讲述工程选项对话框。可从主菜单选择【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页面用于控制应用程序处理窗体的方式。如下图:

0263

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函数:

1
AboutBox . ShowModal;

如果不让Delphi自动创建窗体,我们必须要在使用窗体前负责创建它:

procedure  TForm1Button1Click(Sender: TObject);
var
   About: TAboutBox;
begin
Create(Application);
About ShowModal;
end ;

这个例子未使用Delphi生成的、指向About框的指针,它创建一个局部指针,显示该窗体,并且当不再需要改窗体时就立刻删除指针。正如Object Pascal编程一样,可采用多种方式来完成这一任务。由于Delphi总要创建指向窗体对象的指针,因此可如下编写前面的代码:

if  not  Assigned(AboutBox) then
AboutBox := TAboutBox Create(Self);
上面的代码检查窗体是否已经创建,如果没有创建,则创建窗体并调用ShowModal方法。采用何种方法创建窗体由编程人员自己决定,但本人更喜欢前一种方法,因为它所做的任何处理都是在局部进行的。

Note

每当在Form Designer中创建窗体时,Delphi会创建一个指向所建窗体的指针。如果让Delphi自动创建窗体,编程人员就不必去考虑该指针是否有效。如果不选择自动创建窗体,则指向窗体的指针为空,直至显式地创建该窗体并初始化指针。如果在初始化指针之前使用指针,Windows会产生一个错误。

好了,再把注意力集中到Project Options对话框上来。Auto-create forms列表框中列出的是将要自动创建的窗体。如果不希望自动创建某个窗体,可把它从Auto-create forms列表框拖到Available forms列表框中。要一次移动多个窗体,可先选择要移动的多个窗体,然后一起拖放这些窗体。

Note

可使用位于两个列表框之间的按钮来把窗体从一个列表框移到另一个列表框,但是,使用鼠标拖放更方便。

应用程序页面(The Application Page)

Project Options对话框的Application页面非常简单。如下图:

image

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页面用于设定编译器编译工程时使用的选项。如下图:

image

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)

image

该区域中选项用于确定要不要在编译器在编译后报告提示和警告。建议将“Show hints”和“Show warnings”两个选项都选上。不应该忽视提示和警告。

通常,编译器报告的警告性错误可以排除也应该排除,要学会把提示和警告当作错误来对待,高质量的代码编译时是不会有警告信息的。

链接器页面(The Linker Page)

此页面上的选项用户指定链接器的操作方式。如果不是对Delphi特别熟悉,最好不要自己去设置这些选项,接受这些选项的缺省值设置即可。如下图:

image

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”页面用于设置使用工程查找库文件的目录。如下:

image

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”字段的编辑器:

image

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”页面如下图:

image

页面的最头是“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页面用于确定工程要使用的链接类型。如下图:

image

页面上部的“Design packages”用于添加删除设计程序包,但它实际上与当前工程毫无关系。与当前工程有关的选项只有“Build with runtime packages”复选框。

当选中“Build with runtime packages”复选框时,应用程序动态连接VCL和任何第三方组件,这意味着可执行文件会小些,但必须传输用到的程序包。若不选中复选框,应用程序使用静态链接。静态链接意味着应用程序用到的VCL代码和第三方组件代码都直接链接到可执行文件中。

以上代码均在Delphi7中测试通过。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。可能是作者故意这样做的?本文最后提供修正后的下载地址。原文如下:一、关于API Hook1.什么是API Hook不知道大家是否还记得,在DO
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。 这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。需要修改mess.pas中代码才行。其实文中提到的一个结构,代码中并没有使用typePIMAGE_IMPORT_DESCRIPTOR = ^IMA
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把部分api 翻译成了dephi版的 记录一下 地址 ffmpegvcl.zip
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:(dst) <--(src) 1.dst和src类型必须匹配,即必须同为字节
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂,比较少用。 2.WinExec主要运行EXE文件。如:WinExec('Notepad.exe Readme.txt', SW_SHOW); 3.ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。 首先必须引用shellapi
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) 参数 类型及说明 lpExistingFileName String,欲移
附带通用控件安装方法: ---------- 基本安装 1、对于单个控件,Componet-->install component..-->PAS或DCU文件-->install; 2、对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可; 3、对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可; 4
type   TRec=Record     msg:string;     pic:TMemoryStream; end; procedure TForm2.BitBtn1Click(Sender: TObject); var   ms:TMemoryStream;   Rec1,Rec2:TRec;   cc:tmemorystream;   jpg:TJPEGImage; begin   R
program Project1; { Types and Structures Definition } type   WNDCLASSEX = packed record     cbSize: LongWord;     style: LongWord;     lpfnWndProc: Pointer;     cbClsExtra: Integer;     cbWndExtra: In
   在Windows大行其道的今天,windows界面程序受到广大用户的欢迎。对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制。有时,对于繁杂 的,或重复性的操作,我们能否通过编制程序来代替手工输入,而用程序来模拟键盘及鼠标的输入呢?答案是肯定的。这主要是通过两个API函数来实现的。      下面以Delphi为例来介绍一下如何实现这两个功能。模拟键盘我们用Keybd_event这个ap
delphi中经常见到以下两种定义 Type TMouseProc = procedure (X,Y:integer); TMouseEvent = procedure (X,Y:integer) of Object; 两者样子差不多但实际意义却不一样, TMouseProc只是单一的函数指针类型; TMouseEvent是对象的函数指针,也就是对象/类的函数/方法 区
Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处:     (1)不用登陆进系统即可运行.     (2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.     笔者在2003年为一公司开发机顶盒项目的时候,曾经写过课件上传和媒体服务,下面就介绍一下如何用Delphi7创建一个Service程序.     运行Delphi7,选
方法一: 1.调试delphi 写的服务程序,有这么一个办法。原来每次都是用attach to process方法,很麻烦。并且按照服务线程的执行线路,可能会停不到想要的断点。笨办法是,在procedure TsvcFrm.ServiceExecute(Sender: TService);中想要下断的语句前加个人定胜天的sleep(20000),但实际上这种办法是主观臆测的。可行,没问题。记得大学
Delphi For iOS开发指南(17):让应用程序禁止竖屏(也就是只显示横屏)     最近好多人问,怎么样让Delphi For iOS开发的应用程序禁止竖屏,也就是想让它一直横屏显示,横屏是好,一行可以放好几个控件,表格的话也可以多显示几列,看起来方便。 只要一句代码就可以让Delphi For iOS开发的应用程序禁止竖屏,如下: Application.FormFactor.Orie
一个比较完整的Inno Setup 安装脚本,增加了对ini文件设置的功能,一个安装包常用的功能都具备了。 [Setup] ; 注: AppId的值为单独标识该应用程序。 ; 不要为其他安装程序使用相同的AppId值。 ; (生成新的GUID,点击 工具|在IDE中生成GUID。) AppId={{A9861883-31C5-4324-BD9A-DC3271EEB675} ;程序名 AppName
在Delphi自带的Indy控件中其实是提供了MD2,MD4,MD5对象的,我们可以直接使用它们来完成MD5的签名算法。而不需要再去找其它的DLL或是Pas了。 在Uses单元中引用 IdHashMessageDigest,IdGlobal, IdHash 单元,再写如下代码即可以达到MD5的实现。 示例代码 procedure TForm1.Button1Click(Sender: TObjec
在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下: 1 2 3 4 5 6 7 8 9 _NOTIFYICONDATAA = record    cbSize: DWORD;    Wnd: HWND;    uID: UINT;    uFlags: UINT;    uCallback
声明: 1. type Name = Existing type; 2. type Name = type Existing type; 3. type Name = (EnumValue1 [=value], EnumValue2 [=value] ...); 4. type Name = Expression1..Expression2; 5. type Name = ^Existing ty