593249217
总版主
总版主
  • 注册日期2010-11-25
  • 发帖数385
  • QQ593249217
  • 火币969枚
  • 粉丝282
  • 关注1
  • 优秀斑竹奖
  • 特殊贡献奖
  • 幽默大师奖
  • 社区明星
阅读:9236回复:0

delphi语言转为bcb语言的注意事项

楼主#
更多 发布于:2010-11-26 02:05
delphi不区分大小写,bcb区分大小写
----------------------------
interger 转int
string 转String
----------------------------
if then 转if ()
else 转else
----------------------------
case of 转switch ()
1: 转case 1:
 转break;
end
----------------------------
for i=1 to 2 do 转for(int i=1; i<=2; i++)
----------------------------
while do 转while()
----------------------------
result 转return(立即返回)
----------------------------
inc(i) 转i++
dec(i) 转i--
----------------------------
动态数组aa
setlength(aa,6) 转aa.length=6;

----------------------------
create 转new
free 转delete
button1 is Tbutton 转button1->ClassNameIs("TButton")
Tbutton(button1) 转(TButton*)(button1)
----------------------------

. 转->
:= 转=
= 转==
<> 转!=
not 转!
and 转;; ;(运算) //在if,while等判断语句中,大部分的情况都是;;或||
or 转|| |(运算) //在赋值语句中,大部分都是;或者|,特别是int类型的
' 转" 字符串操作
----------------------------
delphi to bcb消息转换的处理
对于必须要继承父类消息的子类来说,因为bcb严格支持c++的私有成员的可见性,所以对于delphi中很容易实现的消息继承,
对于bcb来说变成了不可能,必须通过父类的保护对象wndproc来进行消息的继承,而不是通过消息映射。
比如对窗体大小的改变的消息处理
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, TWMWindowPosMsg, WMWindowPosChanged)
    END_MESSAGE_MAP(Controls::TCustomControl)
因为无法继承父类的消息,所以对于运行中窗体大小的改变,将无法实现。解决的办法就是通过WndProc函数进行处理
class TBaseList : public Controls::TCustomControl
void __fastcall TBaseList::WndProc(Messages::TMessage ;Message)
{
     TCustomControl::WndProc(Message);
     switch (Message.Msg)
     {
            case CM_DRAG:
                 doCMDrag(*(Controls::TCMDrag *)(;Message));  
            break;
            case WM_WINDOWPOSCHANGED:
                 doWindowPosChanged(Message);  
            break;
            case WM_LBUTTONDOWN:
                doWMLBUTTONDOWN(*(Messages::TWMMouse *)(;Message));
            break;
            case WM_KEYDOWN:
                doWMKeyDown(*(Messages::TWMKey *)(;Message));
            break;
            case CM_WANTSPECIALKEY:
                doCMWANTSPECIALKEY(*(Messages::TWMKey *)(;Message));
            break;
            case WM_KILLFOCUS:
                doWMKillFocus(*(Messages::TWMSetFocus *)(;Message));
            break;
            case CM_FONTCHANGED:
                doCMFontChanged(*(Messages::TMessage *)(;Message));
            break;
     }
}
void __fastcall TBaseList::doCMDrag(Controls::TCMDrag ;Message)
void __fastcall TBaseList::doWMRBUTTONDOWN(Messages::TWMMouse ;Message)

----------------------------

注意事项:
1,判断语句if (a=2)对应if (a==2),最常见错误if (a=2)
2,与或运算a:=b or 1对应a=b | 1,最常见错误a=b||1
3,bcb中case每条都要有对应的break;
4,result在delphi中并不返回,但是bcb,return就立刻返回了,注意return放置的位置
5,delphi中同一单元中定义的类可以互相访问其它类的私有成员,但是bcb很严格,不可以
6, delphi中的整除用div,bcb中/的左右两边如果是整数就代表整除了,delphi中的/代表浮点数运算而bcb中则要强制转换,比如4/12在delphi和bcb中是不同的结果
7, 区域赋值的问题要注意lpRect.BottomRight的赋值是points[1] = Point(lpRect.Right, TreeRect.Bottom); 而不是points[1] = Point(TreeRect.Bottom, lpRect.Right);----------------------------------------------------------------------补充:1,安装控件需要在类名前加PACKAGE,class PACKAGE TACTreeView : public TTreeView

2,namespace后面的变量必须是第一个字母大写,其他小写,否则编译通过,也安装不到bcb的控件面板上
//==============================================================================
namespace Actreeview
{
    void __fastcall PACKAGE Register()
    {
         TComponentClass classes[1] = {__classid(TACTreeView)};
         RegisterComponents("Sample", classes, 0);
    }
}
//==============================================================================
3,一但安装控件成功,就不能更改控件所在的面板了,比如Actreeview安装到Sample面板,即使更改了Sample为Sample2005,也不能安装到更名后的面板上,即使删除了Sample面板
问题解决:component ->configure palette->将Sample面板的控件移动到Sample2005,然后保存退出,重新编译Actreeview,就可以安装新的面板上了。

4,如果头文件引用了其它的单元,在实现代码cpp文件中,必须链接其他单元才能作为组件编译,否则会报函数未实现错误。
例如:头文件#include "AdTreeView.h"
在cpp文件中#pragma package(smart_init)的下面,要加上:
#pragma package(smart_init)
#pragma link "AdTreeView"

5, 头文件中全局常量一定要加static,否则容易引起编译通过,连接不断增长的情况,定义了重复的全局变量也会引起这种情况。
namespace Adtreeview
{
static const int PowerHeight = 20;
static const int lpTextFlag2Line = DT_SINGLELINE | DT_NOPREFIX;
...
}
不要在头文件类外面定义任何变量和常量,如果要定义需要加上#define或extern

6,路径问题,特别是应用自己编译的bpl的时候,bcb的lib路经和project的lib路径里面都有相同的bpl,但是版本不同的时候,
很容易引起编译的bpl和运行时的bpl不是相同的bpl,导致程序运行时无法定位到类或函数。

7,  当出现link错误时,如果是下面这3个,不要怕,重新编译一次就过了!
  [Linker Error] Fatal: Access violation.  Link terminated.
  [Linker Error] Fatal: Error detected (LME279)
  [Linker Error] Fatal: Error detected (LME347)

8,如果出现设计期控件放在有些窗体能运行,有些不能运行,报未找到该类的错误,但是动态创建没有问题的时候,当排除所有已知的错误后,可以看看
 #pragma option push -w-inl
 /* TCustomForm.CreateNew */ inline __fastcall virtual TForm(Classes::TComponent* AOwner, int Dummy) : TCustomForm(AOwner, Dummy) { }
 #pragma option pop
 #pragma option push -w-inl
 /* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }
 #pragma option pop
bcb会为没有构造和析构的类自动创建如上的内联函数,如果你的类已经有了构造或析构函数,就要删除它自动给你添加的构造或析构函数。

9, delphi:    WMLButtonDown(TWMLButtonDown(Msg);    转bcb: WMLButtonDown(*(TWMLButtonDown*)(;Msg));

10, delphi: mod 转bcb: %

11, 再次强调,delphi中的整除用div,bcb中/的左右两边如果是整数就代表整除了,delphi中的/代表浮点数运算而bcb中则要强制转换,比如4/12在delphi和bcb中是不同的结果,如果一样,bcb要这样写 (float)4/(float)12

12, delphi: @ 取地址 转bcb: ;

13, delphi:
            FOnSelected(PIniStructure(FIniFileInfo.Objects[posIndex])^.FileName,bmp);
    bcb   :
            FOnSelected(((PIniStructure)(FIniFileInfo->Objects[posIndex]))->FileName,bmp);

14, delphi:         FBmpW, FBmpH: Integer;
                    bmpW, BmpH: ^Integer;
                    bmpW@ =FBmpW;  
    bcb:            
 int FBmpW;
 int FBmpH;
 int *bmpW;
 int *BmpH;
        bmpW = &FBmpW;

15,delphi:
           PIniStructure= ^TIniStructure;
           TIniStructure=record
           Character: String;        //输入符号
           FileName : String;        //GIF文件名
           Hint     : string;        //提示
           end;
      lpIniStructure: PIniStructure;
      new(lpIniStructure);

   bcb:
      struct TIniStructure;
      typedef TIniStructure *PIniStructure;
      lpIniStructure  = new TIniStructure;
    PIniStructure lpIniStructure;
    lpIniStructure  = new TIniStructure;

16,delphi:
    FsbFontBold.Anchors := [akLeft,akBottom];
   bcb:
    FsbFontBold->Anchors << akLeft <<akBottom;
17,delphi:
        if ssLeft in FMouseType then
   bcb:
        if (FMouseType.Contains(ssLeft))
18,delphi:
   Windows.SetParent(Handle,0)
   bcb:
  ::SetParent(Handle, 0);
19,delphi:
   CallWindowProc(DefWndProc, Handle, WM_SETFOCUS, 0, 0);
   bcb:
   ::CallWindowProc((int ( __stdcall *)())DefWndProc, Handle, WM_SETFOCUS, 0, 0);
20,delphi:
   if ((Key>=#32 and (Key<<=#255))
   bcb:
   if ((Key>=(char)32 ;; (Key<<=(char)255))
21,delphi:
   if (TWMKey(Message).CharCode == VK_RETURN)
   bcb:
   if (((TWMKey*);Message)->CharCode == VK_RETURN)

22,  delphi:  GetMem(FDrawData, FDataSize);
    bcb   :  FDrawData= (char*)malloc(FDataSize);

喜欢0 评分0
多一分钟时间学习,就多一份技术!
游客

返回顶部