dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
阅读:1063回复:0

一个C++程序员的Delphi学习笔记

楼主#
更多 发布于:2001-09-19 13:29
                  一个C++程序员的Delphi学习笔记

   说心里话,站在一个C++程序员的立场,是有那么一点看不上用Delphi的开发者的。就几周前,我还撰文维护过C++的尊严。种种原因,今天我却须学习Delphi、熟悉Delphi,不由兴起人生无常的感慨。

   我给了自己十五天的时间,不知够否掌握一门语言?我选择了Marco cantu的《Delphi从入门到精通》及《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是如何将这种种语言的成份,组装成为开发的利器。(续待)





--------------------------------------------------------------------------------------------------
对该文的评论

      zzlyfirst ( 2001-9-19 12:56:37 )  

工具或是语言不是绝对的,关键还是使用者的能力,
精通一门语言就够了,但delphi不会让你失望的,你漫漫回知道,
他的优势在生产效率
 
      k2 ( 2001-9-19 11:03:53 )  

听课来了。
 
      IAmKylix ( 2001-9-19 9:16:09 )  

我是学了Delphi之后学的C++,觉得差不多,说实话学C++的时间比Delphi的时间少得多,不是因为C++简单,而是Object Pascal和C++在本质上没什么太大的区别。
现在我不用Delphi了,但我觉得工具或是语言不是绝对的,关键还是使用者的能力。
 
      edd ( 2001-9-19 0:49:56 )  

需要这么认真学吗?我到一个新公司,叫我用c++builder(和dephi大同小异),我以前就用过vc和gcc,不一样的作吗,根本一本书都不看,就看帮助和到这里提问,叫我做的东西,我不比那些一直用c++builder开发的人慢多少,15天我觉得时间还多了。
 
      Borland_Delphi ( 2001-9-18 22:17:03 )  

16.属性和事件??真是为VCL量身定制的语言啊。其实属性和事件并非面向对象的必要元素
-
不敢苟同,呵呵
 
      Dream_soft ( 2001-9-18 21:59:30 )  

这么多朋友关心,实在让人感动啊。谢了,各位。
    其实十五天是自己给自己订下的时间,看来是完不成了。这不,都四天了,才学到窗体:)。我是一边学习一边写笔记的,所以会有很多理解上的问题。请懂的朋友指出来啊,我会学下去,也会写下去的。
    to qinghou:
    的确,聚合不可能完全代替继承,但在两者同时适用的条件下,应该选择耦合较为松散、封装更为完全的聚合。
    to sas:
    只是表达一种理解,没有说Delphi学Java的意思。如果你要看到我前几周写的比较文章,那还不给气歪了(开个玩笑,不过可以在我的站点www.hisee.net看到。)
    其实InterFace作为一种语言本身的特征,是不应该同所支持的技术相混杂的。如果Delphi只支持Com,可以这样设计,没问题,因为用的人都知道QuaryInterface是什么。但如果是Corba程序员,是不是也得知道Relese和引用记数??
    我个人认为,做为通用特征的语言,如果过多同所支持的某种技术相混杂,对语言本身的纯一性是有影响的。对某一特定技术的便利,不是导致对相异技术支持的笨拙,就是因重复支持而导致复杂性。
    我想,这种权衡应该存在所有工程领域,不单单限于程序设计。在数学上来说,这就是不美。爱因斯坦追求大一统,也是为了避免混杂的丑啊。
 
      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 Pascal(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我是很拿手的,看起Delphi来也觉得很亲切,只是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一定要学。也希望大家多多指点。谢谢!
我的信箱:[email protected]
 
      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++中好些需高度技巧的资源释放问题。但为什么不能和except一起使用?不太明白。

就是就是!
 
      Nizvoo ( 2001-9-17 13:25:15 )  

我想这位兄弟为什么要来delphi实在搞不懂。


_______________________________________________________________

多多交流    共同进步
[email protected]
http://nizvoo.myrice.com
_______________________________________________________________

 
转载于[a]http://www.csdn.net[/a] [ 2001-9-19 14:40:10 Admin 修改 ]
当个好的屠夫一直是我的梦想
游客

返回顶部