总版主
- 注册日期2010-11-25
- 发帖数385
- QQ593249217
- 火币969枚
- 粉丝282
- 关注1
|
阅读:9388回复: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);
| | | | |
|