申请版主



------
今天試著將一些控件安裝到 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 中編譯安裝。)

------
不错!!
------
2010生成的可执行文件体积太庞大了。一个空的ActiveX Library工程,完全编译后竟然1MB+的体积。

另外,IDE似乎记不住工程组中当前活动的工程,每次打开工程组,总是将最后一个工程设置为活动状态。
------
关注!
------
关注
------
试用版开久了不动,重新编译运行就提示协议信息并不允许操作。
------
Ehlib5 你安装的那个版本 可以 编译成功吗 ?
------
我总是这个问题..

[BCC32 Error] Toolctrlseh.hpp(866): E2015 Ambiguity between 'ftSingle' and 'Typinfo::ftSingle'
  Full parser context
  Unit1.cpp(6): #include Unit1.h
  Unit1.h(10): #include D:\Program Files\Embarcadero\Ehlib_CB\RADStudio2010\DBGridEh.hpp
  DBGridEh.hpp(34): #include D:\Program Files\Embarcadero\Ehlib_CB\RADStudio2010\Dbsumlst.hpp
  Dbsumlst.hpp(24): #include D:\Program Files\Embarcadero\Ehlib_CB\RADStudio2010\Toolctrlseh.hpp
  Toolctrlseh.hpp(44): namespace Toolctrlseh
------
不会啊
------
体积问题一直是我比较郁闷不考虑用的原因。
------
学习
------
Delphi 2010用了几天,又退回Delphi 2009了。
------
在CCRUN.COM下载 EhLib v5.0.13 , 可以在 BCB2010 上编译安装。这要感谢老妖
------
能不能说一下安装方法 我的总是不好用 郁闷呢。。。
------
TO : ggt87125

多個包相互依賴時,編譯方式不同,可能造成生成的HPP文件不可用。要注意讓多個有依賴關系的包,他們使用同樣的編譯開關

很多第三方控件源碼,都只提供在delphi下編譯鏈接的工程文件,而不提供在B2006--B2010下編譯的工程文件,這時需要自行建立一個工程文件來編譯鏈接。我喜歡自行控制那些編譯選項,因為不一樣的編譯選項可能會生成不一樣的頭文件,對於需要聯編很多包的項目來說,不一樣的頭文件可能是個災難。
一個例子:一些控件中有這麼一句pascal語句:
{$IFDEF DEBUG}
property Count: Integer read GetCount;
{$ELSE}
property Count: Integer read FCount;
{$ENDIF}
Teechart中就有類似的代碼。如果Teechart使用DEBUG build,而後面建立在與Teechart 之上的 Decisioncube , fastreport 等控件使用 Release build 的話,同一文件就會生成不一樣的頭文件,就可能會鏈接時找不到函數等問題(Delphi沒有這問題,使用頭文件的BCB才會有這問題)。 

如何手工從 DPK 轉成 BPK(或cbproj)失敗的主要原因,是沒拿到對應的版本,例如:用for 2007 的版本放到2010中去編譯,這就需要很多改動了。同一版本的控件能在delphi正常安裝的源碼,絕大部分能在BCB正常編譯安裝。一定要有全部源碼,才能在BCB下編譯安裝。

1、新建一個工程,將DPK中列出的文件加入工程中。
DPK中會有:
contains
  DBSumLst in 'DBSumLst.pas',
...,將這些pas文件添加入工程中。先將這些文件整理成“a.pas;b.pasc.pas”的方式,然後在BCB中一次全部添加即可。此時BCB一般會自動生成包需求列表。
2、DPK中的編譯開關,
{$ALIGN 8}
{$ASSERTIONS OFF}
{$BOOLEVAL OFF}
{$DEBUGINFO OFF}
。。。。。。一般情況下這些可以不處理,使用默認值即可。
3、注意查找路徑及庫路徑產生的問題:
  找不到OBJ文件,這個可以查找對應的OBJ文件在哪裡,然後在工程中添加對應的路徑
  找不到DCU文件,要添加對應的PAS文件到項目中去,讓BCB編譯生成對應的目標文件。
4、使用Delphi dcp預編譯包的問題,設計期包,如果提示找不到 Designide 之類,注意添加對應的文件。
5、多個包時,注意調整包的編譯順序。
。。。。。。

我將自己想到的,列出來,供參考。希望你能自行調整編譯過關,而不是到網上下載一個編譯好了的包直接安裝。
控件安裝的問題,請不要再在本貼提出,可以另開貼。
------
引用 13 楼 ggt87125 的回复:
能不能说一下安装方法 我的总是不好用 郁闷呢。。。

------
太新了,这有问题,那有问题的
------
我一直是BCB的支持者,自从95年使用BCB以来,就一直没有使用过其它语言工具。当时情况是这样的,使用MSVC5.0开发程序,但界面设计很不直观,虽然可以凭借软件技巧实现不错的界面,开始还为自己能够在程序中自由的使用代码设计界面而自豪,后来繁琐的设置最终让我寻找直观的界面开发工具。认识了 BCB,就不再更改了。2010下载了,但还没有破解,期待是个好工具,我又能继续坚持了!
------
myEclipse7.0稳定吗,
------
haohao xuexi
------
引用 2 楼 ccrun 的回复:
.....
IDE似乎记不住工程组中当前活动的工程,每次打开工程组,总是将最后一个工程设置为活动状态。

------
1、項目組與項目不能同名,可是當 group 名字與項目同名時,沒有失敗提示。讓人怪怪的。以前的版本好象有失敗提示的。
  工程名稱不能與工程內的文件同名,當你重新命名時,如果同名,會失敗,但是沒有提示。可惡的沒提示。

  發生文件名稱相同時,包括 pascal 中 use 單元中的名稱,都會導致 link 錯誤,但是沒有任何提示你是因為有重名文件 。 無論是重命名時失敗,或是鏈接時失敗,都沒有提示這個原因。

以上說的這些問題,不單是B2010的問題,很多問題是B5以來一直存在的問題,只是直至2010都沒得到解決。
------
今天 編譯 QRDesign1.59 成功。但是還是有很多不是很明了的小問題,時有時無,未能鎖定發生的環境。

------
试用版可能会有很多问题
------
在 B2010 IDE 中手工編輯 .cbproj 文件的一個方法:

  正常情況下,IDE中是無法打開查看 .cbproj 源文件的。如果該項目已經被打開,也是不能打開編輯源文件的,很多情況下,我們都是借助其他文本編輯工具,如 UEdit 記事本等來編輯項目文件。今天我無意中找到了一個可以在 IDE 中直接編輯 的方法。
  
  1、Search->Find In File 中查找你所想編輯的 .cbproj 文件,讓其出現在找到的列表中。
  2、關閉對應的項目,雙擊查找列表中的查找項。

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

Find In File 功能終於好用了,比以前的版本好用很多。(以前的版本太智能化了,未能指定查找的文件類型,常常得到錯誤的結果)

------
無論是在IDE中還是在第三方編輯器中,編輯 .cbproj 文件 前 關閉項目, 編輯存盤後再重新打開,這樣才能使編輯的結果生效。
  不要相信 BCB 那個提示:“文件已經被修改,需要重新載入嗎?”回答Yes也是白費勁的。

------
呃……目前还在用2009,懒得升级了……
------
用来用去,还是用6了
------
tchart控件找不到放什么位置了
------
引用 20 楼 ppower 的回复:
  今天我特意試一下,可以記住當前活動的工程的。

------
試著升級舊項目,遇見的問題寫下來:
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中更新出來的當前活動工程就會永遠是最後一個。


------
***IDE一個奇怪的行為:
放一個 TComboBox 在Form上 , 將 ComboBox 的 BevelKind 更改一下,ComboBox將從Form上消失,其 Left 或 Top 被移到可見區域之外。 而且,你一旦設定 Left 或 Top 屬性將其移回來,馬上又被移出去。
ComboBox 只有在 BevelKind == bkNone 的時候才正常。

------
想編寫 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 中聯結事件就不能做到兼容了)


------
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

------
裝上 UP2 吧
Embarcadero® C++Builder® 2010 Version 14.0.3593.25826 

之前,在打開一些DFM文件的時候,2010會產生堆溢出,裝了UP2就正常了,我現在裝上了UP2,再慢慢測試。
------
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天的使用時間。。。。測試一下也夠用了吧


------
發現一點變化,記錄下來:

UP1或B2007中,
#define TRANSCHAR L

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

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



------
还在使用BCB6。不想升级了,太麻烦
------
好好学习,天天向上
------
破解的也不行吗?


桂ICP备07017180号