C++ Builder CE Cameralibの活用

5. FMX版でフォーカスチェックのデモ

前記事(番外編C++ Builder CE Cameralibの活用)でUSB接続されたデジタルカメラのメリットとして最大のものが、PCの大画面でのフォーカスチェックが可能という点を挙げましたが、それをFMX版プログラムの具体例で示します。まずフォームのデザインから。

こんな感じでおけです。フォームの初期サイズも適当でおけですが、TImage,TLabel,TButtonのプロパティーを、TImageは、

TLabelとTButtonは、

としてください。で、前記事VCLでのプログラムと同様にCameralibをプロジェクトフォルダーに置きヘッダー類を追加、静的ライブラリx2を追加します。で、コード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)
{

	//Form1->TransferProgress->Position = inPercent;
	return EDS_ERR_OK;
}

void UpdateProgressBar(unsigned long value)
{
	//Form1->TransferProgress->Position = value;
}


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	//camera = new Camera();
	if( camera.TotalCameraCount > 0  ){
		//Label1->Caption = camera->GetName();
		Label1->Text = camera.GetName();
		Capture->Enabled = true;
	}
	else
		Label1->Text = "no cameras found";

}
//---------------------------------------------------------------------------
void __fastcall TForm1::CaptureClick(TObject *Sender)
{
  	void *data;
	long    size;

	TMemoryStream* ImageStream = new TMemoryStream;

	filecount = 1;  // must
	camera.TakePictureToStream();

	data = camera.getbuffer();
	size = camera.getsize();

	ImageStream->WriteBuffer(data,size);
	ImageStream->Position = 0;
	Image1->Bitmap->LoadFromStream(ImageStream);

	delete ImageStream;

}

だけでいいです。

自作のクラスなので、new 演算子経由でインスタンスを確保しなくてもおけです。なので、

Camera camera;
camera.TotalCount = ....

というスタイルで見慣れたポインタでインスタンスへアクセスし、”->”でプロパティーをいじるというのとは違います。こちらの方が普通のC++スタイルかな?というよりDelphiスタイル?

コールバックルーチンを省略する場合は、このように

EdsError EDSCALLBACK ProgressFunc(EdsUInt32 inPercent, EdsVoid* inContext, EdsBool* outCancel)
{

	//Form1->TransferProgress->Position = inPercent;
	return EDS_ERR_OK;
}

void UpdateProgressBar(unsigned long value)
{
	//Form1->TransferProgress->Position = value;
}

中身を空にすればおけです。ただしEDSCALLBACKは戻り値としてEDS_ERR_OKを返さないといけません。EDSなんとかが視界に入って気持ち悪い方は、これらのルーチンをNoCallback.h等として作ったヘッダーへ押し込めても良いですかね。筆者がこの程度見えても気にかけませんけどね。必要に応じて書き換えられることが大事ですね。

さあて、無事buildできたら実行しましょう。あっと、EDSDK.dllおよびNikonの実行モジュールをProject1.exeと同じ階層に置くのを忘れずに。忘れがちですよね。システムサイドのフォルダーにdll類を置く勇気がある方は、そうすればよろしい。32bitと64bitを混在する結果等々でリスクは高いです。実行プログラムと同じところに置くのが吉だと筆者は考えます。あ、実行するのでしたかね。(笑)

これが初期状態。で、”最大化”をクリックすると、

見かけのフォントサイズがかなり小さく見えますが、それだけ拡大されているということがご理解いただけますでしょうか?ブログの同じ画面サイズに押し込めると同じように見えてしまいますけどね。是非実際のPCの画面でご確認ください。CanonのEOSなんたらとかNikonのDなんたらのカメラをお持ちの方は是非。といってもSDKx2をダウンロードするのが面倒ですか?

コメント