原创作者sun28
BCB和Delphi互用是很方便的。特别是在BCB中使用Delphi程序,有时候几乎什么都不用改就可以使用。众多C++程序员一直希望Borland公司能够将VCL用C++改写,就现在地情况来看这个愿望很难有实现的一天。我不知道Borland公司是否有修改的打算,但BCB和Delphi互用的这一特性一直是Borland公司引以为傲的一点之一。从其员工的文章中就可以看出这一点。这也是使用BCB和Delphi的好处之一,因为可以进行代码共享,减少了很多重复性的工作,这无疑是一种创举。也正是这一功能使得程序员在工作的时候可以随意地选择工具(BCB或Delphi)。
BCB和Delphi的特点:
Delphi能够最大限度的让程序员容易的生成性能很高的、功能强大的组件、应用程序和对象。
BCB允许程序员运用以灵活,巧妙,功能强大而闻名的C++语言编写程序。
BCB和Delphi代码共享的好处:
程序员可以随意地选择适用的工具(BCB或Delphi)进行编程。BCB和Delphi之间的代码共享让程序员不用担心代码是用什么工具编写的。也不用担心一个工具中编写的代码会不会不别另一个工具所认同。而是集中精力用最快的方法去建立你解决问题的模式。然后在BCB或是Delphi中编译。在BCB中使用Delphi比在Delphi中使用BCB更容易,但她们之间的代码在一定程度上都是可以互用的。
BCB和Delphi的代码共享,促进了代码的重复利用。C++和Pascal有很多共性,使得她们共享代码成为可能。C++编译并不比Pascal快。相反由于BCB中使用的是Pascal编写的VCL,因此BCB生成的应用程序比用Delphi生成的应用程序要稍微大一点。当然这一点在今天来说已经无关紧要。
Delphi使用非常简单,语法简单让程序员更容易理解。这使得公司里的新手可以快速的上手,投入到项目中去。参与项目的程序员可以同时使用BCB和Delphi工作。
由于Delphi简单易使,因此非常适用于一些时间要求紧迫的项目。即使你是使用C++的老手,你也可以在时间紧迫的时候选择Delphi来编制程序。然后你也可以再用BCB来编译他们,如果你想这样干的话。这并不会增加你的工作量。
在BCB中可用的Delphi代码
代码形式 说明
Delphi源代码单元和对象 直接编译
Delphi Form 有的版本可以直接编译,有的需要手工改动
Delphi中的函数,方法,结构等 一般情况下可直接编译
Delphi组件 一般情况下可直接编译
Delphi包 直接编译
Delphi生成的COM,DLL,ActiveX,OLE
直接编译
Delphi生成的Obj,lib文件 直接编译
在Delphi中可用的BCB代码
代码形式 说明
BCB源代码单元和对象 需要手工改动
BCB Form 需要手工改动
BCB中的函数,方法,结构等 需要手工改动
BCB组件 需要手工改动
BCB包 ????–没试过!
BCB生成的COM,DLL,ActiveX,OLE
直接编译,代码共享的主要方式
BCB生成的Obj,lib文件 一定条件下可以,比较麻烦
将Delphi代码变为BCB代码
有时Delphi应用程序与C++ Builder应用程序可能需要相互转换。这种转换虽然费时,但并不困难(顺便说一句,进行转换时,我将Delphi与C++ Builder同时运行)。这里只想介绍将Delphi变为C++Builder的过程,反过来也差别不大。将Delphi变为C++ Builder主要有两步。第一步是将Delphi应用程序窗体复制到C++ Builder项目中,第二步是修改Delphi代码。一般情况下这都是没有必要的,除非你想改写为C++代码。下面详细介绍这两个步骤。:
首先要复制Delphi窗体到C++ Builder应用程序中。Delphi窗体与C++ Builder窗体使用相同的基本格式,但至少有一大差别。显然,窗体文件包含窗体本身和窗体上每个构件的尺寸和位置。但窗体文件中也还包含事件信息。具体地说,窗体文件包括窗体及其构件所建事件处理器的描述。在Delphi窗体文件中,事件引用的事件处理器是Delphi方法,而在C++ Builder窗体文件中,事件指向C++ Builder事件处理器。自然,要删除Pascal引用才能在C++ Builder中使用窗体。你不一定要知道这些细节,但将Delphi转为C++Builder时必须考虑这个因素。复制Delphi主窗体的步骤如下:
打开Delphi项目并记下主窗体文件名及其Name属性。
切换到C++ Builder中,选择主窗体,将Name属性变为与Delphi项目主窗体同名。
保存C++ Builder项目,保存主窗体单元,用Delphi中窗体的同一文件名(除去.PAS扩展名)。将项目存为与Delphi项目相同的名称。
切换到Windows Explorer中,将Delphi的项目目录中的主窗体窗体文件(.DFM文件)复制到C++ Builder项目目录中。一定要复制文件并不是移动文件。Windows Explorer警告说目标目录中已经有同名文件。单击Yes改写C++ Builder目录中的窗体文件。如果没有这个警告,则一定是保存C++ Builder项目时出了错。
切换回C++ Builder,出现一个对话框,说Module xxx.cpp’s time/date has changed. Reload?单击Yes重装窗体。窗体重装后,即会包含Delphi窗体中的构件。
确保窗体选中并选择C++ Builder主菜单中的Edit|Select All选择所有窗体的构件。然后选择主菜单中的Edit|Cut和Edit|Paste,这样就把各个构件的所有声明放到主窗体的头文件中。这时要从C++ Builder窗体文件中删除所有Delphi的事件处理器的引用,这很简单:1.选择C++ Builder主菜单中的File|Save或单击工具条上的Save File2.C++ Builder会显示每个事件处理器的消息框。每次出现对话框时单击Yes,以便删除所有事件处理器。也许要单击Yes几十次才能删除所有事件处理器(我曾为一个窗体删除100个事件处理器!)。这样就复制了窗体,可以转入代码转换了。说明Delphi应用程序中的每个窗体都要重复上述步骤。
转换代码从Delphi向C++ Builder转换代码要比复制窗体复杂得多,有许多方法可用,但我用的方法如下:首先要找出编程人员(而不是Delphi)生成的各个变量和方法。
找到Delphi单元中的主窗体类声明。
记下private或public部分声明的各个变量和方法。
将这些声明复制到剪贴板上。例如,Delphi类声明可能如下所示:private{ Private declarations }DrawColor : TColor;procedure DoDrawing;function SetDrawColor :Integer;这里要复制DrawColor、DoDrawing和SetDrawColor的声明。
切换回C++ Builder,在代码编辑器中显示主窗体的头。找到private部分并粘贴剪贴板中的代码。
将粘贴的声明转换为C++语法。例如,第3步的声明可能转换为如下:private: // User declarationsTColor DrawColor;void DoDrawing();int SetDrawColor();
切换回Delphi。在Delphi单元的implementation部分,找到类声明中声明的方法(这里为DoDrawing和SetDrawColor),将Delphi单元中的方法复制到剪贴板上。
切换到C++ Builder中,将第6步复制到剪贴板上的方法粘贴到窗体源单元中。将方法的Pascal语法转换为C++语法。别管函数体和begin与end语句,这些将在后面处理。下一步要将Delphi单元中的事件处理器的代码复制到C++ Builder单元中。我认为最好的办法是从Delphi单元的implementation部分开始往下干。遇到Delphi单元中事件处理器时的做法如下:1.记下事件处理器名,如果是Button1Click,则表示构件Button1的OnClick事件的事件处理器。2.将事件处理器代码复制到剪贴板上。3.切换到C++ Builder中,产生与复制代码的事件处理器相符的事件处理器。4.将Delphi代码从剪贴板粘贴到事件处理器中。对Delphi单元中每个事件处理器重复1到4步。完成之后,C++ Builder项目中就有几个事件处理器了。这些事件处理器包含Pascal代码,还要变成C++代码。这可以利用C++ Builder Replace Text对话框进行。下表列出了寻找的Pascal语法和替换的C++语法文本。寻找和替换文本中的空格用小句号表示。通常应按表的顺序进行寻找和替换操作。
Delphi转化为BCB的替换文本:
Delphi文本 替换为BCB文本
等于操作符 == ==
赋值操作符:= =
不等操作符<> !=
成员操作符. ->
字串引号’ ”
开始说明{ //
结束说明} 无
Pascal True关键字True true
Pascal False关键字False false
if语句 if if(
块首begin {
块尾end; }
块尾(第2种形式)end }
Pascal then语句then )
Pascal do语句.do. 无
Pascal not语句not. !
Pascal nil关键字nil NULL
Pascal case语句case switch(
Pascal case语句.of ){
Pascal self关键字Self this
进行寻找与替换时,应使用Replace All选项,但使用时应小心。例如:不能在文件开头将所有句号换成>,因为每个C++ Builder源单元前几行包含带文件名的include语句。一定要先将Pascal说明语句(以{开头,}结束)换成C++说明,然后再替换begin和end语句。替换as end之类的单词时,应在Replace Text对话框中打开Whole words only选项,这样就保证不会误换长字中的各个字符。注意,有些寻找与替换会带来不良的后果(如把分开文件名及其扩展名的句号换成>)。进行寻找替换操作后,文件就混合了Pascal和C++,接下来要手工完成余下的转换工作,要对每种语言有充分的了解,才能将Pascal语法转换成C++语法。从此你可以随心所欲地处理了,我只想指出转换时要注意的几点。首先,C++没有对应Pascal with语句的项目,以下列代码为例:with MyForm do beginWidth := 200;Height := 500;Caption := ‘Hello there’;end;转换成C++ Builder时,要具体引用每个属性:MyForm>Width := 200;MyForm>Height := 500;MyForm>Caption := ‘Hello there’;另一个较难转换的Pascal语句是as语句。Delphi程序中通常会这么干:with Sender as TButton doClick;转换成C++ Builder时则应这么干:TButton* button = dynamic_cast(Sender);if (button)button>Click();另一个需要特别注意的是字串处理。Pascal的字串操作函数能处理String数据类型,而C++ Builder则用AnsiString类的字串操作函数。以下列Pascal语句为例:x := StrToInt(Edit.Text);转换成C++ Builder时代码如下:x = Edit>Text.ToInt();集合也是Delphi的转换成C++ Builder时的一个难题。第5课”C++类框架与可视化构件模块”中介绍过集合,其中介绍了Pascal与C++ Builder中如何处理集合。
复用窗体:
也可以不把Delphi转换成C++,可以在C++ Builder中直接使用Delphi窗体。只要将窗体的.PAS文件直接加进C++ Builder项目中。C++ Builder即会生成Delphi单元的头,可以在任何引用Delphi窗体的C++ Builder单元中使用。说明尽管可以将Delphi窗体直接加进C++ Builder项目中,但不能用C++ Builder窗体设计器编辑这个窗体。窗体的图形化修改只能在Delphi IDE中进行,而C++ Builder IDE中只能对窗体进行文本式编辑。为了对窗体进行文本式编辑,选择C++ Builder窗体设计器弹出菜单中的View As Text选项。
——Delphi与C++ Builder的竞争性小于互补性。如果知道如何用C++Builder编程,就很容易用Delphi编程。从Delphi转向C++ Builder的困难在于C++语言的复杂性,但如果要从Delphi转向C++ Builder,则至少比从头学一个新的框架快。毫无疑问,同时熟悉C++ Builder和Delphi能使你的编程水平更高。