http://it.chinawin.net/softwaredev/article-1127c.html
BCB和Delphi的互用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,OLEDelphi生成的Obj,lib文件 直接编译 在Delphi中可用的BCB代码代码形式 说明 BCB源代码单元和对象 需要手工改动 BCB Form 需要手工改动 BCB中的函数,方法,结构等 需要手工改动 BCB组件 需要手工改动 BCB包 ????--没试过! BCB生成的COM,DLL,ActiveX,OLEBCB生成的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能使你的编程水平更高。
|
请发表评论