試用 BCB2010 遇到的問題

勉励前行 2009-11-07 11:55:51
加精
今天試著將一些控件安裝到 BCB2010 上,將遇到的問題整理一下貼上來分享 ,同時也希望其他使用 2010 的朋友,將問題或竅門貼上來,大家一起學習使用2010。

1、多項目同組時的 BuildAll, 會過早地檢查包依賴,產生多余的提示。
在多個項目的組中 BuildAll 時,會先檢查全部項目其需要包含的包及靜態庫,如果缺少,則提示,然後才逐一編譯。
而在B2007中,則是逐一編譯,編譯到該項目時才檢查。
如果同一項目組中存在包依賴問題。B2010的方式則會在一開始就提示缺少包或庫。B2007則不會。

2、編譯PAS文件時,delphi link 如果選擇 Generate all C++ Builder files (including package libs) 則會產生link error: 找不到 obj file
除非你先用其他方式(如Generate C++ .objs, headers, namespaces, export)生成obj file。
選擇 Generate all C++ Builder files 然後 執行 clear 再 build 就會出現 link error
所以,如果想生成LIB靜態庫,必須要先生成 obj 然後重新編譯生成 lib , 要不厭其煩地 編譯兩次才行 。

3、鏈接時出現了一個致命錯誤。(編譯 QRDesign1.59 時出現)
Exception EAccessViolation: Access violation at address 50010ABE in module 'rtl140.bpl'. Read of address FFFFFFFF
[MSBuild Error] The "ILINK32" task failed unexpectedly.
System.Runtime.InteropServices.COMException (0x8000FFFF): 災難性的失敗 (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
at Borland.Build.Tasks.Cpp.IBCBuildHostObject.ILinkAliasVFSFile(String fileName, String& tempFilename)
at Borland.Build.Tasks.Cpp.ILINK32.GetCommandLine()
at Borland.Build.Tasks.Common.BaseTask.GenerateCommandLineCommands()
at Microsoft.Build.Utilities.ToolTask.Execute()
at Borland.Build.Tasks.Common.BaseTask.Execute()
at Borland.Build.Tasks.Cpp.ILINK32.Execute()
at Microsoft.Build.BuildEngine.TaskEngine.ExecuteTask(ExecutionMode howToExecuteTask, Hashtable projectItemsAvailableToTask, BuildPropertyGroup projectPropertiesAvailableToTask, Boolean& taskClassWasFound)

4、編譯pascal代碼的速度是比不上 B2007 + bcc32pch2.79 的。
我試過可以在BCB中編譯安裝的第三方控件:Ehlib5, QuickReport5.04.1,TeeChart8.06 VirtualTree4.86 vclskin5
未通過的:QRDesign1.59(未拿到 for 2010 版的,我拿 for 2007 版的改,因為鏈接出現致命錯誤就沒繼續了。)
decisioncube源碼有2010版本的,要正版用戶才能下載:http://cc.embarcadero.com/Item/27351

以前測試存在的問題:

1、奇怪的IDE:第一次能選上,以後就不行了。
试着用 放一个 RibbonCombox 到 Ribbon 上, 第一次,可以用鼠标选中TActionClients[0] , 焦点转移后无法用鼠标选中。只能通过ActionManager逐级选择这个东西来修改RibbonCombox的"Caption" , 有点怪怪的,为什么第一次可以,焦点转移后就不行了。 编译,试执行,一切正常。。。。。

2、項目中莫需有的 LIB 及 BPI 文件未清除。
将界面是的全部控件清除,存盘。发现没有将对应的头文件去除,依然#include那些不需要的头文件。 这好象问题不大。继续測试,编译一个不带包独立运行的版本,还是正常。 可是当我手工将这些多余的头文件清除后,问题出现了:
[ILINK32 Error] Error: Unresolved external 'LresultFromObject' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\7.0\LIB\DEBUG\VCLACTNBAND.LIB|ActnMenus
如果编译的是带包运行的版本,则链接正常,否则链接错误。要知道清除所有控件后,这是一个空Form啊。

BCB2010 还是与以前的版本一样,残留控件信息,在项目文件中错误地链接莫需有的LIB及库。而且Options中不提供对应修改方法。当然解决方法是手工编辑 .cbproj 项目文件,将莫需有的 LIB 及 BPI 文件去除。这样就能正常编译连接了。这个问题在所有BCB版本中都一直存在,非要关闭当前项目并手工编辑项目文件不可。

3、IDE不能识别事件函數中的名字空间。(以前的版本也有这个问题)
将Button1的事件函数void __fastcall TForm1::Button1Click(TObject *Sender) {/**/}
更改为void __fastcall TForm1::Button1Click(System::TObject *Sender) {/**/}
保存,IDE依然不能正确识别名字空间对类型的影响,System::TObject 与 TObject 是同一类型,但IDE就是只认 TObject 不认 System::TObject 这对安装多个第三方控件的使用者来说,可能造成麻烦。因为当出现类型同名时,只有加上名字空间都能正确区分不同的类型。好象还好,还允许你不移除这个事件的关联,只是每次保存都被提问,很烦人。当然编译与连接均是正常,只是IDE在保存时老是提问你。

版本: Embarcadero® C++Builder® 2010 Version 14.0.3513.24210 不敢裝UP1 .
(注明:以上測試是在 BCB2010 中編譯安裝 delphi 控件,不是在 delphi 2010 中編譯安裝。)
...全文
3708 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
xflidengqiang2008 2010-11-05
  • 打赏
  • 举报
回复
破解的也不行吗?

liuyong19841 2010-05-10
  • 打赏
  • 举报
回复
好好学习,天天向上
gaoxumei 2010-01-05
  • 打赏
  • 举报
回复
还在使用BCB6。不想升级了,太麻烦
勉励前行 2009-11-18
  • 打赏
  • 举报
回复
發現一點變化,記錄下來:

UP1或B2007中,
#define TRANSCHAR L

然後可以使用: TRANSCHAR"中文字符"

UP2後不行了,要老實一點,按標准寫法:
#define TRANSCHAR(x) L##x
這樣用: TRANSCHAR("中文字符")


勉励前行 2009-11-18
  • 打赏
  • 举报
回复
UP2:
1、TComboBox 設定為 flat 方式時,會在Form 上消失或閃的問題得到解決。
2、加載DFM文件時,對函數類型的檢查方式無改進。造成升級舊代碼時很多問題不好解決或得不到檢查。失望,一直以來,所有版本都是這樣不能識別正確的函數類型,不負責任地加載。
這點是要被評擊的,例:放一TreeView至界面,生成OnEdited事件
void __fastcall TreeView1Edited(TObject *Sender, TTreeNode *Node, UnicodeString &S);
我們將其原型改為:
void __fastcall TreeView1Edited(TObject *Sender, TTreeNode *Node, AnsiString &S);
編譯器不報錯,IDE也不報錯,我沒測試運行期會不會錯。但是升級舊代碼時,如果有這種代碼,編譯器是不會告訴你一點點信息的,你還以為一切安好。
如果我們寫 : typedef UnicodeString UString
原型改為:
void __fastcall TreeView1Edited(TObject *Sender, TTreeNode *Node, UString &S);
這回IDE報錯誤了, 認為DFM文件鏈接的函數不能匹配,要移除。

3、編譯PAS文件時,選擇 Generate all C++ Builder files (including package libs) 不生成obj文件的問題依舊。好象這個選項是多余的,不知這個選項的作用是什麼。現在選擇Generate C++ .objs, headers, namespaces, export 能正確生成各種文件,也產生LIB庫了。

仔細一看:只有14天的使用時間。。。。測試一下也夠用了吧

勉励前行 2009-11-18
  • 打赏
  • 举报
回复
裝上 UP2 吧
Embarcadero® C++Builder® 2010 Version 14.0.3593.25826

之前,在打開一些DFM文件的時候,2010會產生堆溢出,裝了UP2就正常了,我現在裝上了UP2,再慢慢測試。
星光伴月 2009-11-17
  • 打赏
  • 举报
回复
BCB2010在使用动态链接库时的静态链接,要包含一个对应的LIB库文件,当做这样的工程时,工程文件不能放在路径里有中文的文件夹里,否则会出错。但同样的问题在BCB2007中是不存在的。
错误的提示如下:
Checking project dependencies...
Compiling Project1.cbproj (Debug configuration)
[ILINK32 Error] Fatal: Unable to open file '䁉粓䀼粓唨—Ą.OBJ'
Failed
Elapsed time: 00:00:02.6
勉励前行 2009-11-17
  • 打赏
  • 举报
回复
想編寫 07 09 都能用的代碼,很困難。
1、__published: 段,不能有編譯語句

__published: // IDE-managed Components
#if __BORLANDC__ > 0x0589
void __fastcall ADODataSet1Field547GetText(TField *Sender, UnicodeString &Text,
bool DisplayText);
#else
void __fastcall ADODataSet1Field547GetText(TField *Sender, AnsiString &Text,
bool DisplayText);
#endif

//這會引起IDE提示:不正確的段描述。..

#if __BORLANDC__ > 0x0589
#define MyString UnicodeString
#else
#define MyString AnsiString
#endif

__published:
void __fastcall ADODataSet1Field547GetText(TField *Sender, MyString &Text,
bool DisplayText);
//IDE又說 函數原型不匹配,要移除Form中的事件指向。

//: 如果僅僅是 String 的問題的話,直接使用 String 是可以兼容的, IDE 中對 UnicodeString String AnsiString 這三種字符串不做檢查。
2010正確的原型是:
void __fastcall ADODataSet1Field547GetText(TField *Sender, UnicodeString &Text,
bool DisplayText);
兼容2007的原型的:
void __fastcall ADODataSet1Field547GetText(TField *Sender, String &Text,
bool DisplayText);
2010中不報錯,但事實上是錯誤的原型:(2007中是正確的)
void __fastcall ADODataSet1Field547GetText(TField *Sender, AnsiString &Text,
bool DisplayText);


//IDE這種不負責任的態度,讓程序埋下炸彈,隨時亂碼。 同時想編寫兼容07與2010的代碼很難。(在代碼中指定事件是可以的,在 Form 中聯結事件就不能做到兼容了)

勉励前行 2009-11-16
  • 打赏
  • 举报
回复
***IDE一個奇怪的行為:
放一個 TComboBox 在Form上 , 將 ComboBox 的 BevelKind 更改一下,ComboBox將從Form上消失,其 Left 或 Top 被移到可見區域之外。 而且,你一旦設定 Left 或 Top 屬性將其移回來,馬上又被移出去。
ComboBox 只有在 BevelKind == bkNone 的時候才正常。
勉励前行 2009-11-13
  • 打赏
  • 举报
回复
試著升級舊項目,遇見的問題寫下來:
1、__finally {} 中不允許 return ;
2、TBookmark 由原來的 void * 改成了 TByteDynArray
TBookmark A , B ;
if( A != B ) TBookmark不支持 != 比較, 改成 : if( !( A == B ) )
3、IntToStr 的煩惱 IntToStr(unsigned) 要指明是匹配 IntToStr(int) 還是 IntToStr(__int64)
加一個函數:inline String IntToStr(unsigned int A) {return IntToStr(int(A));}
4、升級原B6 B2007的代碼工作量大,編寫兼容 B2007 B2010 的代碼有困難。
  很多事件,接口函數傳遞的參數由 AnsiString 改成了 UnicodeString ,這樣很多舊文件都得修改,如果要兼容兩個不同的版本,依我的想法,要做很多宏才行吧。
5、加強了對 __closure 指針的保護 
 __closure 指針不能轉換為 void * 或 void ** 了。但還是有辦法可以繞過編譯器的檢查:
void **p = (void **)&this->OnClilck ; //(B2007以前可以B2010不行) reinterpret_cast 也是一樣的結果
void **p = (void **)(TNotifyEvent *)&this->OnClilck ; //B2010要這樣多加一層轉換了。
6、(接5)明明是編譯錯誤,卻給出致命錯誤提示,修正代碼後就不致命了。
template <typename T> //該模板檢測事件代碼是否相同,在 B2007 正常
inline bool VCLCompareEV(T const & EV1,T const & EV2)
{return *(const void **)(&EV1) == *(const void **)(&EV2) ;}
在Form1中生成 Form1Click事件,然後這行:
VCLCompareEV(&Form1Click,this->OnClick); //這行會提示內部錯誤
針對2010修正模板後:
template <typename T> //該模板在 B2007 B2010 均正常
inline bool VCLCompareEV(T const & EV1,T const & EV2)
{return *(const void **)(T*)(&EV1) == *(const void **)(T*)(&EV2) ;}
沒有提示錯誤了。

7、偶爾出現不能刪除 pch 文件的錯誤,說是被其他進程打開了。其實就是B2010自己打開了,沒有其他程序打開它。要關掉2010,重新打開,這錯誤就不發生了。

UP2 出來了,還沒試,估計沒多大改善。先多試一下再裝UP2看看。

TO : CCRUN
在 XXXX.groupproj.local 文件中有這麼一行:
<Projects ActiveProject="XXXXXXX"/> //這就是當前活動工程,如果你們使用SVN等工具,但忽略.local文件的話(我就是在SVN中忽略.local文件),從SVN中更新出來的當前活動工程就會永遠是最後一個。

xjq2003 2009-11-11
  • 打赏
  • 举报
回复
tchart控件找不到放什么位置了
ccrun.com 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 ppower 的回复:]
  今天我特意試一下,可以記住當前活動的工程的。
[/Quote]

奇怪我这里两台机器都是记不住当前活动工程。不知道是否有某个选项影响。
勉励前行 2009-11-10
  • 打赏
  • 举报
回复
無論是在IDE中還是在第三方編輯器中,編輯 .cbproj 文件 前 關閉項目, 編輯存盤後再重新打開,這樣才能使編輯的結果生效。
不要相信 BCB 那個提示:“文件已經被修改,需要重新載入嗎?”回答Yes也是白費勁的。
勉励前行 2009-11-10
  • 打赏
  • 举报
回复
在 B2010 IDE 中手工編輯 .cbproj 文件的一個方法:

正常情況下,IDE中是無法打開查看 .cbproj 源文件的。如果該項目已經被打開,也是不能打開編輯源文件的,很多情況下,我們都是借助其他文本編輯工具,如 UEdit 記事本等來編輯項目文件。今天我無意中找到了一個可以在 IDE 中直接編輯 的方法。

1、Search->Find In File 中查找你所想編輯的 .cbproj 文件,讓其出現在找到的列表中。
2、關閉對應的項目,雙擊查找列表中的查找項。

這樣就能在 BCB 中編輯 項目源文件了。一直以來BCB不把 Options 作好,又不提供 Edit Source File,也不提供說明,非得手工在第三方文本編輯器中修改項目文件,真是受夠了。

Find In File 功能終於好用了,比以前的版本好用很多。(以前的版本太智能化了,未能指定查找的文件類型,常常得到錯誤的結果)
xiaoxiangqing 2009-11-10
  • 打赏
  • 举报
回复
试用版可能会有很多问题
wellerweldon 2009-11-10
  • 打赏
  • 举报
回复
用来用去,还是用6了
liuyanghejerry 2009-11-10
  • 打赏
  • 举报
回复
呃……目前还在用2009,懒得升级了……
tak927 2009-11-09
  • 打赏
  • 举报
回复
haohao xuexi
勉励前行 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ccrun 的回复:]
.....
IDE似乎记不住工程组中当前活动的工程,每次打开工程组,总是将最后一个工程设置为活动状态。
[/Quote]
今天我特意試一下,可以記住當前活動的工程的。

今天試著重新編譯一下EHLIB5 , BCB2010 發現了一些不友好的地方,以前是直接拿B2007的cbproj 是套新代碼,沒出現這個問題。
1、項目組與項目不能同名,可是當 group 名字與項目同名時,沒有失敗提示。讓人怪怪的。以前的版本好象有失敗提示的。
2、options 中我找不到輸入 delphi 預編譯包 dcp 文件的有附地方,如果誰找到了這個選項,請告訴一下。這在編譯設計期包時,是致命的,不使用 dcp 文件,就無法成功編譯。給個臨時解決方法:
手工編輯cbproj 項目文件,在PropertyGroup下添加一行:
<DCC_UsePackage>dclstd;dcldb;dclado;dcldbx;designIDE;vcldesigner;</DCC_UsePackage>
你的項目需要使用那些 dcp 文件,就在這裡加上去。加上去就能成功編譯安裝了。
3、前面說的:“多項目同組時的 BuildAll, 會過早地檢查包依賴,產生多余的提示。 ”這個問題不嚴重,好象只是過早地檢查 LIB ,不會過早地檢查 bpi 。具體情況我沒驗證。

Options 中找不到 DCP 選項,難過。
like_cc 2009-11-09
  • 打赏
  • 举报
回复
myEclipse7.0稳定吗,
加载更多回复(19)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧