[转帖]delphi5开发人员指南学习笔记(1) |
我学delphi断断续续有两年时间了,中间曾头脑发热看过一本C++的书,又看了一本api sdk编程的书,后来又想参加计算机水平考试,看了几个月复习资料,但都半途而废。两年来,什么也没学好。痛定思痛,下决心只学DELPHI,决定先找一本精典书看看。今年四月份,在大富翁论坛上发贴,寻找看DELPHI5开发人员指南的学习伙伴,有几位朋友回了帖,于是就看了起来。今年5月29日,我上课的时候,一个学生告诉我,找到一个申请免费主页空间的地方,于是就有了本站的诞生,由于网站是在两三天时间里匆忙做成的,所以现在站点里的内容都是我原来在网上收集的,所以有不少网友批评我。一个站点只有有自己的东西才有生命力,才能吸引别人常来,我也知道这个道理,但自己文笔生涩,而且也没什么可写的。于是想到把自己看书的过程以笔记的形式写下来,一来做为学习的总结,二来可以和大家交流,逼迫自己坚持学下去,防止再次半途而弃。现在我已经看到第九章了,所以前面的几部分都是我补写的。这个笔记我想这样写,一般一篇对应书上一章,每篇分两部分内容,一是本章的主要内容和我的理解和体会,二是本章中我的疑点。本人才疏学浅,恳请大家多多指正。 第一章 delphi5下的windows编程 虽然本章内容不多,但有几个概念我还是第一次接触: 1、无约定的编程方式 与传统的WINDOWS程序(就是直接用API的SDK编程)相比,delphi中一般不需要直接对WINDOWS消息进行处理,DELPHI通过事件机制对WINDOWS消息机制进行了封装。程序员可以在事件的处理中实现对WINDOWS消息的处理。无约定的编程方式是指程序员可以在DELPHI的事件处理程序中什么事都不做,系统照样可以正常运行。因为DELPHI会自动调用这个对象类的基类中的消息处理过程来处理消息(我不太清楚“调用对象类的基类中的消息处理过程来处理消息”和后面第五章中自定义消息处理过程中用的“Inherited”的作用是否相同)。 虽然事件机制的无约定的编程方式不能对WINDOWS消息进行直接灵活的控制,但可以使你在对WINDOWS消息机制还不太清楚的情况下也能进行WINDOWS程序设计。当然如果你的水平很高,也可以绕开事件机制,直接对WINDOWS消息进行截获和控制,也就是说DELPHI对不同层次的人都是适用的。说到这里,我又想起大富翁上早期一个比较delphi和VB的帖子,把VB比喻成傻瓜像机,把delphi比喻成带傻瓜功能的专业像机,真是形象。 2、加速原型化 用户界面的设计和程序的布局就称为原型化。相信用过API编程,再用可视化编程环境的人对这一点都是非常认同的。 总结 本章是全书的引入,没什么实际内容,讲了讲DELPHI的产品家族历史。然后对DELPHI的IDE(集成开发环境)做了一些介绍,完成了DELPHI下最简单的一个例程。虽然自己用DELPHI这么长时间了,说实话,对它的IDE环境还是很不熟悉,我想主要是看书看得多,但动手动的少的原因,很多菜单、快捷键和功能从来都没用过,今后一定要多动手,连开发环境都不熟悉,怎么用的得心应手呢?“公欲善其事,必先利其器”就是这个道理吧。 万事开头难,终于写完了自己的第一篇笔记,也不知道自己讲的对不对。希望大家多多鼓励,多到留言板提出宝贵意见。 第二章 object pascal语言(上) 这一章内容很丰富,可以说就是一本object pascal的语法书。介绍了object pascal语言的基本语法和语义,内容包括:注释、变量、运算符、函数、过程和类型,还对面向对象编程、对象、域、属性、方法、Tobject、接口、异常处理和RTTI等方面。 我以前看过一点object pascal方面的语法,所以对前面的一部分内容看得较快,从字符串以后看的稍认真一点。 一、注解 object pascal支持三种注解:{}、(* *)、// 需要注意的是,object pascal中注解不能嵌套。 二、函数和过程的新特征 1、当过程或函数没有参数时,圆括号可以省略。 2、从delphi4开始引入了函数重载的概念。需要重载的函数要用overload声明。如: procedure hello(i:integer);overload; procedure hello(i:string);overload; procedure hello(d:double);overload; 但重载要小心使用,因为重载使程序的执行和调试更加困难,所以对重载既不要回避,也不要滥用(那么为什么还要用重载呢,重载有什么好处呢,是不是不得已的办法呢?)。 3、缺省值参数 当过程或函数有缺省值时,调用时可不提供参数。 声明有缺省值参数的函数或过程时,在参数类型后加一个等号和缺省值就行了。 如:procedure abc(s:string;i:integer=0);在调用该过程时,可以两个参数都指定,也可只指定一个参数,另一个用缺省值。 如:abc('hello',26); abc('hello'); 使用缺省值参数的规则: 只能放在参数列表的最后;必须是有序类型、指针类型或集合类型;必须是数值参数或常量参数,不能是引用参数或无类型参数。 三、变量 在object pascal中,变量声明通常和变量初始化分开。在var块中,只能对全局变量赋初值。delphi会自动对全局变量赋初值,当程序开始时,所有整形变量赋为0,浮点数赋为0.0,指针赋为nil,字符串赋为空工,所以在源代码中,不必为全局变量赋零初值。 四、常量 在object pascal中,对常量赋初值时,通过不必声明常量的类型,如果指定了常量的类型,delphi会把这个常量当作赋初值的变量。在程序中,常量值是只读的,不能试图改变。 五、运算符 只谈谈按位运算符,这种运算符能修改变量的单独各位,如把一个数按位左移(shl)或右移(shr),或对两个数按位执行与(and)、或(or),取反(not)、异或(xor)运算。 六、object pascal类型 1、object pascal最大的特点是数据类型特别严谨,这是pascal编译器一贯的风格,属于强类型语言,basic属于弱类型语言,变量不声明就可以使用,害人不浅。 2、在字长不同的计算机中,一个字符在长度上并不一定就是一个字节,所以不要想当然的认为一个字符就是一个字节,应该使用sizeof()函数,返回类型或实例的长度。 3、还要特别注意字符串,ansistring字符串是delphi缺省的字符串,它的长度没有限制,最长可达4G,并且是生存期自管理类型,即它是动态分配的并且在它离开作用域时就自动释放资源,最重要的是它以null结束,和windows系统的字符串兼容,它能被当作pchar使用,但还要强制转换成pchar类型,需注意的是,使用了把ansistring类型强制转换成pchar的函数或过程后,要手工把它的长度恢复为原来以null结束的长度,用realizelengh()函数来恢复。所以一般情况下应尽可能使用ansistring,因为它是生存期自管理类型,而pchar的分配和释放是人工操作的。只有在用到api函数时,用pchar类型比较简单。ansistring类型有引用计数功能(指几个字符串能指向相同的物理地址,复制字符串仅是复制了指针,而不是复制实际的字符串,所以速度很快,只有当它改变后,系统才会为它实际分配空间,把修改过的字符串复制到自己的空间,并释放一个引用数)。我们常用的string类型当编译指示$H为正时是ansistring类型,当$H为负时是shortstring类型,就是我们在DOS下的pascal中使用的字符串,和widows api使用的字符串不兼容,大家要注意。 4、变体类型 variant。delphi2开始引入变体类型,主要是为了支持ole自动化操作。因为它在编译期类型是不确定的,能够在运行期动态改变类型。它是生存期自管理类型,可以支持所有简单数据类型,可以强制类型转换成简单类型。 如:var v:variant; begin v:='hello world';//是字符串类型 v:=1; //是整数 v:=3.14; //是浮点数 string(v) //把它强制类型转换成字符串型 v:=true; //是布尔型 v:=createloeobject('word,basic');//是ole对象 注意,由于要对variant类型进行兼容性检查,并进行必要的转换,所以导致额外的开支较多,最好不要使用variant类型,如确实要使用,最好先显式的对variant进行强制类型转换。 七、用户自定义类型 1、数组 object pascal允许建立除文件类型外的各种类型数组。注意:object pascal中数组的下标不一定从0开始,如,a:array[28..36] of integer; 该数组的下标就是从28开始的,所以在for循环中使用数组时一定要小心。hign(数组变量名),low(数组变量名)函数分别返回数组的下标的上边界和下边界。 object pascal编译器特别允许,字符数组的下标通常从0开始,这样它就能传递给需要pchar类型的函数。 2、动态数组 动态数组在编译时不知道它的维数,可在运行时动态分配。它在声明时不指定维数。如:a:array of string; 在使用动态数组前,要用setlengh()过程为动态数组分配内存,如:setlengh(a,33),为数组a分配33个元素的空间。以后就可以象访问普通数组一样来访问a。动态数组的下标通常以0为基准,并且是生存期自管理类型,用完后不需要显式释放。如果在离开作用域前需要手工释放,把nil赋值给动态数组即可,如a:=nil; 也可以定义动态数组,声明如下 a:array of array of integer; //声明一个两维的动态数组 setlengh(a,3,5);//给刚声明的动态数组分配内存 a[0,2]:28;//给分配过空间的动态数组赋值 3、记录 定义记录: type a=record i:integer; j:string; end; 使用记录: var x:a; begin x.i:=30; x.j:='hello'; .....; end; 4、集合 集合是object pascal特有的数据类型。它表示一组有序数、字符、或枚举值。一个集合最多只能有255个元素,并且元素只能是有序类型。声明如下: type x=set of 1..10; //集合x的可能值为1到10 使用集合: a:set of 1..10; a:=(1,3,5,7); 集合的操作符: 关系运算符:in,用来判断一个元素是否在一个集合中,if (3 in a) then... 增删运算符:+或include()过程用来在集合中增加元素,-或exclude()过程用来在集合中删除一个元素。如a:=a+[2];exclude(a,2); 交集运算符:*,a*b产生集合a和b的交集。 5、对象 在object pascal中,对象类型也可当作记录类型,只是它还包括函数和过程。delphi中的对象和c++中的对象在内存中的布局不一样,在delphi中不能用c++的对象,反之也一样。 定义对象: type 对象类型名=class(父对象名) 变量定义; 函数和过程定义; end; 6、指针 指针表示内存的位置。object pascal中能用指针类型是pointer,它是列类型指针,只指向内存地址,不管数据类型,所以建议大家使用有类型指针。有类型指针,在type部分用^(或pointer)运算符声明: type a=^integer; //a是指向integer类型的指针 foo=record s:string; i:string; end; a1=^foo; //a1是一个指向记录的指针 var p:poin |
帖]delphi5开发人员指南学习笔记(1)
最新推荐文章于 2024-01-16 08:29:31 发布