Delphi XE3 FireMonkey変更点

Delphi XE3ではFireMonkeyが2となりました。

いろいろな宣言やユニットの変更が行われていますが、問題はヘルプが追いついていないということで・・・

気づいた変更点を書いていきます。

カラー定数の定義ユニットが変わった

「claWhite」などのカラー定数の定義場所が変わっています。

これは「System.UIConsts」に移動しています。定数を使う場合は自分でusesに書かなければなりません。

 

Canvas.Scanlineが消えた

TBitmapに高速にピクセルを打つための常套手段、Scanlineプラロパティが消えています。しかしヘルプには「Scanlineを使える」と書いてあり、混乱します。

以下XE3ヘルプから引用

TBitmap はピクセル単位(Pixels、ScanLine)で操作やカスタマイズを行うことができます。低レベルでカスタマイズを行うには、カラービット(StartLine)を使用します。

かなり焦りましたが、Delphi MLで細川さんからアドバイスをいただきました。TBitmap.Map関数でデータへの構造体を取得、それに対して処理を行うようです。ちなみにTBitmap.Mapは説明が入っていません。(;–

以下のコードでScanlineと同等の処理が可能です。

 

var
Bmp: TBitmap;
BmpData: TBitmapData;
yAddr : Integer;


Bmp := TBitmap.Create(300, 300); 

Bmp.Map(TMapAccess.maWrite, BmpData);

for Y := 0 to Bmp.Height - 1 do
begin

  YAddr := Y * Bmp.Height;
  for X := 0 to Bmp.Width - 1 do
    PAlphaColorArray(BmpData.Data)^[YAddr + X] := $80FF0000;
end;
Bmp.Unmap(BmpData);

Bmp.Free;

 

上記の処理で、半透明赤のビットマップが出来上がります。

ちなみに、TBitmapDataにはSetPixelという座標でピクセルにアクセスできるプロパティがあります。

TBitmapData.Dataと比較してみたところ、Data経由でアクセスしたほうが10倍近く速いです。SetPixelはほんの少しの処理なら便利ですが、画像全体に行う処理では使わないほうがよさそうです。

 

上記の比較をしたソースコード(exe入り)をアップしておきます。

こちらからダウンロードしてみてください。当然ながらDelphi XE3でしかコンパイルできません。