interface
…
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
{$IFDEF _ProVersion}
ShowMessage(’专业版’);
{$Else}
ShowMessage(’只有专业版才有此功能’);
{$ENDIF}
end;
…
这是子程序的观念嘛! 没错, 就是这么简单而已, 以后如果有任何变化, 修改MySet.INC,
然后Project/Buile All即可, 实在是够简单的了。
基本动作会了之后, 让我告诉你多一点有关{$I文件名称}的事。
? 一旦应用了{$I文件名称}, 几乎等于Compiler在编译时, 让Compiler将这个档
案的内容贴进我们的程序中的那个位置。
? 如果没有注明扩展名, Delphi预设这个档案是.PAS。
? 如果在项目的目录中找不到这个档案的话, Delphi会陆续搜寻Tools/Options
/Library中的Library Path中的目录。
另外, 当您写作了一个DLL, 使用者在使用其中的函数前必须宣告过, 如果能够一并提
供这些函数的宣告文件, 使用者只要一行{$I xxx}
即可, 是不是很方便呢?
{$I+} EInOutError检查
在{$I+}(系统默认值)状态编译的程序, 一旦发生I/O错误时, 将会举发一个EInOutError
的例外, 假如我们在特定的情况下不希望出现这个例外的讯息时(例如前文提到的侦测档
案是否存在函数), 可以将这个Compiler directive设为{$I-}, 此时, 程序执行时是否发
生过错误,程序设定师必须自行检查IOResult这个公用变量的值, 如果是零, 表示没有错误,
非零的错误代码含意请详查Online help。
{$L文件名称} 连结目标文件
如果您有一个.OBJ文件要并入Delphi的程序时, 可以在程序中加入:
{$L OTHER.OBJ}
这样, 就可以使用OTHER.OBJ中的程序了, 值得注意的是, 函数或程序在呼叫前,
仍然必须用external宣告过, 表明这些模块是来自「外部」的函式。
举例来说, 笔者有一份由Keypro厂商提供的.OBJ檔, 在使用时, 相关的程序如下:
…
{$L hasptpw.obj}
{$F+}
procedure hasp (Service, SeedCode, LptNum, Pass1, Pass2 : word;
var p1,p2,p3,p4 : word); external;
{$F-}
…
经过{$L hasptpw.obj}宣告之后, 程序的其它部分就可以直接呼叫原先位于 hasptpw.obj
中的hsap这个程序了。
{$L+} 区域符号信息
在{$L+}时, Delphi会额外加入一些区域符号信息, 这使得我们可以应用Delphi IDE中的
View/Call Stack, View/Watch在程序执行时检视变量内容与函式呼叫的关系。
应用这个Compiler directive的注意事项有:
? {$D-}时, {$L+}不会有作用。
? 使用{$L+}, 只会加大.DCU的档案大小, 对.EXE的大小与执行速度并没有影响。
{$H+} 长字符串宣告
Delphi 2.0之后, 字符串多了一个更为好用的长字符串, 不仅没有资料长度255的限制,
与C语言惯用的Null-terminated string兼容性也大为提高。
使用{$H}时的注意事项有:
? {$H+}的编译情形下, 以string定义的字符串变量都是长字符串, 请注意,
字符串是否为长字符串是在字符串定义时决定的, 例如:
procedure TForm1.Button1Click(Sender: TObject);
{$H-}
var
s: string;
begin
{$H+}
s := ‘测试一下长字符串’;
Windows.MessageBox(0, pchar(s), ‘讯息’, 64);
end;
由于var前{$H-}的缘故, 虽然在begin后我们立即设定为{$