◆ [Delphi] スクリプト言語を利用し、ユーザによる処理実装を実現する方法 その2 : サンプルプログラム
どーもボキです。

PPA と ScriptControl で サンプルプログラムを作った。

将来的に実現したい機能は、
 「EXEの変数をスクリプトに渡し、スクリプト内でループ処理し途中結果をEXEに返す」
ってこと。
いきなりすべてを実現するサンプルを作るのは難しいので、まずはループ処理の実装から。

サンプルプログラムを作ってわかったことは、PPAは予想に反して使いやすい。
むしろPPAなら、やりたいことは現仕様のままで実現できそう。
反面ScriptControl は、まだ未知の部分もあるものの、使い物になりそうもない印象。詳細は以下。

Project-PPA (Pascalスクリプト) PPAサンプルプログラム
 良い意味で予想を裏切ってくれたPPA。理由は以下。

  ○スレッド処理を実装済み
   PPAがスレッド実行されるので、スクリプトで無限ループになっても、EXEがフリーズしない。

  ○登録した変数がスクリプト内で変更されるとイベントが発生する
   登録変数の更新毎にイベントが発生するので、EXEとの連動がとりやすい

  ○登録した変数値の変更は、スクリプト内のループ処理中でも可能
   スクリプトの処理位置に関わらず、常にEXEからスクリプトに最新値を渡すことができる

  ○スクリプトの実行を即座に中断できる
   スクリプトの実行状態に関わらず、EXEから即座にスクリプトの中断できる。無限ループに入っても安心。

ScriptControl (VBスクリプト) ScriptControlサンプルプログラム1
 想像以上に難儀だったScriptControl。理由は以下。

  ●スクリプトの実行自体がスレッドで処理できない。正確には、やり方がわからない。
   ScriptControlサンプルプログラム2を見てもらえばわかるように、
   スクリプトの実行部(ScriptControl.Run)をSynchronizeで実行させる必要があるため、スレッドにする意味がない。
   スレッド処理するには、ループ文はThread.Execute、ループ内処理はSynchronizeで処理させる必要がある。(参考)
   VBScriptでループ処理を記述した場合、ソレが出来ない。無限ループを含んだスクリプトを実行させるとEXEがフリーズする。
   EXEのフリーズを回避するため、ScriptControlサンプルプログラム1では、スレッドでVBS用フォームをShowModalで呼ぶようにした。(下図)
a0021757_1113344.gif

  ●EXE ⇔ スクリプト 間のデータやり取りが面倒
   方法1 : スクリプト内の関数の引数 と その戻り値 として渡す方法
     戻り値で結果を受け取るので、当然受け取れるデータはひとつのみ。
     また、結果が得られるのは、関数処理が終了したタイミングのみ。

   方法2 : ActiveXオブジェクトにデータやり取り用のプロパティを作成する方法
     サンプルプログラムの「5-Exposing Objects」 と 詳細説明 (英語)
     1からのクラスを作成に近い。やり取りさせるデータを明確にしなければ、オブジェクトのメンテだけで大変そう。
     この方法でも、スクリプト内に オブジェクトにアクセスさせる処理を記述する必要があるため、
     スクリプト と EXE処理 の完全な役割分担が出来ない。スクリプトからEXEの動作を管理してやる必要がある。

ScriptControlを使う線はほぼなくなったけど、もう少しだけScriptControl をもう少し勉強してみよう。
VBSで処理が実装できれば、スクリプトのデバッグ面で強みになるからね。

 
[PR]
by yozda | 2009-10-03 01:07 | プログラミング | Trackback | Comments(0)
トラックバックURL : http://yozda.exblog.jp/tb/9049419
トラックバックする(会員専用) [ヘルプ]
<< [日記] 会社のソフトボール大会 [Delphi] スクリプト言... >>