DELPHI定义的条件编译的全部说明

合集下载

delphi类,自定义类的大体描述

delphi类,自定义类的大体描述

delphi类,自定义类的大体描述在Object Pascal中,定义类使用保留字class。

下面是类类型定义的语法格式: type<类型名>=class[(<基类型名称>)]<类成员列表>end;其中,选择使用基类型名称可以指出类的直接祖先类,类类型可以指定一个祖先类型,表示该类型是从这个指定的祖先类型继承下来的。

在Delphi中,如果不指明基类,则默认的父类为TObject类,也就是直接从TObject类派生出一个新类。

TObject类是在System单元中定义的。

例如,下面定义一个Student类:typestudent=classname:String[8];number:Integer;sex:(male,female);age:Integer;end;注意:与其他数据类型不同的是,类类型的定义只能出现在Program单元或Unit 单元最外层作用域的类型定义部分,而不能定义在变量说明部分或一个过程或函数内。

因此,类类型的作用域总是全局的。

2.类的字段可以看出,类型定义和记录类型定义很相似,但类类型可以有3类成员:字段、方法和属性。

类类型中的字段(field)也就是类的数据部分,其定义语法与记录中字段的定义语法相同,字段的类型可以是各种数据类型,甚至是另一个类类型。

上例中只定义了组成student类的4个字段。

3.类的方法方法(method)是在一个对象上执行指定操作的过程或函数。

方法的操作范围只能是对象内部的数据或对象可以访问的数据。

在类类型中声明的方法实际上是向前的定义,即在类定义中只定义方法的原型,而在程序的Implementation区进行对该方法的具体定义。

在定义方法时,可以直接使用类中已定义的字段,且访问时不需要引用限定符。

在调用方法时,Object Pascal隐含传递了一个参数Self,这个参数是一个指向输出方法的对象实例的指针,相当于C++里的This指针。

Delphi程序设计教程 第12章 编译调试应用程序

Delphi程序设计教程 第12章 编译调试应用程序

若编制的应用程序没有错误,程序的运行结果就 出现在屏幕上,可对其进行操作。若在编译的过程中 出现错误,则代码编辑器将光标放在包含出错位置的 行上,并在代码编辑器下方的框中显示错误的代码及 错误信息,如图12-2所示。 若错误可直接看出来,就可直接进行修改,然后 重新编译运行程序;若难于找出错误,就需要对程序 进行调试。 12.2.2 为应用程序提供运行参数 选择Run|Parameters命令,可打开运行参数对话 框,如图12-3所示。
(程序中的可执行行)。断点如图12-2所示。
12.1.3 监视 监视表达式可在单步或跟踪程序代码时,跟踪变 量或表达式的值。可以使用监视列表窗口查看当前设 置的监视表达式。 在单步调试程序时,监视表达式中的任何变量更 新时,监视表达式的值就发生变化;当程序的执行点 移动到变量没有定义的地方,则整个监视表达式的值 就是不确定的;当执行点又回到监视表达式可计算的 执行点时,则监视列表窗口中又显示出当前监视表达 式的值。 输入监视表达式后,使用监视列表窗口可以显示 当前表达式的值。
5. 暂停程序的执行 选择Run|Program Pause可以暂停程序的运行。 这时调试器暂停程序的执行,并将执行点放在要 执行代码的下一行。这时可以检查该位置上程序的状 态,然后继续执行或进行调试。 若程序在执行中,但不能返回到调试器中,可以
按Ctrl+Alt+Sys停止程序的运行(可能需要数次)。
5. 查找断点 断点设置后,在代码编辑器中是可见的(如图122所示)。若在代码编辑器中不可见的,则可以在断点 列表窗口中快速地查找断点。 在断点列表窗口的断点右单击,在出现的快捷菜 单上选择View Source命令,则代码编辑器就迅速地滚 动到该断点上(断点窗口仍保持激活);若选择Edit Source命令,则代码编辑器就迅速地滚动到该断点上, 并激活代码编辑器,可对程序进行编辑。

Delphi命名规范

Delphi命名规范

Delphi编程规范Delphi编程规范目录1 通用代码风格 (3)2 编程的规则 (4)3 函数与过程 (7)3.1 通用规范 (7)3.2 命名 (8)3.3 参数 (8)3.4 变量 (9)3.5 类型 (11)3.6 语句 (12)3.7 注释 (14)3.8 异常处理 (15)3.9 断言 (16)3.10 面向对象类 (17)4 文件 (18)5 控件(Components) (22)附录标准控件前缀 (23)Delphi编程规范1 通用代码风格一般来说,任何编程风格的目标都是清晰易懂,编码清晰化中最关键的一条就是保持一致性,无论使用什么风格,都要保证在整个项目中始终如一。

【规则1-1】代码的每级缩进为2个空格,由于制表符在不同的编辑器中的间隔不同,因此禁止在源代码中保存Tab制表符。

【规则1-2】行应当限制在80列以内。

超过80列的行应当被分成多个连续的行。

所有的后续行应当排列在该声明的第一行之后,并且缩进两个字符的空格。

说明:一般源代码每行的字符数不得超过80,除非只剩下一个单词。

如一行源代码超过了80个字符,可在逗号和操作符后面开始换行,并相对第一行缩进2个空格。

正例:function CreateWindowEx(dwExStyle: DWORD;lpClassName: PChar; lpWindowName: PChar;dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;hWndParent: HWND; hMenu: HMENU; hInstance: HINST;lpParam: Pointer): HWND; stdcall;【规则1-3】各词法单位之间使用空格以增强程序的可读性。

说明:如a:=b应写成a := b【规则1-4】不同逻辑程序块之间要使用空行分隔。

说明:空行起着分隔程序段落的作用。

适当的空行可以使程序的布局更加清晰。

Delphi语言参考手册(4.0)

Delphi语言参考手册(4.0)

8.1 窗体Form6.1.1给MDI主窗口加背景在MDI程序中,由于MDI的主窗口一般的功能是提供子窗口显示的位置和提供菜单、工具条、状态条等,而窗口的客户区则一般不会有其它的用途,如果在这里画上一些软件的标志、公司的标志或者其它的背景图案的话,不仅可以使MDI的主窗口更加充实、美观,而且还可以更加突出公司的形象和增加公司标志在客户心中的地位。

由于MDI主窗口的特性,使用普通OnPaint和使用TImage等方法都不会产生作用。

下面将用编写一个简单的MDI程序来介绍如何实现。

第一步:打开Delphi(Delphi 1,2,3都可以),创建一个新的工程。

第二步:将Form1的FormStyle设置为fsMDIForm,设置成MDI的主窗口。

第三步:在Form1上增加一个Image元件,并选择要设置的背景到Image的Picture中。

第四步:在Form1的Private中定义:FClientInstance,FPrevClientProc : TFarProc;PROCEDURE ClientWndProc(V AR Message: TMessage);第五步:在实现(implementation)中加入上述过程的具体内容:PROCEDURE TForm1.ClientWndProc(V AR Message: TMessage);V ARMyDC : hDC;Ro, Co : Word;beginwith Message docase Msg ofWM_ERASEBKGND:beginMyDC := TWMEraseBkGnd(Message).DC;FOR Ro := 0 TO ClientHeight DIV Image1.Picture.Height DOFOR Co := 0 TO ClientWIDTH DIV Image1.Picture.Width DOBitBlt(MyDC, Co*Image1.Picture.Width, Ro*Image1.Picture.Height,Image1.Picture.Width, Image1.Picture.Height,Image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);Result := 1;end;elseResult := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam,lParam);end;第六步:在Form1的创建事件中加入:FClientInstance := MakeObjectInstance(ClientWndProc);FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));上面的步骤已经完成了MDI主窗口背景图案的设置,下面可以增加一个MDIChild窗口,实现MDI程序。

Delphi 第5章过程和函数解析

Delphi  第5章过程和函数解析
result := a + b; end;
第十页,编辑于星期五:十七点 四十五分。
重载过程或函数使用默认参数可能会导致二义性错误。 如:
function f1(a:integer; b:integer=10); overload; begin
result := a + b; end; function f1(a:integer):overload; begin
过程和函数的区别主要在于过程本身没有返回值,而函 数有一个返回值。另外,在定义过程时使用保留字 procedure,而定义函数使用保留字function。
第一页,编辑于星期五:十七点 四十五分。
一、过程和函数的声明
1. 过程声明 procedure 过程名(参数表); <局部声明部分> begin
需在冒号之后声明函数返回数据类型。局部声明部分 与过程的局部声明部分类似。 函数名本身作为一个特殊的变量,与系统预先定义的变 量Result一样,可在函数体中接受赋值,用来存储函 数返回值。
第三页,编辑于星期五:十七点 四十五分。
过程和函数首部中声明的参数称为形式参数,简称形参。 形式参数,以及过程和函数局部声明的各种标识符(如 常量、数据类型、变量、过程、函数等)均为局部的, 即它们的作用范围只在该过程或函数中,在局部范围内 有效。全局标识符是在主程序中定义的,其作用范围在 主程序和子程序。由于任一被调用的子程序中可以随意 地访问全局变量,全局变量的数据缺乏可靠和安全,因 此,应尽量避免在子程序中直接访问全局变量,而是通 过参数来传递外部数据,进行间接访问。
第四页,编辑于星期五:十七点 四十五分。
二、过程和函数调用
如同标准过程和函数的调用一样,程序中可以 调用自定义的过程和函数。过程调用的形式是以 其作为一条单独的语句。

delphi ifdef的用法

delphi ifdef的用法

delphi ifdef的用法题目:Delphi中括号条件编译指令(IFDEF)的用法引言:在Delphi编程语言中,作为一种过程化编程语言,通常需要针对不同的平台或版本进行软件的开发。

但是,不同的平台可能需要不同的代码或者代码选项,这就需要一种机制来根据条件来编译特定的代码段。

这时候,Delphi提供了一个非常有用的条件编译指令IFDEF。

本文将一步一步介绍Delphi中括号条件编译指令IFDEF的用法。

一、什么是IFDEF?IFDEF是一个用于在Delphi中根据条件编译代码块的指令。

它可以判断给定的符号(Symbol)是否被定义,如果被定义,则会编译指定的代码块,否则会跳过这段代码。

通过IFDEF指令,我们可以根据不同的条件来编译不同的代码,从而实现在不同平台或版本中使用不同的代码逻辑。

二、IFDEF的基本语法IFDEF指令的基本语法如下所示:{IFDEF Symbol}编译这里的代码块{ELSE}编译这里的代码块{ENDIF}其中,Symbol是我们自定义的符号,可以是预定义的符号,也可以是我们自己在代码中定义的符号。

如果Symbol被定义了,那么就会编译第一个代码块;否则,会编译第二个代码块。

三、IFDEF的实际应用1. 平台相关代码的编译在实际开发中,通常需要针对不同的平台编写不同的代码。

以Windows和Mac 为例,我们可以在不同的代码块中编写与平台相关的代码逻辑,如下所示:{IFDEF MSWINDOWS}Windows平台相关代码{ENDIF}{IFDEF MACOS}MacOS平台相关代码{ENDIF}通过IFDEF指令,我们只需要在编译时定义对应的符号(如MSWINDOWS或MACOS),就可以只编译对应平台的代码块,从而使得程序更加灵活和高效。

2. 不同版本代码的编译除了根据不同的平台来编译代码外,IFDEF指令还可以根据不同的版本来编译代码。

以Delphi 10.4版本为例,我们可以利用IFDEF指令实现在不同版本下使用不同的代码逻辑,如下所示:{IFDEF VER340}Delphi 10.4版本相关代码{ENDIF}通过IFDEF指令,我们可以根据不同版本的Delphi来编译相应版本的代码,以适应不同的开发环境和需求。

Delphi代码编写标准详解

Delphi代码编写标准详解

Delphi编写标准指南一、序言二、通用源代码格式规则2.1 缩格2.2 页边空格2.3 Begin...End 配对三、Object Pascal3.1 括号3.2 保留字和关键字3.3 过程和函数(例程)3.3.1 命名/格式化3.3.2 形式参数3.3.2.1 格式化3.3.2.2 命名3.3.2.3 参数的排序3.3.2.4 常量参数3.3.2.5 名称的冲突3.4 变量3.4.1 变量的命名和格式3.4.2 局部变量3.4.3 全局变量的使用3.5 类型3.5.1 大写约定3.5.1.1 浮点指针类型3.5.1.2 枚举类型3.5.1.3 变数和ole变数类型3.5.2 结构类型3.5.2.1 数组类型3.5.2.2 记录类型3.6 语句3.6.1 if 语句3.6.2 case 语句3.6.2.1 一般性话题3.6.2.2 格式3.6.3 while 语句3.6.4 for 语句3.6.5 repeat 语句3.6.6 with 语句3.6.6.1 一般话题3.6.6.2 格式3.7 结构异常处理3.7.1 一般话题3.7.2 try...finally的使用3.7.3 try...except的使用3.7.4 try...except...else的使用3.8 类类型3.8.1 命名和格式3.8.2 域3.8.2.1 命名/格式3.8.2.2 可视化3.8.3 方法3.8.3.1 命名/格式3.8.3.2 使用静态的方法3.8.3.3 使用虚拟/动态的方法3.8.3.4 使用抽象的方法3.8.3.5 属性存取方法3.8.4 属性3.8.4.1 命名/格式3.8.4.2 使用存取的方法四、文件4.1 工程文件4.1.1 命名4.2 窗体文件4.2.1 命名4.3 数据模板文件4.3.1 命名4.4 远端数据模板文件4.4.1 命名4.5 Unit文件4.5.1 通用Unit结构4.5.1.1 unit的名字4.5.1.2 uses子句4.5.1.3 interface部分4.5.1.4 implementation部分4.5.1.5 initialization部分4.5.1.6 finalization部分4.5.2 窗体单元4.5.2.1 命名4.5.3 数据模板单元4.5.3.1 命名4.5.4 一般目的单元4.5.4.1 命名4.5.5 构件单元4.5.5.1 命名4.6 文件头五、窗体和数据模板5.1 窗体5.1.1 窗体类型命名标准5.1.2 窗体实例命名标准5.1.3 自动创建窗体5.1.4 模式窗体实例化函数5.2 数据模板5.2.1 数据模板命名标准5.2.2 数据模板实例命名标准六、包6.1 使用运行包和设计包的比较6.2 文件命名标准七、构件7.1 用户自定义构件7.2 构件单元7.3 使用注册单元7.4 构件实例命名约定7.5 构件的前缀7.6 Standard页7.7 Additional页7.8 Win32页7.9 System页7.10 Internet页7.11 Data Access页7.12 Data Controls页7.13 Decision Cube页7.14 QReport页7.15 Dialogs页7.16 Win3.1页7.17 Samples页7.18 ActiveX页7.19 Midas页一、序言本文档详述了在Delphi 4开发者指南下进行编程的代码编写标准。

Delphi7.0 预编译指令说明

Delphi7.0 预编译指令说明

Extended Syntax: 扩展语法开关。他能允许或禁止Delphi的扩展语法。对于函数调用和Null结束字符串的使用规定。
缺省:{$X+}{$EXTENDEDSYNTAX ON}
注:向后兼容,已不使用。
Typed @ Operator: 类型化的@运算符检查。应用于局部的变量引用上,控制@运算符返回的指针值类型。@(等价于Addr)是否得到有类型指针
如果{$H+}或{$LONGSTRINGS ON},string类型为AnsiString,长度>255。
如果{$H-}或{$LONGSTRINGS OFF},string类型为ShortString,长度<=255。
缺省:{$H+}{$LONGSTRINGS ON}
Assignable Typed Constants: 可分配类型常量,是否可以修改有类型常量的值。用于向下与Delphi 1.0兼容。
I := 2;
end;
如果{$O-}或{$OPTIMIZATION OFF},如下
var
I: Integer;
begin
I := 1; //被编译,也就是说调试的时候,这行有断点
I := 2;
end;
缺省:{$O+}{$OPTIMIZATION ON}
Stack frames: Windows 堆栈帧。其作用域是局部的,他使编译器成为远端过程和函数生成特定的开头和
结尾代码。这个指令用于Windows 3.0的实模式,对所有Delphi应用程序他应该是关闭的,一些调试工具
需要此类信息。
如果{$W+}{$STACKFRAMES ON},强制每个过程或函数生成堆帧,查找错误时,编译器需要堆帧帮忙。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DELPHI定义的条件编译的全部说明经常看到一些程序里面用到如:{$ifdef win16},{$ifdef win32}之类的信息,可是这些好像并没有定义,不知道在哪里可以找到这些条件编译的定义或者是说明具体讲述win16代表什么,WIN32代表什么,VER140。

代表什么的?{$IFDEF WIN32} -- 这可不是批注喔!对于Delphi来说﹐左右大括号之间的内容是批注﹐然而「{$」(左括号后紧接着货币符号)对于Compiler(编译器)而言并不是批注﹐而是写给Compiler看的特别指示。

应用时机与场合Delphi中有许许多多的Compiler Directives(编译器指令)﹐这些编译指令对于我们的程序发展有何影响呢? 它们又能帮我们什么忙呢?Compiler Directive 对程序开发的影响与助益, 可以从以下几个方向来讨论:?协助除错? 版本分类?程序的重用与管理? 设定统一的执行环境协助除错稳健熟练的程序设计师经常会在开发应用系统的过程中﹐特别加入一些除错程序或者回馈验算的程序﹐这些除错程序对于软件品质的提升有极其正面的功能。

然而开发完成的正式版本中如果不需要这些额外的程序的话﹐要想在一堆程序中找出哪些是除错用的程序并加以删除或设定为批注﹐不仅累人﹐而且容易出错﹐况且日后维护时这些除错程序还用得着。

此时如果能够应用像是$IFDEF的Compiler Directives ﹐就可以轻易的指示Delphi要/不要将某一段程序编进执行文件中。

同时﹐Compiler本身也提供了一些错误检查的开关﹐可以预先对程序中可能的问题提醒程序设计师注意﹐同样有助于撰写正确的程序。

版本分类除了上述的除错版本/正式版本的分类之外﹐对于像是「试用版」「普及版」「专业版」的版本分类﹐也可以经由Compiler Directive的使用﹐为最后的产品设定不同的使用权限。

其它诸如「中文版」「日文版」「国际标准版」等全球版本管理方面﹐同样也可以视需要指示Delphi 特别连结哪些资源档或者是采用哪些适当的程序。

以上的两则例子中﹐各版本间只需共享同一份程序代码即可。

Delphi 1.0 与Delphi 2.0有许多不同之处﹐组件资源文件(.DCR)即是其中一例﹐两者的档案格式并不兼容﹐在您读过本文之后﹐相信可以写出这样的程序﹐指示Delphi在不同的版本采用适当的资源文件以利于组件的安装。

{$IFDEF WIN32}{$R XXX32.DCR}{$ELSE}{$R XXXX16.DCR}{$EDNIF}程序的重用与管理经过前文的讨论后﹐相信你已经不难看出Compiler Directives在程序管理上的应用价值。

对于原始程序的重用与管理﹐也是Compiler Directives 使得上力的地方. 举例来说: Pascal-Style字符串是Delphi 1.0与Delphi 2.0之间的明显差异﹐除了原先的短字符串之外﹐Delphi 2.0之后还多了更为方便使用的长字符串﹐同时﹐系统也额外提供了像是Trim()这样的字符串处理函式。

假如您有一个字符串处理单元必须要同时应用于Delphi 1.0 与2.0的项目时﹐编译指示器可以帮你的忙。

此外﹐透过像是{$I xxxx} 这样的Compiler Directives﹐我们也可以适当的含入某些程序, 同样有助于切割组合我们的程序或编译设定。

设定一致的执行环境项目小组的成员间﹐必须有共同的环境设定﹐我很难预料一个小组成员间彼此有不同的{$B}{$H}{$X}设定﹐最后子系统在并入主程序时会发生什么事。

此外, 当您写好一个组件或单元需要交予第三者使用时, 使用编译指示器也可以保证元件使用者与您有相同的编译环境。

使用Compiler Directives指令语法Compiler Directives从外表看起来与批注颇为类似, 与批注不同的是:Compiler Directives的语法格式都是以「{$」开始, 不空格紧接一个名称(或一个字母)表明给Compiler的特别指示, 再加上其它的开关或参数内容,最后以右大括号作为指令的结束, 例如:{$B+}{$R-}{$R MyCursor.res}同时, 就如同Pascal的变量名称与保留字一样, Compiler Directives也是不区分大小写的。

从指令的语法格式来说Compiler Directives﹐可以进一步分类成以下三种格式:?开关指令(Switch directives)这类指令都是单一字母以不空格的方式连接「+」或「-」符号; 或者是开关名称以一个空格后连接「ON」或「OFF」来表示作用/关闭某一个编译指示开关。

例如:{$A+}{$ALIGN ON}开关型的编译指令不一定要分行写, 它们可以组合在同一个编译指示的批注符号之间,但必须以逗号连接, 而且中间不可以有空格, 例如:{$B+,H+,T-,J+}光标停留在程序编辑器的任一位置时按下Ctrl+O O, 完整的Compiler Directives将会全部列于Unit的最上方。

?参数指令(Parameter directives)有些Compiler Directives需要在编译名称后面连接自定的参数(文件名称或指定的记忆体大小), 例如: {$R MyCursor.res}, 即在指示Delphi在编译连结时,含入「MyCursor.res」这个资源档。

?条件指令(Conditional directives)指示Compiler在编译的过程中, 按我们设定的条件, 选择性的采用/排除不同区域的程序代码。

以下是一个条件编译的例子, 第一与第三列是写给Compiler看的,指示Compiler在__DEBUG这个条件名称完成定义的情况才编译ShowMessage()这列程序;反之, 如果__DEBUG 当时没有定义的话, 这段程序几乎与批注无异, Compiler对它将视而不见。

{$IFDEF __DEBUG}ShowMessage(IntToStr(i));{$ENDIF}如何从IDE改变Compiler directives设定?从Delphi的IDE程序整合发展环境, 我们很方便的就可以修改各个compiler directives的设定, 方法是:从Delphi IDE主选单: Project/Options/Compiler, 直接核选/取消各个CheckBox。

值得注意的是, 改变一个项目的Compiler directives并不会影响其它的项目, 换言之,各个项目都保有自己一套编译指示。

假如您希望其它的项目也采用相同一套的Compiler directives, 在上述Project Options对话盒的左下方有一个「Default」选项, 选取这个CheckBox之后, 虽然对于既有的项目没有作用, 但未来新的项目都将可以采用这组设定作为默认值。

将Compiler directives写入程序透过Delphi的整合环境设定Compiler directives的确十分简便, 但是许多情况下我们仍然需要将Compiler directive直接加到程序中。

至少有两个原因支持我们这么作:局部控制编译条件在Project/Options/Compiler中所作的设定, 影响所及是整个项目, 如果某一段程序要特别使用不同的编译设定, 就必须直接将编译指示加到程序中。

下列这段取自Online Help的程序范例, 即应用了{$I}编译指令局部控制在发生I/O错误时不要举发例外讯息, 这样, 我们就可以编译出一支在这段程序区域中不会产生I/O例外讯息的档案侦测函数。

function FileExists(FileName: string): Boolean;varF: file;begin{$I-}AssignFile(F, FileName);FileMode := 0; ( Set file access to read only }Reset(F);CloseFile(F);{$I+}FileExists := (IOResult = 0) and (FileName <> '');end; { FileExists }程序的可移植性我们都可能会用到其它公司或个人创作的unit或component, 也可能分享程序给其它人, 换句话说, 单元或程序可能会在不同的机器上编译, 直接将Compiler directives加入程序, 不仅可以免去程序使用前需要特别更改IDE的麻烦, 更重要的是解决了各个单元间要求不同编译环境的歧异。

注意事项Compiler directives的作用与影响范围如同变量的可见范围与生命周期, 在我们使用Compiler Directives 时也必须注意各个Compiler Directives 的作用范围.Compiler Directives的作用范围可分为以下两种:全域的全域的Compiler Directives, 影响所及是整个项目; 我们稍早前提到经由Delphi IDE改变Compiler directives的方式就属于全域的设定。

区域的而区域的Compiler Directives 影响所及只从Compiler Directives 改变的那一行开始, 直到该程序单元(Unit)的结束或另一个相同的Compiler Directives 为止,对其他的程序单元并没有影响。

也就是说, 如果在unit中特别加入Compiler directives, Compiler会优先采用区域的设定, 然后才是属于项目层级的全域设定。

值得一提的是, 在程序中直接加入Compiler directives的最大作用范围也只限于当时那个单元而已, 对其他单元并没有任何影响, 即使是以uses参考也是一样。

也就是说,我们可以透过uses参考其它unit公开的变量与函式, 但是各个unit的编译指令并不会互相参考。

这项独立的性质, 使得unit之间编译环境的设定与关系变得十分简洁, 例如Delphi 2.0的VCL都是在{$H+}的情况下编译的, 因此, VCL中的字符串都是以长字符串的型态编译而成的, 有了这项编译指令独立的特性, 不论我们Prject中的设定为何, 这些在VCL中定义过的字符串都是长字符串。

我们的Project也不会因为uses了VCL中的unit而改变了自己的设定。

因此, 在我们移交程序到网络上时, 大可以放心的在程序中加入必要的Compiler directives, 别担心, 即使别的unit以uses参考了我们的程序, 也不影响它自己原来的设定。

相关文档
最新文档