読者です 読者をやめる 読者になる 読者になる

RAD Studio XEファーストインプレッション その3:VCL&サードパーティコンポーネント編

C++Builder Tips

UnicodeStringに関するちょっとした仕様変更

UnicodeString::t_char()は移行期間が過ぎたということで「非推奨」に。それに伴い、プロジェクトのTCHARのマッピングがデフォルトでwchar_tに。よって、C形式の文字列ポインタ(const wchar_t*)が欲しい場合は、c_str()かw_str()を使用。(といっても、中身は全く同じ)どうしても"const char*"な文字列が欲しい場合は、一度AnsiStringにキャストしてからc_str()でポインタを取得。
この辺の変更はTCHARのマッピングがcharかwchar_tとでUnicodeString::t_char()の挙動が変わる仕様がクロスプラットフォームを考えたときによろしくないせいかと思うけど。

正規表現クラス

正規表現クラスであるTRegExが追加。サードパーティだとSkRegExpとかTPerlRegExがあるし、C++Builderだとstd::tr1::regex(boost::regex)があるけど、一度std::wstringやstd::stringに変換してやらないと使えない。
使い方は、RegularExpressions.hppをインクルードし、TRegExオブジェクトを生成。Matchメソッドでマッチ部分を検索。TRegExオブジェクトを生成せずにマッチさせる方法はDEKOさんが紹介してくれている。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Memo1->Clear();

  // 正規表現のコンパイル
  std::unique_ptr<TRegEx> pReg(new TRegEx("(\\d\\d\\d)(\\d\\d\\d)"));

  // マッチするかどうか?
  TMatch Match =pReg->Match("111222333");

  // キャプチャした文字列を列挙
  for (int i = 0; i < Match.Groups.Count; ++i) {
    Memo1->Lines->Add(Match.Groups[i].Value);
  }
}

ああ、早くRaw String Literalsが欲しい…('A`) C++正規表現を記述するのに'\\'とするのはもう嫌だ…。

TBinaryReader/TBinaryWriter

.NET FrameworkのBinaryReaderに相当するVCLクラス。

IP*Works!

ネットワークアクセスコンポーネントIP*Works!がバンドル。もちろん、従来通りIndyもバンドルされている。RSSとかJSONのパーサがあったりするから、「ぼくのかんがえたさいきょうのTwitterくらあんと あんど RSSりーだ」なんてものが作れるかも。RSSリーダを作ろうとして挫折しかかった人間としてはちょっと考えてしまう。
でも、オープンソースコンポーネントだったらバージョンが上がっても何とかなるかもしれないけど、バンドルされたサードパーティコンポーネントは次のバージョン以降もバンドルしてくれないとかなり困るような気が。

JCL/JVCL

JCLがVersion2.2、JVCLがVersion3.40で対応。このバージョンから、インストール時に生成されるC++Builderで使用するヘッダファイルが$(BDS)\include\vclから$(BDSCOMMONDIR)\hppと$(JVCL)\include\D15に変わるので、管理者権限でインストールする必要がなくなった。これについては第17回デベロッパーキャンプで触れる予定。

サンプルコード

サンプルコードはSourceForge.netのリポジトリからゲットできるようになったのはなにげにいい感じ。