2011年12月16日

Delphi/C++Builder XE2 Update 3

かねてからの噂どおりDelphi/C++Builder XE2のUpdate 3がリリースされています。

28670 Update 3 for Delphi, C++Builder and RAD Studio XE2
Update 3 for Delphi XE2, C++Builder XE2 and RAD Studio XE2
XE2 Update 3 のリリース ノート - RAD Studio XE2 (en)
Delphi XE2/C++Builder XE2 Update 3 における不具合修正リスト (en)

Update 3ではTButtonのModalResultプロパティで使用するいくつかの値の定義が変更されています。またコンパイラ内の一部の構造体の変更に伴いAndreas HausladenさんIDE Fix Pack 2009/2010/XE/XE2 4.5が動作しなくなっています(既に4.6がリリースされています)。

TButtonのModalResultプロパティで使用する値の件はUpdate 3のリリースノートに明記されただけで、実際にはXE2 RTMにおける変更のようです(QC100283)。まずTButto.ModalResultの型はTModalResultですが、TModalResultは列挙型ではなく単に
  TModalResult = Low(Integer) .. High(Integer);

と実質的にIntegerであり、それぞれの値(mr...)は該当するボタンのID(ID_...)と同値で、XEおよびそれ以前ではControls.pasで、XE2ではSystem.UITypes.pasで定義されています。Update 3のリリースノートからリンクしているBob SwartさんのXE2 values of mrAll, mrNoToAll, mrYesToAll and mrCloseというアーティクルで詳しく考察されていますが、XEではmrCloseがmr...の最後(mrYesToAllの次)になるように定義されているのに対し、XE2ではmrHelp、mrTryAgain、mrContinueと共にmrNoの次になるように移動し、その後にmrAll、mrNoToAll、mrYesToAllとmrYesToAllが最後になるように定義が変更されています。さらにTModalResultは列挙型でないためdfm上は数値として記録されているため、XEまでのコード(フォームデータ)でModalResultにmrAll、mrNoToAll、mrYesToAll、mrClose(8~11)と設定していたものをXE2に取り込むとmrClose、mrHelp、mrTryAgain、mrContinueに変化してしまう、ということになります(あるいはソースを共用している場合は逆のことも起きます)。基本的にbreaking changeということであり、個別に対策するしかないのですが、上記のBob Swartさんのアーティクルにはこの問題を指摘してくれるScanDFMというツールがリンクされています。

2012/02/10追記: ModalResultの定義値の変更の件を補足しました。高橋さん、情報ありがとうございます。

1 件のコメント:

高橋智宏 さんのコメント...

ModalResultの変更については、Update3で変更されたわけではないです。
QC#100283 を参照してください。