C++ Builder XE4のFireMonkeyがVCL/CLXと違うところ。

気づいたところだけメモとして書く。
何度も更新しています。

TForm->Show()をしても画面が前に来ない場合がある。
対応策はShow()はやめて、
Form1->Visible = false;
Form1->Visible = ture;
と二つの文を書く。
TForm->TopMostを書き換える方法はテキストカーソル(キャレット)やTMainMenuを表示しないといった挙動が出るのでしないほうがよい。

Label1->Text = "漢字";のような代入は良くない。
Label1->Text = u"漢字";のようにuを付けないと少なくともMac OS Xで英語ロケールなどの日本語ロケールでない場合は文字化けする。
(L"漢字"のようにLを付けてもいいがMac OS Xではwchar_t(32ビット)をchar16_t(16ビット)に変換して代入するので無駄があるかも知れない)
Windowsの日本語ロケールでは文字化けしない。
Windowsの日本語以外のロケールでもu無しでは文字化けすると思うがまだ試していない。
(これはVCLも多分同じだと思う。)

WindowsはVCLもFireMonkeyもwchar_tは2バイトだが、ターゲットがMac OS Xになるとwchar_tは4バイトになる。
Mac OS Xをターゲットにする場合、wchar_tは使わずchar16_tに書き換えたほうがいい。
wcscpyなどのwchar_tを扱う文字列関数も使わないほうがよいのでchar16_t版の文字列関数を自作したほうがよい。
理由はコンポーネントがchar16_tのUnicodeStringを使用しているのでchar16_t*とwchar_t*間のアドレスをキャストして渡すと値は狂いバグになる。
変換して渡すならよいが無駄な変換処理をすることになる。
Windowsはwchar_tとchar16_tは同じ16ビットなのでchar16_tとwchar_tが混在しても問題は起こらない。
Mac OS Xはwchar_tとchar16_tが混在するとバグの元になり処理もややこしくなる。

Application->MessageBox("message","title");が無い。
MessageDlg()が代替らしいが、ウインドウタイトルを任意に指定できないような気がする。

Application->ExeNameが無い。Mac OS XではParamStr(0)で代用できない。Mac OS XでParamStr(0)を使うとNULLを返して、Mac OS XでNULLをアクセスするとリリースでの実行で「Runtime error 231 at xxxx」のエラー。デバッグでの実行で「SIGSEGV(11)」(セグメンテーション違反)のエラーが出て落ちる。
ブログのコメントの情報から実際に動作確認したところ、GetModuleFileName(HMODULE hModule, char16_t *buf, int bufsize);のhModuleをNULLにすると、Application->ExeNameまたはParamStr(0)の代替になる。
ただし、ヘルプにはGetModuleFileNameは必ず成功するわけではないという警告がある。

TEdit、TMemoなどのSelTextが読み込み専用で値を代入できない。
ただし、消すだけならEdit1->DeleteSelection()またはMemo1->DeleteSelection()でできる。
TMemoの場合、InsertAfter()でカーソル位置への挿入ができ、引数で指定することにより挿入文字を選択反転文字にしたり、挿入した文字列の後ろにカーソルを自動的に移動することもできる。
TEditは、InsertAfter()がない。
Edit1->Text = Edit1->Text.Insert(u"挿入",Edit1->SelStart+1);
のように全部書き換える方法ならカーソル位置に挿入できなくはない。

Top → Position->Y(TFormはTopがある)
Left → Position->X(TFormはLeftがある)

TFontDialogがない。

TWebBrowser、TCppWebBrowser、TTextBrowser、TRichEditなどのHTML表示またはリッチテキスト表示コンポーネントがなく類似コンポーネントもない。プレインテキストのみ対応のTMemoならある。

TForm->Enabledが無い。TForm->ShowActivatedが代替になる?

TForm->Font、TForm->KeyPreview、TForm->HorzScrollBar、TForm->SetFocus()が無い。


各コンポーネントのColorプロパティが無い。
TForm->Colorの対応策は、http://d.hatena.ne.jp/njisho/20140126/1390741112
TButton->Colorの対応策は、http://d.hatena.ne.jp/njisho/20140128/1390890468

TLabel->Font、TEdi->Font、TMemo->Fontはデフォルトでは値を代入できない。
対応策は、http://d.hatena.ne.jp/njisho/20140126/1390730060

TRadioGroupが無い。対応策はTGroupBoxとTRadioButtonの組み合わせで作る。

TStringGridの使い方がかなり違う。

TStringGrid->RowHeightsがない。(VCL/CLXで任意の行だけを高さを変えることができるプロパティ)

TStringGrid->Cells[X][Y]のYが灰色のスクロールしない最上部の一行を無視して白いスクロールする部分の先頭が0から始まる。

TStringGrid1->Optionsがない。(VCL/CLXではgoRowSelectなどがこれに含まれる)

TStringGrid->FixedCols、TStringGrid->FixedRowsがない。
FixedRows=1;に相当する代替の処理はあるが、FixedRows=2;や、FixedCols=1;などの代替処理は無いかも。

TStringGrid->Row → TStringGrid->Selected

TStringGrid->ColCount → TStringGrid->ColumnCount

TForm以外の各コンポーネントのプロパティの Caption → Text

Mac OS Xのistreamにget()がない。対応策はread()で1バイトのみ読むように書き換える。

Mac OS XのWideStringのCopy()メソッドの引数がWindowsとは違う。
コンポーネントがUnicodeStringを採用しているのでWideStringを使う必要性はほぼないと思う。
WideStringを使わないでUnicodeStringを使い、w_str()またはc_str()を使うことで対応できるが、UnicodeStringは2バイト(16ビット)単位なので注意。
(Kylix3 C++の LinuxでもWideStringのCopy()メソッドの引数がWindowsとは違いMac OS Xと同じだった。KylixはUnicodeStringはない。)

Mac OS Xのswprintfで「2番目のパラメータはunsinged long型として定義さているのでconst wchar_t *型は渡せない」とエラーが出る。
Mac OS Xではwchar_t(32ビット)を使う関数はコンポーネント採用のUnicodeStringのchar16_t(16ビット)とビット数が合わないので、swprintfを使わない方法を考えたほうがいいと思う。

Mac OS Xのmkdir()はmkdir("/abc/",0777);のように引数が二つ必要でひとつしかないとエラー。Windowsではひとつでよい。KylixもMACと同じく二つ引数が必要。