
[ Client編 1 ]
オートメーションとは
Xオートメーションとは COM を基盤とする技術のひとつで分散オブジェクトの通信手段である。これを使用すると例えば自分のアプリケーションの中から Excel や Word などのオートメーション対応オブジェクトを簡単に操作する事が出来るようになる。また、このオートメーションの技術を Delphi アプリケーションにも実装する事ができる。今回は Excel を Delphi3 + オートメーションで操作する方法を紹介する。
古い仕様のオートメーション
Xオートメーションは OLE オートメーションの現在の正式な名称である。 Delphi 2.0 の頃のヘルプを見ると OLE オートメーションと言う言葉が使われてある。 Delphi 3 のヘルプではこれらのふたつの言葉が混同して使ってある。
Xさて、 Delphi 3 からは COM をサポートしたためオートメーションの使用方法が大幅に変更された。それを見る前に古い仕様を復習しておこう。 Excel のオブジェクトをオートメーションサーバーとして生成し、あれこれ操作する恐らく一般的な方法を掲載する。古い仕様を忘れてしまった人はここで思い出して欲しい。これを Delphi 3 で動かすにはライブラリのパスの変更が必要になる。
uses OLEAuto; //これが必要 var //OLEオブジェクトはVariantに代入 objExcel : variant; procedure TForm1.FormCrate(Sender : TObject); begin //ここで生成 objExcel := CreateOleObject('Excel.Application'); //いろいろな処理 objExcel.Visible := True; objExcel.Quit; end;
新しい仕様のオートメーション
ヘルプでオートメーションの説明、または Delphi 付属のマニュアルを見るとオートメーションの使用例はすべて古い仕様、要するに CreateOleObject を使ってある。そして注意書きで "これは Delphi 2.0 との互換のためにある"とだけ記されてある。じゃあ新しい仕様ではどう書くの?この問いに答えた記述は簡単には見つからない。実は Delphi 3 インストール時に一緒にインストールされるサンプルに答えはある。しかしこのオートメーションのサンプルは非常に複雑な仕様なので印刷してゆっくり読む事をお勧めする。さてもったいぶらずに新しい仕様で上記のエクセルの操作方法をコーディングしてみる。まず前準備が必要で、新しい仕様のオートメーションではタイプライブラリと呼ばれるオブジェクトのインターフェイスを宣言したファイル(拡張子が TL Bまたは OLB 、 Exe や Dll に含まれる場合もある)が必要になる。これが無いと開発が出来ない(訳でもないが、)。では以下の手順でエクセルのタイプライブラリを取り込んでみよう。(※ここでは Excel 95 を対象とする。)
1.新規のプロジェクトを作成した後、 [プロジェクト] メニューから [タイプライブラリの取り込み...] を選択する。
2.以下の"タイプライブラリの取り込み"ダイアログが開くので [追加] をクリックする。(リストにすでに Excel がエントリされている場合は追加しなくてもよい)
3.Excel のフォルダにある "XL5JP32.OLB" を選択して [OK] を押す。
4.Excel のタイプライブラリが Object Pascal の宣言に書き換えられ保存される。保存する場所はタイプライブラリの取り込みダイアログで設定する。デフォルトでは Delphi 3\Import\ に保存される。
5.ここまでを保存して実行してみよう。なぜかプロジェクトソースでエラーが出る。 Application.Initialize; でエラーである。実は Excel のタイプライブラリに同名の Application という変数が定義されているのが原因のようである。 Excel_TLB でApplicaiton を XApplication に一括置換する。そうすれば実行できるようになる。タイプライブラリの取り込みは予約語などと重複する宣言を書き直すのでこういうのはまれと思われる。
6.次にコーディングに入る。 Delphi3 でのオートメーションは COM ベースの実装になる。タイプライブラリから必要そうなもの(勘)を宣言してコーディングしていく。まずは以下のようなコードになると思う。
uses Excel_TLB; ・・・ procedure TForm1.Button1Click(Sender : TObject); var objXlsGlobal : _Global; objXlsApp : XApplication; begin objXlsGlobal := Co_ExcelApplicaiton.Create; objXlsApp := objXlsGlobal.XApplication; objXlsApp.Visible := True; //いろんな処理 ShowMessage('It's Automation Demo'); objXlsApp.Quit; end;7.コンパイルすると objXlsApp := objXlsGlobal.XApplication がエラーになる。互換の無い型と言われる。このXApplication はその名前からしていかにも XApplication 型のオブジェクトを返しそうだが違った。OLEVariant 型を返す。仕方が無いので objXlsApp を OLEVariant 型で宣言しなおす。こうなるとアーリーバインディングのありがたさが無くなってしまうが仕方ない。
procedure TForm1.Button1Click(Sender : TObject); var objXlsGlobal : _Global; objXlsApp : OLEVariant; begin objXlsGlobal := Co_ExcelApplicaiton.Create; objXlsApp := objXlsGlobal.XApplication;8.次はコンパイルも通り実行できるはずである。objXlsApp は最後にきちんとQuitメソッドで廃棄しておかないとエクセルは裏でずっと生き続けるので注意。
これが多分、新しいオートメーションの実装方法である。なぜ多分かと言うとはっきりした資料が無いからである・・・(泣)。
では次の章ではオートメーションサーバーの作成方法に入る。これも Delphi2.0 の頃とは雰囲気が違い、この章と同じく私なりの勝手な判断が大部分に含まれるので注意してほしい!