在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
以下是我在自学Delphi的时候,对一些注意点的简单总结,并没有什么系统性可言,只是一个学习时顺手记下的笔记,主要为了当时加深对知识的印象,并没有希望能在以后的复习和使用Delphi中有什么多大的参考作用。 type A = array[1..2] of Integer; const w: Word = Sizeof(Byte); var i: Integer = 8; j: SmallInt = Ord(‘a’); L: Longint = Trunc(3.1415926); x: ShortInt = Round(2,71828); B1: Byte = High(A); B2: Byte = Low(A); C: char = Chr(46); //注意在定义变量的类型并赋值时,使用 = 而不是 := var S1, S2: string begin S1 := ‘And now for something…;’ //给S1赋值,S1的引用计数为1 S2 := S1; //现在S2和S1指向同一个字符串,S1的引用计数为2 S2 := S2 + ‘completely different’; //S2现在改变了,所以它被复制到自己的物理空间,并且S1的引用计数减1 end;
var V: Variant; begin V :=’Delphi is Great!’; //Variant此时是一个字符串 V :=1; //Variant此时是一个整数 V :=123.2; //Variant此时是一个浮点数 V :=true; //Variant此时是一个布尔值 V :=GreateOleObject(‘word.Basic’); //Variant此时是一个OLE对象 end; Variant能支持所有简单的数据类型,例如整型、浮点型、字符串、布尔型、日期和时间、货币以及OLE自动化对象等。注意Variant不能表达Object Pascal对象。Variant可以表达不均匀的数组(数组的长度是可变的,它的数据元素能表达前面介绍过的任何一种类型,也可以包括另一个Variant数组) var A: Array[0..7] of Integer 它相当于C语言中的 var A: Array[28..30] of Integer; 因为Object Pascal的下标不是必须从0或1开始的,在for循环中使用数组时一定要小心。在编译器中有两个内置的函数High()和Low(),它们分别返回一个数组变量或数组类型的上边界和下边界,在for循环中使用这两个语句能使程序更加稳定和易于维护,例子: var A: Array[28..30] of Integer; I: Integer; begin for i:= Low(A) to High(A) do //不要在循环中硬编码 A[i] := i; end;
var A1, A2 : array of Integer; begin SetLength(A1, 4); A2 := A1; A1[0] := 1; A2[0] := 26; 正确答案是26,因为赋值语句A2 := A1并不是创建新的数组,仅仅是将A1数组的引用赋给A2,因此对A2数组的任何操作都影响到A1,如果想用A1的完全拷贝赋值给A2,用标准过程Copy: A2 := Copy(A1); 当这行代码运行结束, A 1和A 2是两个独立的数组,但它们的初始值是相同的,改变其中的一个不会影响到另一个. {Pascal} Type MyRec = record i: Integer; d: Double; end; /*C*/ Typedef struct{ int i; double d; }MyRec; type TVariantRecord = record; NullStrField : Pchar; IntField : Integer; case Integer of 0: (D: Double); 1:(I : Integer); 2:(C: char); end; 注意,Object Pascal规则声明:一个记录的可变部分不能是生存期自管理的类型。 Type TChildObject = class(TparentObject); SomeVar :Integer; procedure SomeProc; end; 虽然Delphi的对象和C++中的对象不完全一致,但上面的代码大致和在C++中的如下定义相同: Class TChildObject : public TParentObject{ int SomeVar; void SomeProc(); }; 要定义一个方法,类似于定义函数和过程,只是要加上对象名字和小圆点: procedure TChildObject.SomeProc; begin {过程体} end; Object Pascal中的小圆点,在功能上类似于C++的 :: 运算符。 Type Pint = ^Integer; //PInt现在是一个指向Integer的指针 Foo = record GobbledyGook: string; Snarf: Real; end; PFoo = ^Foo; //PFoo是一个指向Foo类型的指针 var P: Pointer; //一个无类型指针 P2: PFoo; //PFoo的实例 记住:一个指针变量仅仅是存出一个内存的地址,为指针所指向的内容分配空间是程序员要干的工作。 Program PtrTest; Type MyRec = record I : Integer; S : string R : Real; end; PMyRec = ^MyRec; var Rec : PMyRec; begin New(Rec); //为Rec分配内存 Rec^.I := 10; //为Rec中的域赋值 Rec^.S := ‘And now for something completely different.’; Rec^.R := 3.14; {Rec现在满了} Dispose(Rec); //不要忘记释放空间 end;
var a: ^Integer; b: ^Integer; 相反,在C中它们兼容 Type PtrInteger = ^Integer; //建立新类型 var a, b : PtrInteger; //现在a和b相兼容了
28. 注意,只有当两个变量的数据长度一样时,才能对变量进行强制类型转换 if (condition) then begin ... end //注意这里不用;。因为为了保证这个if和下面的if else是一对 //如果使用了;。就表示if语句就在此结束 //那么下面的else if 语句就会报错,因为不符合语法 else if (condition2) then begin ... end //注意这里不用;。因为为了保证这个else if和下面的 else 是一对 else begin ... end; //注意这里用; 如果else只有一句就可以是这样的 else ...; 最后一定要有; 表示结束
特别注意自在if-else if-else里面的分号的问题 if (a>0) then edt1.Text := '>' //注意这里并不像上面的那个例程里面使用了begin和end,但是同样的道理, //在if的下面的单条执行语句里面最后不能加分号(如果if下面有多条执行语句, //那么就要用begin和end括起来,这时候begin和end之间的每条语句都要用分号结束, //但是end后就不能用分号) else if(a<0) then edt1.Text := '<' //else if 的规则同 if 的规则 else edt1.Text := '='; //最后的else语句,如果else只有一条执行语句,那么这条执行语句必须以分号结尾。 //如果有多条执行语句,必须放到begin和end里面,这是不光每条执行语句需要以分号结尾, //end也要以分号结尾!
case SomeIntegerVariable of 101 : DoSomething; 202 : begin DoSomethinf; DoSomeThingElse end; 303 : DoSomething; else DoTheDefault; end; 注意,case语句的选择因子必须是有序类型,而不能是非有序的类型如字符串作为选择因子。上面类似于C中的代码: switch(SomeIntegerVariable){ case 101 : DoSomething; break; case 202 : DoSomething; DoSomethingElse; break; case 303 : DoSomething; break; default : DoTheDefault; } 当变量等译值1和值2时,都执行语句1,那么可以这样写 case (表达式) of 值1,值2 : 语句1;
31. 警告:在Delphi1.0中,允许对控制变量赋值;而从Delphi2.0开始,不再允许对控制变量赋值,因为32位编译器对循环进行了优化。 循环体可以是简单语句,也可以是复合语句,若是复合语句,需要用begin...end括起来 在循环体中可以使用continue和break语句,他们也通常位于if语句之后 var I, X : Integer; begin X := 0; for I := 1 to 10 do //to是递增 inc(X, I); end; var I, X : Integer; begin X := 0; for I := 10 downto 0 do //downto是递减 X := X + I; end;
while循环 Program FileIt; {$APPTYPE COMSOLE} var f : TextFile; //一个文本文件 S : string; begin AssignFile(f, ‘foo.txt’); Reset(f); while not EOF(f) do begin readln(f, S); writeln(S); end; CloseFile(f); end; repeat…until循环(首先执行循环体,执行后在判断循环条件,所以循环体至少执行一次) 循环体可以是简单语句,也可以是复合语句,对于复合语句,不需要用begin...end括起来 注意:在“循环条件”为False的时候执行循环,为True的时候退出循环,这一点要和while语句进行区别 var x : Integer begin X := 1; repeat inc(x); until x>100; end; Program FuncProc {$ApPTYE COMSOLE} procedure BiggerThanTen(i : Integer); {write something to the screen if I is greater than 10} begin if i >10 then writeln(‘Funky.’); end; function IsPositive(i : Integer): Boolean; {Return True if i is 0 or positive, False if i is negative} begin if i <0 then Result :=False; else Result := True; end; var Num : Integer; begin Num := 23; BiggerThanTen(Num); if IsPositive(Num) then writeln(Num, ‘is positive.’); else writeln(Num, ‘is negative’); end; 注意,在IsPositive()函数中的本地变量Result需要特别注意。每一个Object Pascal函数都有一个隐含的本地变量成为Result,它包含函数的返回值,注意这里和C/C++不一样,把一个值赋给Result,函数并不会结束。 Procedure ChageMe(var x : longint); begin x := 3; {x在调用过程中变了} end; 不同于复制x,关键字var使得变量的地址呗复制,因此变量值就能被直接改变。 var i, Rez : Integer; const j = 23; begin i := 8; Rez := AddEmup([I, 50, j, 89]); 为了在函数和过程中用开放数组,应该用High()、Low()和Sizeof()等函数来获取关于开放数组的信息。下面的代码是AddEmUp()函数的实现,它返回传递给参数A的所有元素的总和: function AddEmUp(A: array of Integer) : Integer’ var i : Integer; begin Reault := 0; for i:= Low(A) to Hign(A) do inc(Result, A[i]); end; Object Pascal还支持常量数组,这样就能把不同类型的数据放在一个数组中传递给函数和过程,下面就是它的语法: Program FooProg; uses UnitA, UnitB; 单元能有两个uses子句,一个在interface部分,一个在implementation部分。例 Unit FooBar; interface use BarFoo; {在这里进行全局声明} implementation use BarFly; {在这里进行局部声明} initialization {在这里进行单元的初始化} finalization {在这里进行单元的退出操作} end package PackageName requires Package1, Package2, …; //列在requires子句的包是这个包需要调用的其他包 contains Unit1, in ‘Unit1.pas’, Unit2, in ‘Unit2.pas’, …; //在contains下列出的单元是这个包所包含的单元,在contains子句下列出的单元将被编译进这个包,注意在这里列出的单元不能同时被列在requires子句中的包所包含。另外,有这些单元所引用的单元也会间接地包含到暴力,除非它们已经被列在requires子句中 end
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论