C++Builder好きの秘密基地 このページをアンテナに追加 RSSフィード

2011-01-31

Unified InterbaseをC++Builder XEで試してみた。


かねてから、Pro版で使用可能なFirebird/Interbase用のコンポーネントを探していて、

という記事がポストされていたので、Unified InterbaseC++Builder XEで試してみた。

インストールは、C++Builder XEではC++Builder 2009用のプロジェクトファイル"UIBBCB12Win32.groupproj"を開いてC++Builder XE用に変換。あるいは、UIBD15Win32.groupprojを開いて、プロジェクトオプションの[C/C++ 出力ファイルの生成]を"すべての C++ Builder ファイル(パッケージ ライブラリを含む)を生成"にすればOK。

ただし、ビルド時にuiblib.pasから生成されるuiblib.hppで以下のエラーが発生してコンパイルエラーになる。

[BCC32 エラー] uiblib.hpp(284): E2019 'TUIBSQLVar:: :: :: ()' は無名の共用体内では宣言できない
[BCC32 エラー] uiblib.hpp(298): E2019 'TUIBSQLVar:: :: ()' は無名の共用体内では宣言できない

このエラーを回避するには、パッケージのビルド時に生成される$(BDSCOMMONDIR)\hpp\uiblib.hppを編集して、TUIBSQLVar内部の無名構造体にダミーな適当な構造体名をつけてやればOK。

struct DECLSPEC_DRECORD TUIBSQLVar
{
  
public:
  short SqlType;
  short SqlScale;
  short SqlSubType;
  short SqlLen;
  char *SqlData;
  short *SqlInd;
  #pragma pack(push,1)
  union
  {
    struct __0 // ←ダミーの構造体名を追加
    {
      TUIBParamsFlags Flags;
      unsigned:8;
      System::Word ID;
      short MaxSqlLen;
      short ParamNameLength;
      System::StaticArray<char, 125> ParamName;

    };
    struct __1 // ←こっちもダミーを追加
    {
      short SqlNameLength;
      System::StaticArray<char, 32> SqlName;
      short RelNameLength;
      System::StaticArray<char, 32> RelName;
      short OwnNameLength;
      System::StaticArray<char, 32> OwnName;
      short AliasNameLength;
      System::StaticArray<char, 32> AliasName;
      
    };
    
  };
  #pragma pack(pop)
};

C++Builder用のサンプルコードである、examples\UIB\BCB6\Query\Query.bprビルドして、Firebird 2.1のサンプルにある"EMPLOYEE.FDB"を読ませてみたところ無事動作。何となく使えそうだけど、TUIBDataSetが読み込み専用っぽいのが残念。この辺がうまくいけばDBコンポーネントと連携させられるんだけどね…。*1

*1Firebirdと連携させたいのならば、素直にEnt版を買うのがベストなんだろうけど。

2010-12-22

Universal Character Set Detector C LibraryをC++Builder XEから使用する

Mozillaエンコーディング自動判別ライブラリである「universalchardet」をDLL化したのをC++Builderで動作させてみました。

C++Builderでの修正箇所はprmem.hの「#include <cstdlib>」を「#include <stdlib.h>」にするだけ。アーカイブhttp://a7m.sakura.ne.jp/SOURCE/universalchardet-CB.7zに用意しました。

C++Builderでの使い方は以下の通り。TMemoryStreamのバッファとかをそのまま渡せる。

  // ファイルを読み込んでから
  std::unique_ptr<TMemoryStream> pBuffer(new TMemoryStream());
  pBuffer->LoadFromFile(FileName);
  pBuffer->Position = 0;

  char encoding[CHARDET_MAX_ENCODING_NAME];
  size_t len;
  int res = 0;
  chardet_t det = NULL;

  // エンコーディングの判別をする
  chardet_create(&det);
  res = chardet_handle_data(det, static_cast<const char*>(pBuffer->Memory), pBuffer->Size);
  chardet_data_end(det);

  // エンコーディング名の取得
  chardet_get_charset(det, encoding, CHARDET_MAX_ENCODING_NAME);
  chardet_destroy(det);

  // 自動判別結果を元にエンコーディングを判別して読み込み
  TEncoding* pEncoding = NULL;
  try {
    pEncoding = TEncoding::GetEncoding(encoding);
  } catch (EEncodingError& err) {
    pEncoding = TEncoding::GetEncoding(GetACP());
  }
  pStringList->Clear();
  pStringList->Lines->LoadFromStream(pBuffer.get(), pEncoding);

  // 後始末
  delete pEncoding;

注意点として、TEncoding::GetEncodingが文字列"EUC-JP"を判別してくれないので、EUC-JP(CP51932)を扱う場合はCP20932で代替するしかないので、その処理を入れる必要があるかも。

2010-09-20

第17回 エンバカデロ・デベロッパーキャンプ セッションB2自己フォロー その4:コンポーネントTJvWizardについて

本編では時間が足りなくなりそうなので思いっきり端折ったTJvWizardについての補足。

こいつは、よくあるウイザード画面を実現するコンポーネントでJVCLのインストーラーもこいつを使用してる。
使い方はTPageControlとTTabSheetに近く、TPageControlに「次へ」ボタンなどの制御ボタンが実装されたものと見なせばOK。TPageControlに相当するのがTJvWizardで、TTabSheetに相当するのがTJvWizardWelcomePageとTJvWizardInteriorPage。もう一つの違いはウイザード画面の制御コントロールが3種類ある。


制御コンポーネント表示形式「ページ名」として使用する各ページのプロパティ
TJvWizardRouteMapListリスト形式(ページ名一覧を縦に並べる)Caption、Title、Subtitleのどれか。ItemTextプロパティで決定。
TJvWizardRouteMapNodesノード形式(ページ名一覧をマップ形式で並べる)Title
TJvWizardRouteMapStepsページ形式(カレントページと前後のページ名を表示)Caption

ページ移動時に発生するイベントがいろいろあるので、その辺を注意すればかなり便利なコンポーネント

2010-09-19

第17回 エンバカデロ・デベロッパーキャンプ セッションB2自己フォロー その3:エディタコンポーネント SynEditについて

本編で軽く紹介したSynEditについての修正アーカイブを公開しました。

修正点は以下の通り。

  • RAD Studio XEのカラースキーマ取り込み(Delphi/C++)
  • RAD Studio XE用のプロジェクトで、C++Builderでも使用できるようにした
  • RTF形式の出力で、日本語文字列が化ける(厳密にはU+00FF以上)のを修正

14日にSubversionのリポジトリが更新されて、RAD Studio XEに対応したので、そいつを修正。本当は、コントリビュートしなければいけないんだけど、いろいろあって、(今現在)その気力無し。

2010-09-13

JCL2.21 & JVCL2.40リリース


Delphi/C++Builder XEに対応した、オープンソースライブラリコンポーネントJCL2.21JVCL2.40が正式リリース。

デベロッパーキャンプの前に正式版が出て何より。と言っても、XEのパートナーDVDにはしっかり含まれているので、正式リリースは少し前だったりする。
JCLとJVCLのコンポーネントについては、デベロッパーキャンプで5つほど紹介予定。