2011年4月7日木曜日

VBスクリプトを動かす(動画付き)

先日、ツイッターでMicrosoft Scriptコントロールの話題がでたのでDelphiでMicrosoft Scriptコントロールを
使うサンプルを作ってみた。

Microsoft ScriptコントールをDelphiに取り込む必要がある。

Microsoft Scriptコントール取り込むには、コンポーネントの取り込みを選択し


ActiveXコントールの取り込みを選択する。


(ここでタイプライブラリの取り込みを選択するとクラスがつくられないみたい
なので要注意)

コントロールの一覧からMicroSoft Scriptコントロールを選択する。



あとは、画面の支持にしたがってファイルを作成し、Microsoft Scriptコントールを
組み込みたいプロジェクトに読み込む。

ここから、実際につくったサンプル。

サンプルは、

1) a,b二つの引数を持つVBSのFUNCTIONプロシージャを実行する。
  2) VBSはメモコンポーネントに記述する。
3) メモコンポーネントに記述したFUNCTIONのリストをListBoxに表示する。
4) ListBoxから選んだFUNCTIONを実行し結果をラベルに表示する。

とゆうものです。

以下、ソースファイル

  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, MSScriptControl_TLB, StdCtrls;  
  8.   
  9. type  
  10.   TForm1 = class(TForm)  
  11.     Memo1: TMemo;  
  12.     スクリプトを登録: TButton;  
  13.     ListBox1: TListBox;  
  14.     選択した関数を実行: TButton;  
  15.     実行結果: TLabel;  
  16.     Label2: TLabel;  
  17.     procedure FormCreate(Sender: TObject);  
  18.     procedure FormClose(Sender: TObject; var Action: TCloseAction);  
  19.     procedure スクリプトを登録Click(Sender: TObject);  
  20.     procedure 選択した関数を実行Click(Sender: TObject);  
  21.   private  
  22.     { Private 宣言 }  
  23.     FScriptControl:TScriptControl;  
  24.   public  
  25.     { Public 宣言 }  
  26.   end;  
  27.   
  28. var  
  29.   Form1: TForm1;  
  30.   
  31. implementation  
  32.   
  33. uses ActiveX,VarUtils;  
  34.   
  35. {$R *.dfm}  
  36.   
  37. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);  
  38. begin  
  39.  FScriptControl.Free;  
  40. end;  
  41.   
  42. procedure TForm1.FormCreate(Sender: TObject);  
  43. begin  
  44.   FScriptControl := TScriptControl.Create(Self);  
  45.   {Jscriptを使用するときは、'VBSCRIPT'を'JScript'に変更する。}  
  46.   FScriptControl.Language := 'VBSCRIPT';  
  47. end;  
  48.   
  49. procedure TForm1.スクリプトを登録Click(Sender: TObject);  
  50. var  
  51.   i : Integer;  
  52. begin  
  53.   
  54.   ListBox1.Clear;  
  55.     
  56.  {Scriptコントロールにコードを追加}  
  57.  FScriptControl.AddCode(WideString(Memo1.Text));  
  58.   
  59.   {プロシージャコレクションを操作することでプロシージャーのリストを得る}  
  60.   for i := 0  to FScriptControl.Procedures.Count -1 do  
  61.   begin  
  62.   
  63.     {VB(VB6,VBA)用のCOMのコレクションは1基数のものが多いので注意}  
  64.     ListBox1.Items.Add(FScriptControl.Procedures.Item[i+1].Name);  
  65.   end;  
  66.   
  67. end;  
  68. procedure TForm1.選択した関数を実行Click(Sender: TObject);  
  69. var  
  70.   ResultStr : OleVariant;  
  71.   ParamArray : Variant;  
  72.   PParamArray : PVarArray;  
  73.   MyParams : PIntegerArray;  
  74. begin  
  75.     
  76.   {パラメータはヴァリアント型の配列で渡す必要がある}  
  77.   ParamArray := VarArrayCreate([01], varVariant);  
  78.   ParamArray[0] := 3;  
  79.   ParamArray[1] := 5;  
  80.     
  81.   PParamArray := VarArrayAsPSafeArray(ParamArray);  
  82.   ResultStr := FScriptControl.Run(WideString(ListBox1.Items[ListBox1.ItemIndex]),  
  83.                               PSafeArray(PParamArray));  
  84.   Label2.Caption := VarToStr(ResultStr);  
  85.   
  86. end;  
  87.   
  88. end.  

以下、コントロールの取り込みと上記プログラムを実行しているところのデモ動画


0 件のコメント: