FMXでも簡単です
を使って、アプリケーションを作る。この記事で取り上げたminimumなアプリケーションから、
のような機能満載アプリケーションまで一応作れます。さて、C++ Builder CEでこのライブラリを使う場合は、VCLでもFMXでもコンソールプログラムのどれからも可能なんですが、上記のCamera Remote Control 64の場合は、TColorButtonや丸いボタンを使いたいがためにFMXで書きました。上記のminimumなプログラムが、VCLベースだったので、今回はTColorButtonを使ったものを作りますかね。まずFMXなアプリケーションを作り始めます。C++ Builder CEを起動して、

ウエルカムページの新規作成から上図下線の”マルチデバイスアプリケーション – C++ Builder”を選択。

ここは上側の“空のアプリケーション”でOK。
ここで一旦セーブするのが吉です。

トップメニューのファイルから“すべて保存”を選択。

上図のダイアログで”新しいフォルダー”を選択し、適切な名前のフォルダーを作成します。ここではfmx-mini-using-cameralibとでもしておきましょうか?Git Remote Repository へpushすることも考えてフォルダー名には空白を入れないのが吉です。RRMはpush先のサーバに応じて適切にレポジトリ名を変更しますけどね。
さてCameralib.zipをダウンロードして、解凍しておきます。中身を上記のフォルダーへcopyします。上記のフォルダーへ行くのは、IDE内部から、project1.exeを右クリックして、

ここからエクスプローラーで表示を選択。

下から上へ、dragしてコピーしても可です。

このようになりますかね。IDE内部へ戻って、ぼつぼつフォームを作りましょう。一応64bitを選択しておきましょう。Debugバージョンでおけです。今は、

こんなふうに640×480のサイズのImage1とColorButton1を配置します。Buttonのカラーはお好みで。Captionを加えるのは、

パレットからttextを選択して、ColorButton1の上にdrag and dropします。上図はその状態。Text1のサイズと位置をColorButton1に合わせて、Textプロパティーには“Capture”とか。さらにText1->HitTestをFalseに。これをやらないと、クリックイベントが下のボタンに透過しません。

で、ColorButton1をダブルクリック。関数の中身に、以下をpaste。
void __fastcall TForm1::ColorButton1Click(TObject *Sender)
{
void* data;
long size;
filecount = 1;
TMemoryStream* ImageStream = new TMemoryStream();
camera->TakePictureToStream();
TBitmap *bitmap = new TBitmap();
bitmap->LoadFromStream(ImageStream);
Image1->Bitmap->Assign(bitmap); // FMX
delete ImageStream;
}
cameralib.hをインクルードして、ここまでで。Unit1.cppの冒頭は、
#include <fmx.h>
#pragma hdrstop
#include "cameralib.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
Camera* camera;
extern int filecount;
int Live=0;
EdsError EDSCALLBACK ProgressFunc(EdsUInt32 inPercent, EdsVoid* inContext, EdsBool* outCancel)
{
return EDS_ERR_OK;
}
void UpdateProgressBar(unsigned long value)
{
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
camera = new Camera();
}さてcanonとnikonからsdkで提供されているヘッダを追加します。結果は、

このようになります。これらのヘッダー群とライブラリをプロジェクトに追加します。
project1.exeを右クリックして、

ここで追加。

ヘッダーファイルを選んで、headersというフォルダーをダブルクリック。

全部選択するので、クリックして、一番下でshiftクリック。その状態が上図。ここで”開く”。次は、静的ライブラリファイル

二つとも選んで開く。一度コンパイルしてみましょう。runせずにbuildだけならば、shift-F9

エラー出ました。これは、project1.exeを右クリックして

一番下の“オプション”を選択。

左側のペインの一番上を選択。

のようにC++(共有オプション)->_TCHARのマップ先をcharに変更して保存。その他ダミーのcallback関数も宣言だけしておいて、Unit1.cppは、
//---------------------------------------------------------------------------
#include <fmx.h>
#pragma hdrstop
#include "cameralib.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
Camera* camera;
extern int filecount;
int Live=0;
EdsError EDSCALLBACK ProgressFunc(EdsUInt32 inPercent, EdsVoid* inContext, EdsBool* outCancel)
{
return EDS_ERR_OK;
}
void UpdateProgressBar(unsigned long value)
{
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
camera = new Camera();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ColorButton1Click(TObject *Sender)
{
filecount = 1;
TMemoryStream* ImageStream = new TMemoryStream();
camera->TakePictureToStream();
TBitmap *bitmap = new TBitmap();
bitmap->LoadFromStream(ImageStream);
Image1->Bitmap->Assign(bitmap); // FMX
delete ImageStream;
}これでコンパイルはできました。edsdk.dllを実行ファイルと同じ階層に置きます。VCLの時は、
void* data;
long size;
filecount = 1;
TMemoryStream* ImageStream = new TMemoryStream();
camera->TakePictureToStream();
data = camera->getbuffer();
size = camera->getsize();
ImageStream->WriteBuffer(data,size);
ImageStream->Position = 0;
Image1->Picture->LoadFromStream(ImageStream);
delete ImageStream;
でしたが、FMXでは
filecount = 1;
TMemoryStream* ImageStream = new TMemoryStream();
camera->TakePictureToStream();
TBitmap *bitmap = new TBitmap();
bitmap->LoadFromStream(ImageStream);
Image1->Bitmap->Assign(bitmap); // FMX
delete ImageStream;
となって、TakePictureToStream以降が少し簡略になりますが、TBitmap介してるので同じようなものかな?これはVCLとFMXとでTImageの扱いが違うためで、Cameralibに責任はありません。

動かして見ましょうかね。canonのカメラをつないで、F9。Captureすると、

動いているようですね。CanonとNikonのカメラを制覇したつもりは毛頭ないですけど、次はSonyですかね。SDKと実機があればなんとかなるかもです。ただし、個人は相手にしていないかも…..。
法人向けと書いてあるやん。残念。

コメント