オートメーションとは、次のコードのように、あるアプリケーションを別のアプリケーション内から自動的に制御する方法です。
手順 CreateNewWord;
変数
WordObj: バリアント;
始める
WordObj := CreateOleObject('Word.Basic'); {この関数は ComObj ユニットで宣言されています}
WordObj.AppShow;
WordObj.FileNew;
終わり;
このコードは、WORD を開き、新しいドキュメントを自動的に作成します (もちろん、WORD がマシンにインストールされていることが前提です)。では、どのようにすれば、プログラムにも WORD と同様の自動化機能を持たせることができるのでしょうか。他の言語で開発されたプログラムでプログラムを自動化できますか? DELPHI を使用して実装するのは非常に簡単です。
この記事では、単純なオートメーション サーバーを開発する方法を例とともに段階的に説明します。
新しい通常のアプリケーションを作成し、プロジェクトを AutoSrv.bpr として保存します。メイン フォームに編集コントロールを配置し、MainForm.pas として保存します。ここでは、ウィンドウのタイトル、フォームの色、およびテキストを自動的に追加する予定です。コントロールを編集し (もちろん、これにより実装される関数はほとんどありませんが、自動サーバー プログラムの開発方法を説明するには十分です)、次のコードをメイン ウィンドウに追加します: (注: これらの関数とプロシージャの宣言を TForm1 に追加してください)公共エリアでご自身で)
関数 TForm1.GetCaption: 文字列;
始める
結果 := Self.Caption;
終わり;
プロシージャ TForm1.SetCaption(ACaption: string);
始める
Self.Caption := ACaption;
終わり;
プロシージャ TForm1.SetColor(AColor: TColor);
始める
Self.Color := AColor;
終わり;
プロシージャ TForm1.SetEditText(AText: string);
始める
Self.Edit1.Text := AText;
終わり;
次に、このプログラムにオートメーション関数を追加しましょう。[新しい項目] ボタンをクリックし、ポップアップの [新しい項目] ウィンドウで [ActiveX] タブをクリックし、[オートメーション オブジェクト] を選択して、[OK] ボタンをクリックし、ポップアップのオートメーション オブジェクト ウィザードに CoClass 名を入力します。 MyAutoSrv ウィンドウにアクセスすると、Delphi は AutoSrv_TLB.pas ファイル (クラス ライブラリ) とクラス ライブラリ インターフェイス クラスを実装するユニットを自動的に生成し、この新しいユニットを AutoSrvClass.pas として保存します。
このプログラムは自動化されたサーバーになったので、それに自動化されたインターフェイス関数を追加しましょう。
(1) [表示] -> [タイプ ライブラリ] メニューをクリックし、タイプ ライブラリ エディタで IMyAutoSrv インターフェイスを選択し、[新規プロパティ] をクリックして、そのプロパティを Read|Write として選択し、Caption という名前を付け、タイプを BSTR に設定します。
(2) [新しいメソッド] をクリックして SetColor という名前を付け、右側の [パラメータ] タブをクリックし、[追加] をクリックして新しく追加したインターフェイス関数にパラメータを追加し、パラメータ名を AColor に設定し、パラメータの種類を OLE_COLOR に設定します。
(3) [新しいメソッド] を再度クリックし、SetEditText という名前を付け、上記のメソッドを使用してパラメータを追加し、パラメータ名を AText に設定し、パラメータの種類を BSTR に設定します。
最後に、インターフェース関数の実装コードを追加すればOKです。
AutoSrvClass.pas の Uses セクションに MainForm を追加し、そのコードを次のコードに変更します。
ユニット AutoSrvClass;
{$WARN SYMBOL_PLATFORM オフ}
インタフェース
用途
ComObj、ActiveX、AutoSrv_TLB、StdVcl、MainForm;
タイプ
TMyAutoSrv = クラス(TAutoObject, IMyAutoSrv)
保護された
関数 Get_Caption: WideString;
プロシージャ Set_Caption(const 値: WideString);
プロシージャ SetColor(AColor: OLE_COLOR);
プロシージャ SetEditText(const AText: WideString);
終わり;
実装
ComServ を使用します。
関数 TMyAutoSrv.Get_Caption: WideString;
始める
結果 := Form1.GetCaption;
終わり;
プロシージャ TMyAutoSrv.Set_Caption(const 値: WideString);
始める
Form1.SetCaption(値);
終わり;
プロシージャ TMyAutoSrv.SetColor(AColor: OLE_COLOR);
始める
Form1.SetColor(AColor);
終わり;
プロシージャ TMyAutoSrv.SetEditText(const AText: WideString);
始める
Form1.SetEditText(AText);
終わり;
初期化
TAutoObjectFactory.Create(ComServer, TMyAutoSrv, Class_MyAutoSrv,
ciMultiInstance、tmApartment);
終わり。
このプログラムを一度実行すると、オートメーション サーバーとして自動的に登録されます。関連する登録情報は、レジストリの HKEY_CLASSES_ROOT 主キーで確認できます。
上記は、ここでオートメーション サーバーと呼ぶオートメーション サーバーの開発方法を示しています。
新しいプログラムを作成し、ボタンを追加し、VAR 領域でバリアント変数を宣言します: AutoSrv:ariant
次に、次のコードを Button1 に追加します。
プロシージャ TForm1.Button1Click(送信者: TObject);
始める
AutoSrv := CreateOleObject('AutoSrv.MyAutoSrv'); {この文字列はオートメーション サーバーのプロジェクト名と CoClass 名を加えたものです}
Self.Caption := AutoSrv.Caption;
AutoSrv.Caption := 'へへ';
AutoSrv.SetColor(CLRed);
AutoSrv.SetEditText('HAHA');
終わり;
CreateOleObject 関数は IDispatch タイプのインターフェイスを返します。これにより、プログラムは自動サーバー インターフェイスへの呼び出しに遅延接続できるようになります。たとえば、上記の AutoSrv.Hello を追加すると、プログラムをコンパイルして実行することもできます。ただし、Variant を使用すると、インターフェイス宣言を直接使用するよりも実行効率が低くなります。
実行してボタンをクリックすると、自動サービス プログラムがロードされ、フォームの色と EDIT1 の文字列がコードに従って設定されていることがわかります。