|
通常、C++BuilderやDelphiでActiveXを作ろう...などといった馬鹿げた考えは起こさないのか、なかなか資料もなく苦戦させられました
VCLの作成はどの書籍でも必ず取り上げられてはいるのですが... (当然でしょうが)
今回、VisualBasicで使用するためにActiveXコントロールの作成を行いました
尚、ここに書いてあるのは実体験をもとにしていますので、間違いなども含まれているかもしれません
作成開始
C++Builder/Delphiではメニューより「新規作成」で表示される「ActiveX」のタブを選択する事で容易にひな形を作成してくれます
「Activeフォーム」を選択すると、フォームをベースにしたコントロールが作成可能です
「ActiveXコントロール」を選択すると既存のVCLをベースにしたコントロールが作成可能となります
今回は「Activeフォーム」をベースに作成を行いましたが、「ActiveXコントロール」をベースにした場合もほとんど同じだと思います
ActiveXフォームについて
「ActiveXの名前」「ユニット名」「プロジェクト名」の入力を求められます
「ActiveXの名前」を入力すると、あとの二つの項目はデフォルトの命名形式での名前となります
通常はそのままでよいのではないでしょうか
今回は全てデフォルトのままで行いました
#まあ、ファイル名の付け方の規約を決めていれば、それに従えばいいでしょう(^^;
ひな形の自動生成
上記手順で行うと、勝手にいくつかの必要なファイルとプロジェクトを作成してくれます
作成されたファイル中に「〜.tlb」(タイプライブラリ)というものがあります
このファイルを開くと、「タイプライブラリエディタ」が起動されます
タイプライブラリエディタ
「タイプライブラリエディタ」を使うと、作成するコントロールに対するインターフェイスを容易に作成する事ができます
手っ取り早く、「インターフェイス」に「メソッド」もしくは「プロパティ」を追加します
インターフェイスを選んで右クリックするとメニューがあらわれますので、その中から「新規作成」→「Method」もしくは「Property」で追加します
メソッドの追加
メソッドを追加します
名前(関数名)を決め、パラメータとして引数を順に決めていけば、基本的なインターフェイスは完成です
パラメータは、「名称」「タイプ」「フラグ」をそれぞれ指定します
普通に関数を定義していくのとそれほど変わりはありません
パラメータ
メソッドの引数の指定です
「名称」は引数の名前です
「タイプ」はそのデータ型を表しますが、但し使える型は限られています(C++Builderなどでの独自の型は使用できません)
ここで独特な型として、VARIANTがあり、配列のやりとりなどもこのデータ型で行います
#ちなみにVisualBasicでは内部の変数の型は全てVARIANTとして扱われています
また文字列は、BSTR型というこちらも独特の型を用います
「フラグ」はその引数が「IN」「OUT」どちらであるかを指定します
「OUT」を指定した場合、データ型はポインタ型でなければなりません
「VARIANT」と「Variant」
引数の型が「VARIANT」の場合、関数内部で「Variant」として扱うと取り扱いが大変楽になります
関数 function (int PosX, VARIANT* data)
などといったメソッドを用意した場合、メソッド内部で、
Variant varData = Variant(data);
としてやると、引数data に対して、Variantのメソッドが使用できるため、便利です
最初、VARIANT構造体のメンバに対して直接アクセスしようとして四苦八苦してしまいました
VARIANT->vt 位で型をとる位はいいのですが、VARIANT->pparray をSAFEARRAYに...もっと早く思いつけばよかった(^^;
「BSTR」と「WideString」
文字列は全て、BSTR型で取り扱われます
C++Builderで文字列を扱う時にはほとんどAnsiStringですませていたので、最初AnsiStringをBSTR型に変換するのに悩んでしまいました
そうしている内に見つけたのが「WideString」です
自動で作成されたソースを見ていると、上記「WideString」を使って、
BSTR data = WideString.c_bstr();
のような書き方がされていました。これは、AnsiStringとCharとの関係に似ています
ところが...この「WideString」について、HELPに載っていない(見つけられない)のですが、AnsiStringと同様に使用できる為大変便利ですので重用しています
#一応、AnsiStringのメソッドでWideCharへの変換ができるのですが...「WideString」を使った方が容易です
|