当前位置:文档之家› 将DELPHI代码变为BCB代码

将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主窗体的步骤如下:1.打开Delphi项目并记下主窗体文件名及其Name属性。

2.切换到C++Builder中,选择主窗体,将Name属性变为与Delphi项目主窗体同名。

保存C++Builder项目,保存主窗体单元,用Delphi中窗体的同一文件名(除去.PAS扩展名)。

将项目存为与Delphi项目相同的名称。

3.切换到Windows Explorer中,将Delphi的项目目录中的主窗体窗体文件(.DFM文件)复制到C++Builder项目目录中。

一定要复制文件并不是移动文件。

WindowsExplorer警告说目标目录中已经有同名文件。

单击Yes改写C++Builder目录中的窗体文件。

如果没有这个警告,则一定是保存C++Builder项目时出了错。

4.切换回C++Builder,出现一个对话框,说Module xxx.cpp's time/date has changed.Reload?单击Yes重装窗体。

窗体重装后,即会包含Delphi窗体中的构件。

5.确保窗体选中并选择C++Builder主菜单中的Edit|Select All选择所有窗体的构件。

然后选择主菜单中的Edit|Cut和Edit|Paste,这样就把各个构件的所有声明放到主窗体的头文件中。

6.这时要从C++Builder窗体文件中删除所有Delphi的事件处理器的引用,这很简单:a)选择C++Builder主菜单中的File|Save或单击工具条上的Save Fileb)C++Builder会显示每个事件处理器的消息框。

每次出现对话框时单击Yes,以便删除所有事件处理器。

也许要单击Yes几十次才能删除所有事件处理器(我曾为一个窗体删除100个事件处理器!)。

这样就复制了窗体,可以转入代码转换了。

说明:Delphi应用程序中的每个窗体都要重复上述步骤。

转换代码从Delphi向C++Builder转换代码要比复制窗体复杂得多,有许多方法可用,但我用的方法如下:首先要找出编程人员(而不是Delphi)生成的各个变量和方法。

找到Delphi单元中的主窗体类声明。

记下private或public部分声明的各个变量和方法。

将这些声明复制到剪贴板上。

例如,Delphi类声明可能如下所示:Private{Private declarations}DrawColor:TColor;procedureDoDrawing;functionSetDrawColor: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 truePascal True关键字False falseif语句if if(块首begin{块尾end;}块尾(第2种形式)end}Pascal then语句then)Pascal do语句do.无Pascal not语句not.!Pascal nil关键字nil NULLPascal 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 dobeginWidth:=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时的一个难题。

复用窗体:也可以不把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能使你的编程水平更高。

相关主题