发信人: lizhenguo (夸父·追日), 信区: BorlandDev
标  题: 一个C++程序员的Delphi学习笔记     
发信站: 哈工大紫丁香 (2001年09月18日20:38:06 星期二), 站内信件

一个C++程序员的Delphi学习笔记
                  一个C++程序员的Delphi学习笔记
   说心里话,站在一个C++程序员的立场,是有那么一点看不上用Delphi的开发者的。
就几周前,我还撰文维护过C++的尊严。种种原因,今天我却须学习Delphi、熟悉Delph
i,不由兴起人生无常的感慨。
   我给了自己十五天的时间,不知够否掌握一门语言?我选择了Marco cantu的《Delp
hi从入门到精通》及《Delphi高级开发指南》作为学习用书。第一本书名叫《从入门到
精通》,但如果你不熟悉一门OOP语言,那这本书不合适你。对我,则正合适。二书总厚
度共一千五百页,嗯,一天一百页就差不多了,希望自己能做到吧。
   我决定如实记下自己的思考与困惑,做为自己进军新领域的记念,也希望能为后行的
同路者提供一点帮助。
一 环境
   "工欲善其事,必先利其器",对开发环境的熟悉是非常重要的。不同于VC的MDI界面
,Delphi采用了多个独立窗体设计。这是否预示Borland更提倡组件间进行对等的交互?
我暗暗猜测着。
1.Desktop设置是可以与Project分离的,而且Desktop设置优先于Project设置。
2.To-Do列表无论是用于提醒自己还是别人,都是好工具。
3.AppBrowser感觉上很相似于VC的主界面。也提供了符号提示,Code Completiont等功
能。嗯,还有VC所没有的Class Completion,可以在声明和实现间双向自动补完。
4.Project Group的概念,有点像.net平台中的Solution,不过.net是多语言协作的。
二 语言
   Delphi的核心是VCL库,其基础是Object Pascal。《从入门到精通》用两章的篇幅细
说"Object",却只字没有提到"Pascal"。嗯,还好,我隐隐记得。
1.Use用于引用外部单元。与头文件不同,Use没有传递性。
2.Delphi使用引用对象模型,对象变量只持有对象引用,不再持有对象本身,所有对象
手动自堆中分配。
3.Delphi的封装很奇怪,类成员访问权限的设定,只对单元外部起作用。在单元内,可
以自对象外部任意访问类私有成员。朋友解释说相当于C++的友元,细想其实差异很大-
-友谊一定是双向的吗?(将Unit方式用作友元,A能访问B,B一定能访问A)友谊有传递
性吗?(将Unit方式用作友元,A能访问B,B能访问C,A一定能访问C)。在我看来,这
和友员的概念是不相容的。希望某天我能明白Delphi如此设计的考量。
4.在声明对象变量后,Delphi对象的实际生成需调用构造器。构造器是特殊的类方法,
自TObject继承并可重载。不使用关键字而用类方法构造对象,我认为这是单根继承的特
有用法。
5.书中有一段动态创建TButton的例子,使用Creat创建了对象,却没用Free显式的释放

。我疑心会发生内存泄漏,细细想来,该是由持有TButton的容器TForm来负责释放,朋
友证实了我的想法。Delphi以此避免了手动释放内存的麻烦。
6.Delphi的关键字很烦,长而多,要键入的地方也多。好处是能为编译器提供更多的信
息,用以查错和加快编译速度。
7.因着引用对象模型,不再有C++中直接对象访问无多态,只在指针和引用下多态机制才
起作用的问题。
8.用message直接指出方法可以处理的事件,唉,让我想起OWL时Borland对C++语言的相
似扩展,真是怀念。
9.大量使用动态类型转换,该是Pascal本就具有的特点吧?
10.窗体继承,好像连控件的属性都可以继承呢。
11.很奇怪的设计。有类方法,却不提供类变量,需用Unit级的变量来模拟。
12.如果我的猜想不错,控件的Events应该就是"对象方法指针"。
13.极强有力的机制:类引用,可用相同的形式动态建立不同的数据类型。C++中相似的
能力,怕要用Builder模式才行。
14.参数对象按引用传递,按引用赋值,只有部分类提供Assign方法复制对像。唉,C++
的值语意,好怀念。
15.Finally块!解决了C++中好些需高度技巧的资源释放问题。但为什么不能和except一
起使用?不太明白。
16.属性和事件??真是为VCL量身定制的语言啊。其实属性和事件并非面向对象的必要
元素。
17.我想VCL事件处理的委托模型,该是与JAVA相似的。只是Java的Listener可以处理多

个Listener的存在,Delphi的事件属性好像只能处理一个吧?不过处理速度上要快多了

18.a)从TComponent类继承,b)新构造程序,c)例行的Register,d)安装。VCL组件创建的
方便,真让人感动。
19.书上说VCL优于ActiveX,因为ActiveX没有完全的继承机制,我不敢苟同。聚合该是
先于继承选用的机制。
20.Interface,丑死了!!我甚至怀疑这是否Hejlsberg的设计。完全像是为Com支持临
时拼凑的语言成份,与整体毫不协调,像个外来户。接口本身是强大的东西,但糟糕的
设计会让它的使用成为一种痛苦。除了COM和多重继承没有选择外,我想是没人愿意用它
的。
   整个来说,Object pascal给我很深的映象。接下来就该学习VCL了,且看Borland是
如何将这种种语言的成份,组装成为开发的利器。(续待)
文章动态信息:
人气: 2536 得票数: 8票
对该文的评论
      linghuye ( 2001-9-18 20:07:12 )
我也是学了VC后再学Delphi的,Delphi确实不错,就是帮助文件太差劲了,而且老爱弹
出红叉框来吓我。
由于不熟悉Delphi自身的函数,我在Delphi里频繁调用API,这种感觉有点怪。:)
还有,VC与Delphi的调试,设断点 F5,F9 刚好相反,脑筋换不过来。:)
      sas ( 2001-9-18 20:03:55 )
继续评论:
1、Java的Package和Object Pascal的unit可以说概念上面完全相同。但是你要想一想,
Turbo pascal4.0,是什么时候,Turbo pascal4.0->5.0->5.50->6.0 -> Borland Pasc
al(7.0) -> Delphi1(8.0),到Delphi1出来的时候才有Java。
2、定义Interface不需要IIID,使用Interface ID的目的一个是使用QueryInterface,
另外一个目的是为COM。但是如果你的应用和COm无关,那么完全可以不定义Interface 
ID。
3、Object Pascal的Interface也用在Cobar。
4、使用Interface的时候,一般使用引用计数的形式管理对象生命周期,引用计数为0的
时候,对象被自动释放。Delphi可以自动对interface引用计数。另外也可以不使用引用
计数的形式管理对象生命周期,有兴趣的可以看看online help。
5、To-Do 在Delphi5增加。
6、unit里面不限制访问,很方便,比友元的形式简单多了。
      Focus ( 2001-9-18 18:07:02 )
确实不错
绝对高手
admire
我学了好久
只是会用而已
没有上升到这么高的理论高度
也许是因为书看得少吧
      rocks_lee ( 2001-9-18 13:47:16 )
to-do是Delphi6的新特性好像。
我也正在学习Delphi,不过我C++肯定没有诸位的娴熟了,但java我是很拿手的,看起D
elphi来也觉得很亲切,只是Pascal的语法快忘光了,老得查帮助,真衰:(
      handsome1234 ( 2001-9-18 13:03:05 )
请问“To-Do列表”是什么啊,我在delphi里没看到啊
      wantme ( 2001-9-18 10:33:22 )
C++程序员学DELPHI,就象大学生去学算数一样简单
      wk_knife ( 2001-9-18 9:54:45 )
我刚明白,是倒着看那
      wk_knife ( 2001-9-18 9:32:26 )
Delphi中就没有“友元”这个概念,为什么非要把C++的一套完整的照搬呢?仔细看书的
就会明白,Macro Cantu 也只是打了个比方。
      wk_knife ( 2001-9-18 9:25:13 )
前些日子,有心学习VC,借本书来看,看到DDV(好象有这么个东西吧)传递对话框的内
容,照例子输好后,运行,满意之余,想给Static Text的值也照搬一把,结果无论如何
也不行了。后来另翻一本书。哦,好不容易翻到个Updatawindows(如果错了不要介意,
你明白就行)才搞定,
我是很笨,VC似乎天生就不是让笨蛋来学的。所以就不学他了。
我是初学者,很有幸也得以找到Dream_soft 所说的两本书。对于CProgramer 和Dream_
soft关于友元的问题,我想如果仔细阅读了Macro Cantu的《Delphi高级开发指南》并不
会有此疑问吧。更何况Delphi中就不存在友元的概念,Macro Cantu之所以如此说,不过
是为了让C++程序员们比较容易理解。
      wao ( 2001-9-18 8:41:22 )
12.如果我的猜想不错,控件的Events应该就是"对象方法指针"。
错了。event实际上是一个闭包指针(closure).就是说这个指针包括:对象指针和方法指
针。
      Phoenix2000 ( 2001-9-18 8:03:59 )
不管 Interface 是不是为 COM 而特意设计的,不得不承认 Interface 确实是个好的设
计,它对 COM 有着天生的良好的支持,但并不仅仅局限于在 COM 中使用。我真希望 C
++ 里也能有这样的新的扩展。
      lslxch ( 2001-9-18 2:47:57 )
我是从C开始学Delphi的,刚好这两本书也是我的入门教材。
Delphi的封装刚开始也觉得奇怪,但是用得多了也习惯了。其实接口部分是对整个程序
公开的,包括class中的一部分和var部分,实现部分在同一个UNIT中都可访问。这种封
装很方便,只是命名空间太大,需要仔细选择符号名称。在类中可以申明类变量。
  type Tuser = class(TObject)
        b: TButton;
  private
        i: integer;
  end;
      3nt ( 2001-9-18 1:09:53 )
unit是从ada学来的。
      programhunter ( 2001-9-18 0:35:44 )
Delphi,那C++ BUILD又是如何去评价它呢。它们都是出于同一个娘胎的,而且有双生兄
弟的说法。
      shiqinglangzi ( 2001-9-17 23:41:56 )
厉害!厉害!这么短的时间能学成这样不愧是个高手,,我学了一年的delphi 数据库还
是那样菜!!不知道大家有什么捷径可走啊??请指点喔!!谢谢!!!
      kundeng ( 2001-9-17 22:56:22 )
没错没错,Delphi 1.0的主设计师就是Hejlsberg,他同时也参与了对SUN JDK1.0的设计

Internet开发群体均承认JDK 1.0是Borland为主写的,SUN的工作是在Borland编译器工
程师
的指导下写外围库。其实这个工作后来又被IBM做了一遍,他们写的库比SUN工程师要好
多了。
据李维说,Borland的工程师许多来自北欧,是公认的最有创意的一个开发群体。我非常

认同这个说法。
      alias ( 2001-9-17 22:28:52 )
我也来凑凑热闹,delphi已经用了挺长时间,但和各位比起来还是不行。我是由delphi
开始学编程的,应该谢谢它的好用和上手快的特点。当然其副作用是容易给人一种精通
的错觉,但用它做小的MIS真是方便。现在我正在学VC,它让我对编程的认识又深入了一
层,又感到头大,太多的类像蜘蛛网一样。哪位大虾能告诉我如何在VC中实现DELPHI中
DBGRID+TABLE+DATASOURCE的功能。我想说:DELPHI一定要用,VC一定要学。也希望大家
多多指点。谢谢!
我的信箱:alias3678_cn@sina.com
      qinghou ( 2001-9-17 21:31:17 )
3、我觉得这是Delphi里的一个败笔。在论坛上讨论过,有人说Borland这样做也是有原
因的,但我至今不知道什么原因。
12、你猜得没错:
type TNotifyEvent = procedure (Sender: TObject) of object;
13、然也。:-)
15、很多人提出过这个了,但在Delphi6中仍然没有改进,让大家都失望了。:-(
19、聚合该是先于继承选用的机制。为何?我觉得聚合是不可以取代继承的。
20、我不觉得Interface有何不便啊。你说的那些确实也没错,是有很重的COM的痕迹。
据说D6中对Interface有很大的改进,我还没仔细学习。
“C里面为了禁止头文件被包含两次进行的很龌龊的宏定义”,说得好,说得好:-)
有这么一种说法,说Delphi和Java的主设计师为同一人,Sun其实是在Borland的帮助下
设计出Java的。不知是真是假,不过感觉Delphi和Java确实很象。
      Dream_soft ( 2001-9-17 20:42:14 )
谢谢sas:)
   其实我知道Interface与com无关。但在语言设计时将[234234-1234-1234]这样的形式
引入,在Creat一个Interface时不用Free方法这些设计,明显是为Com与设计,所以我说
他设计的不好,与整体毫不协调。
   其实unit有点Java的package的味道,不是吗?
      budw ( 2001-9-17 20:29:53 )
呵呵,
用得越多,你就越会爱上她
当然记得到时常怀念C++;)
      sas ( 2001-9-17 19:42:27 )
1、Delphi的Interface和COM无关,可以完全独立开来。在Kylix(Delphi for linux)上
面也有。
建议你多看看Interface方面的说明
2、在相同unit里面访问类元素的域(field)和方法是没有限制的,简化了复杂的定义
。一个unit里面的各个类在逻辑上应该是高内聚的。毫无关系或者关系不大的类,没必
要放在一起。在概念上面和友元相似,但是使用简单。
3、pascal的关键字本身就比C多,体现的是易读的感觉,相对而言,C的风格喜欢使用符
号,一个程序块block,pascal使用begin end, c 使用 {};与运算,pascal使用and,
c使用&&。
4、仔细体会一下unit的概念,这是很多年前从turbo pascal开始有的,很漂亮,清晰的
声明部分、实现部分、初始化部分的划分。从某种意义上单元和类的概念相同,不过层
次更高。比C使用包含文件#include好了很多。大家想一想C里面为了禁止头文件被包含
两次进行的很龌龊的宏定义。下面来自微软的windows.h:
#ifndef _WINDOWS_
#define _WINDOWS_
....
#endif /* _WINDOWS_ */
      foxnt ( 2001-9-17 19:27:14 )
好极,一个C++程序员能在15天学到这样,的确是很认真。阁下水平确实不错,值得敬佩

      CProgramer ( 2001-9-17 18:35:02 )
3.Delphi的封装很奇怪,类成员访问权限的设定,只对单元外部起作用。在单元内,可
以自对象外部任意访问类私有成员。朋友解释说相当于C++的友元,细想其实差异很大-
-友谊一定是双向的吗?(将Unit方式用作友元,A能访问B,B一定能访问A)友谊有传递
性吗?(将Unit方式用作友元,A能访问B,B能访问C,A一定能访问C)。在我看来,这
和友员的概念是不相容的。希望某天我能明白Delphi如此设计的考量
我也不明白,当初我看书怎么看也不明白!
      classfactory ( 2001-9-17 14:41:01 )
Interface可是个好东西。
      fly_lee ( 2001-9-17 14:33:16 )
这才是会学语言的人!
      EdwinYeah ( 2001-9-17 14:23:30 )
>>15.Finally块!解决了C++中好些需高度技巧的资源释放问题。但为什么不能和excep
t一起使用?不太明白。
就是就是!
      Nizvoo ( 2001-9-17 13:25:15 )
我想这位兄弟为什么要来delphi实在搞不懂。

--
《列子·汤问》:“夸父不量力,欲追日影,逐之于隅谷之际。渴欲 得饮,赴饮河渭
。河渭不足,将走北饮大泽。未至,道渴而死。”

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.154]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.982毫秒