请教Delphi高手们,delphi代码中的{$ *.dfm}  {$ *.res}是什么意思呢?其中 {} 、$ 分别是叫做什么操作符呢?

解决方案 »

  1.   

    编译指令
    我在一个 pas 文件中定义一个 {$define PROGRAM_DEBUG_} 来表示一个调试标志宏。 在另一个 pas 文件中就不起作用了 ,非要我也定义一个相同的 {$define PROGRAM_DEBUG_}难道在一个工程中有 n 个 pas 文件 ,就要我定义 n 个 {$define PROGRAM_DEBUG_},太没道理了 在 C/C++ 没有这回事。 各位 ,我怎样只设置一个 {$define PROGRAM_DEBUG_},就能在整个工程中去作用。 
    来自 :Kingron,  时间 :2001-9-9 12:57:00, ID:617411哎呀 ,我来告诉你把 :关闭所有的工程 ,然后选择 Project Options,在那个 Condition???页面中 ,有一个 条件一项 ,点击 ...按钮 ,添加 {$define PROGRAM_DEBUG_} 就可以了 ,以后你就可以使用 :{ifdef PROGRAM_DEBUG_}.....来自 :Kingron,  时间 :2001-9-9 12:59:00, ID:617412上面的不仅仅是对本程序起作用 ,对所有的新建的都会有作用的 ,如果要对本程序起作用 ,只要修改本程序的 Project Options 即可。 
      关于 Delphi 中的条件编译 Delphi 支持类似于 C++ 中条件编译的概念。其方法也很简单。不过 ,因为使用频率相对较少的缘故 ,有些人对它还是不太熟悉 ,而且 Delphi 和 C++ 在条件编译的语法上也有一点小的差别 ,所以有必要简单提一下。 最简单的形式类似这样 :{$IFDEF DEBUG}ShowMessage('Display a Debug Message!');{$ENDIF}  在 Delphi 6 中 ,支持 IFDEF 的一个增强的形式 :IF 。 IF 不仅可以测试符号定义 ,而且允许测试常量 ( 包括常量表达式 ,如 SizeOf,Pred,Succ 等 ),而且能够测试组合条件。下面是一个例子 :constDebugControl = 3;{IF Defined(DEBUG) and (DebugControl>=3)}ShowMessage( 'High Debug Level!');{$IFEND}  熟悉 C++ 的朋友应该注意 ,测试结束部分有两种形式 ,分别是 ENDIF 和 IFEND,它们分别用于对应 IFDEF( 也包括 IFNDEF) 和 IF,不可以混用 ,否则将得到一个出错信息 ,这是 Object Pascal 和 C++ 的一个不同点。 更复杂一些的形式如下 :{$IFDEF ...}...{$ELSEIF ...}...{$ELSE}...{$IFEND}  条件编译在 Delphi 6 中变得相对比较重要 ,因为 Delphi 6 分别支持 VCL 和 CLX 这两个不同的库。因而在 VCL 中和其他一些地方 ,你能够看到类似这样的语句 :{$IF Defined(CLX)}...{$IFEND}Delphi 中预定义了一些条件编译符号。下面列出其中比较重要的一些 :1.VER140  这个定义暗示 Delphi 6.0 在 Borland Pascal 产品家族中的真正版本号是 14.0 。在 Delphi 5 中则定义了 VER130 。应用如下 :{$IFDEF VER140}ShowMessage('Is Delphi 6!'){$ENDIF}{$IFDEF VER130}ShowMessage('Is Delphi 5!'){$ENDIF}2 . MSWINDOWS / LINUX / WIN32  前面两个定义显然是为跨平台编程而准备的。至于 WIN32,你也可以把它当作 MSWINDOWS 来用 ; 不过 ,实际上它是为 Delphi 1.0/2.0 的兼容性而保留的 ,除非你有这两个版本的应用程序需要维护 ,否则一般不应该再使用它。当然了 ,在将来的 64 位平台上 ,还会出现 WIN64 的定义 ; 如果你是个很前卫的程序员 ,你甚至可以现在就编写这样的代码 :{$IFDEF WIN64}...{$ENDIF}这样做也并不是毫无意义的 ,因为 Delphi 目前对 Int64 类型已经提供了不错的支持。 3 . CONSOLE指示这是一个控制台 (Console) 应用程序。 4 . BCB如果需要在 C++Builder 中编译 .Pas 文件 ,某些情况下可能需要它。 5 . ConditionalExpressions在 Delphi 5 和以前版本中不支持 $IF 。不过 ,用下面这种方式 ,不论在 Delphi 5 还是 Delphi 6 中都可以毫无问题地通过编译 :{$IFDEF ConditionalExpressions}{$IF Defined(Debug)}ShowMessage('Debug!');{$IFEND}{$ENDIF}《 Mastering Delphi 6 》的作者给了我们两条忠告 :   1 .条件编译很有用 ,只要使用得当 ,它能够为程序提供相当的灵活性。但是 ,应该只在确实需要用它们的时候才用 ; 否则 ,很容易让代码变得难于阅读 ,并且可能给调试器造成麻烦。    2 .当你改变了某些定义 ,编译器并不一定总是能够正确的区分哪些代码需要重新编译。如果你改变了这些定义后 ,程序的运行情况变得有点奇怪 ,那么请选择 Build All 。    Delphi 6 中引入了一个新的指示字 (directive):platform 。因为 Delphi 6 支持跨平台编程 ,但是 ,当你需要编写一些特定于平台的代码的时候 ,最好用 platform 来声明。 下面是例子 :varWinInteger : integer=3000 platform;procedure Test;platform;beginBeep;end;typeWinClass=classx : integer;end platform;  其中 class 声明中 platform 出现的位置似乎有点奇怪 ,没关系 ,知道就行了 ,反正我们一般不太会用得到它 ( 但是真有需要的时候 ,你也得有所了解才行 ) 。如果你一定要寻根究底的话 ,《 Mastering Delphi 6 》的作者对此有一个简要的解释 :The position of semicolons for hint directives can be quite confusing at first. The rule is that a hint directive must appear before the semicolon following the symbol it modifies. But a proce-dure, function, or unit header declaration can be followed only by reserved words, so its hint directive can appear following the semicolon. A type, variable, or constant declaration can be followed by another identifier, so the hint directive must come before the semicolon closing its declaration. Part of the rationale behind this is that the hint directives are not reserved words, so they can be used as the name of an identifier.关于 deprecated 指示字   《 Mastering Delphi 6 》中关于 deprecated 的这一段说明似乎有点古怪 ,文字很浅显 ,可是我看了三遍也没有完全搞清楚到底是在说什么。先记录在这里 ,以后再看好了。  The deprecated directive works in a similar way to the platform directive;the only real differences are that it is used in a different context and produces a different compiler warning.The role of deprecated is to  dentifiers that are still part of the system for compatibility reasons,but either are going to be removed in the future or expose you to risks of incompatibility.This symbol is used sparingly in the Delphi library.   Delphi 6 中另外一个相当有用的关键字是 $MESSAGE 。你可以用它来提醒你程序中任何值得注意的地方 ,比如说下面的例子 :{$MESSAGE ' 这里尚未完成 ,记住下次要改完! '}  当然 ,用 To-do List 也可以完成类似的工作 ,而且 To-do List 在功能上更完善一些 ; 不过 ,$MESSAGE 比  To-do List 优越的一个地方是 ,编译器每次编译程序的时候都会提醒你 ,所以不容易忘记 ; 相对而言 ,不是每个程序员都会去经常察看 To-do List 。    $MESSAGE 也类似于 Visual C++ 中的 #pragma message 。不过 ,在 Delphi 6 的 Message 窗口双击该行信息 ,就能够跳到源文件中相应定义的地方 ,而这一点在 Visual C++ 中却办不到。 后记 : 《 Mastering Delphi 6 》现在才看到第 65 页 ( 总共 1071 页 ),也就是说 ,万里长征才走完第一步。这本书读到这个地方还是很好理解的 ( 基本上不用动用金山词霸 ),但是后面的内容就要艰深一些了。应该老实承认我的英文水平还是很差 ,读原版书满辛苦的。想起蔡学镛老师说 ,他开始读外文资料的时候必须正襟危坐 ,手头必备电子辞典 ,读的多了 ,现在已经很随意地能够把外文资料当作小说来看 ,不论是坐着还是躺着 ,都不影响阅读。什么时候我才能达到这种境界呢? 
      

  2.   

    网上搜一下“Delphi 编译指令集”有更详细的内容