● P30:
在声明一个函数或者过程时,在其上方用 /// 或者 {! 插入注释,在其它地方使用时,把鼠标悬停在这个函数或者过程上面,会显示出这些注释
Delphi新注释 更多请查阅 :https://blog.csdn.net/xieyimo9/article/details/74139887
● P33:
D对大小写字母视为相同字符,即不过敏
● P36:
我一直也存在这样一个疑问: 同样是声明变量,为什么string的第一个字母是小写,而Integer却是大写?!
"在原始的 Object Pascal 格式指引中有提到:型别,例如 Integer 属于识别符号(identifier)时,第一个字符建议大写,但用保留字(reserved word)例如 string 宣告变量时,建议全部小写。"
● P43:
单元文件的结构:
unit Unit1; interface implementation end
首先,单元文件要有一个整个项目不能重复的名字为之命名,同时也当作主档名(所以上面这个例子存档时,档名就会是Unit1.pas)
其次,单元文件一定要有一个interface区段,用来宣告让其他单元文件可以使用、存取的资料。
最后,单元文件要有implementation区段,用来实作这个单元文件里面真正的源码,这里的源码也可以比interface区段所宣告得来的更多,只是在interface区段没有宣告的,就只有同一个单元文件的其他源码可以使用,不管是方法或属性都一样
●P44:
单元名中可以包含 点(.) 比如下面这三个单元名都是合法的
unit1 myproject.unit1 mycompany.myproject.unit1
●P45:
除了 interface 跟 implementation([ɪmplɪmenˈteɪʃ(ə)n]) 这两个区段之外,每个单元还可以有
initialization( [ɪˌnɪʃəlaɪˈzeɪʃn] )跟 finalization([faɪnəlaɪˈzeɪʃn]) 这两个非必要的区段。Initialization 是用来处理
该单元被执行时最开始的源码,而 finalization 则是用来处理该单元在程序结束时要处理的源码。
不建议使用
●P46:
Uses的两个位置:
interface下面,表示全局引用,其下的变量,只要初始化,引用它的单元,都能取到全局变量的数据
implementation下面,表示局部引用.
●P49:
如果被引用的A,B单元中,同时存在一个同名函数F,而在调用F时,又没有指明是哪个单元中的F,则uses最后的那个F会抢到使用权.
所以在调用时,最好带上引用单元的名称,这样就不怕出错了,比如 Form1.F, Unit1.F, Project1.F等
●P50-53:
编译器设定 {$ xxxx} ,注意和 {注释} 区分开来
主要分为条件化定义(Conditional Defines)与引入(includes)
主要是告诉编译器,在哪种条件或者设备下,编译哪段代码,跟 if ...then..或者 if...else...差不多
delphi的常用条件编译指令
delphi 使用 {$INCLUDE} 或 {$I} 指令管理和调用自定义函数
{$INCLUDE 'F:\Users\Administrator\Desktop\test.inc'} 引入的文件是明文显示的,所以打开就可以改代码,这是和DLL文件不同的一点.
●P56:
从D11开始,可以用二进制来表示数值.同时对于数值较大的值,可以用下划线来代替千分位分隔符,比如 20,000,000(2千万)写成 20_000_000
●P57:
1.字符串换行符: sLineBreak.常用于message提示信息中,把信息分成多行等.
2. 赋值运算符 := 是由Pascal的前身Algol语言继承而来的,相比其他语言的=,==,===,运算速度更快,因为它无需花时间把整段源码判读过后才去判断等号在出现的时候代表的是什么意思.
●P58-63:
变量的初始化
1.全局变量
var Value: Integer = 10; Correct: Boolean = True;
2.局部变量不能直接在后面赋值,要以begin下面进行.特别强调!!!!局部变量一定要初始化再使用.如果局部变量不经初始化就直接使用它,变量里面的内容是完全无法预料的,它将会是内存被变量取得的当下,内存里头的随机数据,在许多情形下,编译器都会警告说这会有潜在的错误发生。
var Value: Integer; begin Value := 0; // 初始化
3.内联变量(书中叫行内变量)
特点
3.1 从10.3版本开始,在函数或者过程的begin以下任意位置都可以声明变量
procedure Test; begin var I, J: Integer; I := 22; J := I + 20; ShowMessage(J.ToString); end
3.2.内联变量的初始化
procedure Test; begin var I : Integer := 22; ShowMessage(I.ToString); end;
procedure Test1; begin var I : Integer := 22; var J : Integer := 22 + I; var K : Integer := I + J; ShowMessage(K.ToString); end;
3.3内联变量可以不用指定数据类型,而是由它赋值的数据,自动分配数据类型,但这种方式极度不推荐,比如你需要的是shortInt结果它给你定个integer,这都还好说,万一反过来呢,肯定会出错呀
procedure Test; begin var I := 22; //等同于 var i:Integer=22; ShowMessage(I.ToString); end;
4.给常量指定数据类型
正常情况下,常量会像内联变量一样,由系统指定数据类型,但如果有特殊需求的情况下(至少我想象不到),可以这么指定
const
pi:=3.14; //正常声明 Thousand: Integer = 1000; //特殊声明
行内常数,参考内联变量(行内变量)
begin // 某些源码… const M: Integer = (L +H) div 2; //把数据类型透过标识符清楚定义 // 又来一些源码 const M = (L + H) div 2; // 没有写特定型别的常数宣告
5.资源字符串常数(resourceString)
如果你有很多字符串常量要声明,你可以把它们单独的存放在DM单元中,然后只要引用了这个DM单元就可以随便使用这些常量了.有些外语软件的汉化操作,其实就是修改这里面的资源为中文
●P64:
变量的生命周期与可视范围
1.全局公有变量.
声明在A单元interface部分里的变量,类,或者常数,会被所有引用了本单元的单元访问到,比如B单元Uses了A单元,那B就可以访问到A在interface部分里的变量,类,或者常数.这些变量会在A单元窗口销毁的同时被销毁,释放;
2.全局私有变量.
声明在A单元implementation部分里的变量,类,或者常数,仅会对本单元可见,不管谁引用了A单元,都访问不到这里面的的变量,类,或者常数..这些变量会在A单元窗口销毁的同时被销毁,释放;
3.局部变量.
声明于函数或者过程的begin之前.仅能在本函数/过程中使用,函数/过程完成或者退出,会把里面声明的变量统统销毁.这也是为什么你可以在函数A和函数B里都可以声明同一个名称的变量而不报错的原因.
4.内联变量.
声明于函数或者过程的begin之后,比局部变量多了一个限制,即该变量的生命周期将从它声明的行开始生效,直到函数或者过程结束.如果你在声明之前使用这个变量,程序会报错.
5.语句内的内联变量
声明于各种语句的begin....end;内,比如if ... then..., for..while...等,这些变量会在语句结束时被销毁; 它比内联变量和局部变量的生命周期还要短暂.
●P66:
整数数据类型的别名.
Int8 = ShortInt; Int16 = SmallInt; Int32 = Integer; UInt8 = Byte; UInt16 = Word; UInt32 = Cardinal;
●P69:
1. length与sizeOf在取一维数组长度时,结果相同.但如果是用于取多维数组时,以length为准.,sizeOf只是求得数组占用的空间,利用它这个特性,可以快速求出数组元素的个数: sizeOf(arr) div sizeof(integer)
2. dec / inc类似于其他语言的 --/ -= 与++ / +=运算符,它们有一个参数的版本,还有两个参数的版本
var i:integer=100; inc(i); // i=101 inc(i,50); // i = 151 dec(i); // i = 150 dec(i,10); //i = 140
3. Pred / Succ 返回有序类型的前一个/后一个值
memo的行值Memo2.Lines[i],返回的是string类型,而pred需求的是char类型,所以只能取最前面的一个字符 [1]
●P72:
chr 与 ord 为互反函数.
showmessage(chr(107)); //'k'
showmessage(ord('k').tostring); //107
showmessage(#107); //'k'
常见控制符:
#8 删除键 #9 tab定位键 #10 换行符号 #13 回车键 #27 esc键
●P73:
Char型别涵盖的范围相当大,但它仍旧是有序型别
●P75:
浮点类型不属性于有序类型,尽管它可以比较大小,但却没有顺序的特性.
Double等同于旧版本中的real类型.
●P80-84:
1. 遍历子界类型
Type
TNumber = 0..9;
procedure TForm1.Button1Click(Sender: TObject); var n:TNumber; begin for n := Low(TNumber) to High(TNumber) do begin Memo1.Lines.Add(vartostr(IntToStr(n))); end; end;
2. 遍历枚举类型
3. 集合类型的运算
Style := Style + [fsBold, fsItalic] - [fsUnderline];
●P88:
跟许多其他的编程语言不同,逻辑运算符号(包含and跟or运算符号)的优先级比比对符号来得高(例如大于跟小于符号),所以如果我们这么写:
a < b and c < d
编译器会先执行 b and c,所以通常会先出现编译器处理作业中显示型别兼容性错误。所以如果我们要进行两个比对,我们得用小括号把两个比对的表达式先包起来,写成这样:
(a < b) and (c < d)
●P89:
div 仅返回商(整数), 13 div 6; //2
/ 返回结果,含小数位 11 / 5; //2.2
mod 仅返回余数 11 mod 5; //1
在D中,日期是从1899-12-30日开始计算的,TDateTime是一个浮点数
●P91-92:
调用函数时,如果函数没有参数,可以不用在后面加括号,这点与C语言阵营的不同.
Yesterday、Today、Tomorrow - 昨天、今天、明天
procedure TForm1.FormCreate(Sender: TObject); var t1,t2,t3: TDateTime; begin t1 := Yesterday; t2 := Today; //同 SysUtils.Date; t3 := Tomorrow; ShowMessageFmt('%s, %s, %s', [DateToStr(t1), DateToStr(t2), DateToStr(t3)]); {2009-5-20, 2009-5-21, 2009-5-22}
标签:begin,D11,编程语言,delphi,var,Integer,声明,单元,变量 From: https://www.cnblogs.com/yoooos/p/16853986.html