1. 滥用delphi的专属类型(比如子界类型),虽然提高了可读性,但降低了跨语言可移植性,以及可扩展性。一般情况下,使用常用的数据类型即可。不要过分追求数据与其含义的一体化。可采用多语言的最小集合原则。
2. 集合运算是一个有用的亮点
3. 数组要跟C语言看齐,下标尽可能从0开始。遍历数组,保险起见尽可能通过Low/High函数获取数组边界。
var
List: array [1..10] of Integer; X, I: Integer;
begin
// initialize the array
for I := Low (List) to High (List) do
List [I] := I * 2;
// call X := Sum (List);
4. 常量定义有2种方法
const
VAL = 100;
不需要声明类型,会自动匹配相关类型,并分配内存。且可移植性好一些。推荐!
const
VAL :Integer = 100;
每次使用时都要复制常量值。
5. 资源串常量,一种特殊的字符串常量,保存到程序资源的字符串表中
resourcestring
VAL = ‘abcd';
6. 全局变量允许初始化值
var
V : Integer =100;
7. 字符串类型
string的具体类型要根据编译开关$H决定
$H+意味着是AnsiString,类似于C的0结尾字符串,长度理论上可以无限长
WideString跟AnsiString相似,只是以unicode码为单位
古老的ShortString最大长度是255
AnsiString转C字符串,用PChar(..),需要注意的是转了之后,delphi代码不能再对AnsiString变量做改动了,除非再一次转回AnsiString -- AnsiString(PChar(..))
8. 指针
用脱字符表示
type
P = ^ Integer;
var
T : Integer;
P = @T;
10. Record类型在大多数语言里都能找到相应的实现
11. 在一些递归的场合,2个函数互相调用时,可以在一个函数的声明后面加关键字 forward; 其实现可在其他地方出现(不限于本单元)。
12. 尽量不用with语句,其降低了代码可读性。
13. 循环语句,尽量用一种,倾向while
14. case语句只针对有序类型。每个case分支或if分支用begin..end包裹。
15. windows函数
stdcall是Windows标准的调用方式,dll调用需遵从此调用方式。
调用外部dll函数,依据的是dll以及函数名称
function LineTo; external'gdi32.dll'name'LineTo';
16.过程类型
pascal的过程类型与c的函数指针很形似,如果是函数加个返回值
type
IntProc = procedure (var Num: Integer);
17. 重载
需要重载的过程/函数的声明以及实现部分都要加上overload
18.uses部分前面模块的函数会被后面模块的同名函数覆盖掉。一种避免重名的方式是在函数名前加上模块名前缀。