こんにちは。FenrirFS 開発担当の福満です。
先日、Delphi の新しいエディション、Delphi XE2 が発売されました。64 bit 対応や Windows / Mac OS X のクロスコンパイルなど目玉機能の多い今回の Delphi、早速インストールして触ってみましたので、その雑感を記したいと思います。
新しいコンポーネントフレームワーク FireMonkey
クロスコンパイル可能なアプリケーションを作成するには、お馴染みの VCL ベースではなく、新たに導入された、FireMonkey というフレームワークを使用する必要があるようです。TButton などの主要なコンポーネントのほとんどは、FireMonkey でも別ユニットで用意されており、プロパティに違いはあるものの違和感なく開発を始められそうです。
FireMonkey コンポーネントは名前こそ VCL のものを踏襲していますが、実際はクラス階層から大きく異なっており、ネイティブ API のコントロールを使用しないで独自に描画や処理を行う、カスタムコントロールとなっています。
FireMonkey のソースコードを少し眺めてみましたが、プラットフォームに依存する部分は FMX.Platform.Win とか FMX.Platform.Mac などのユニットに閉じ込められており、 非常にすっきりとしています。uses 部以外に条件コンパイルはほとんどなく、読みやすいです。
// FMX.Platform.pas より抜粋 implementation {$IFDEF IOS} uses FMX.Platform.iOS, FMX.Canvas.iOS, FMX.Context.GLES; {$ENDIF} {$IFDEF MACOS} uses FMX.Platform.Mac, FMX.Canvas.Mac, FMX.Context.Mac; {$ENDIF} {$IFDEF MSWINDOWS} uses FMX.Platform.Win, FMX.Context.DX9; {$ENDIF}
残念ながら VCL はクロスコンパイルに対応していません。Windows API に大きく依存しているのでやはり難しいのでしょう。
64 bit 対応
Windows 64 bit に対応したのも大きな機能追加です。
Integer 等の整数型のサイズが変更になるかと思っていたのですが、下記のコードで確認してみたところ、
Memo1.Lines.Add( 'Integer ' + IntToStr( SizeOf( Integer ) ) ); Memo1.Lines.Add( 'Longint ' + IntToStr( SizeOf( Longint) ) ); Memo1.Lines.Add( 'Cardinal ' + IntToStr( SizeOf( Cardinal) ) ); Memo1.Lines.Add( 'Pointer ' + IntToStr( SizeOf( Pointer) ) ); Memo1.Lines.Add( 'WPARAM ' + IntToStr( SizeOf( WPARAM) ) ); Memo1.Lines.Add( 'LPARAM ' + IntToStr( SizeOf( LPARAM) ) );
出力は下記のようになりました。
Integer 4 Longint 4 Cardinal 4 Pointer 8 WPARAM 8 LPARAM 8
4 バイト整数のサイズは変わらないようですが、SendMessage の引数である WPARAM LPARAM は 8 バイトとなっています。
64 ビットに移行する際、例えば下記のようにポインタを SendMesasge のパラメータとして渡しているコードは注意が必要ですね。
SendMessage( Handle, WM_SETTEXT, 0, Integer(PWideChar(文字列)));
VCL のコードも Integer へのキャストから、WPARAM / LPARAM へのキャストに変更されていました。
以前のエディションに付属のサンプルプロジェクトをいくつか 64 bit でコンパイルして動かしてみましたが、ソースコードを一行も変更することなく正常に動作しましたので、一般的なプロジェクトであれば 64 bit への移行のため大きな変更をする必要はないようです。
非常に大きなアップデートとなった今回の Delphi XE2、使っていくうちにいろいろと発見がありそうで楽しみです。