2011年4月4日月曜日

UI と Activity の連携(2)

先程は簡単な Form を Activity 内部から呼び出して値の受け渡しを行いました。今度は Activity とは無縁のコンソールアプリケーションを起動し、その戻り値を受けわたしてみます。

WF4-1

今回の Workflow はこのような形です。新しく自作した Activity は ExecuteApplicationActivity となっている、指定したアプリケーションを実行しその戻り値を返却するための Activity となっています。CodeReceipe にもサンプルとして投稿してありますが、それを少々自分用にカスタマイズを行っています。例外処理についてはサンプルという事でご勘弁を・・・

Public Property TargetFile As String = ""
Public Property
ResultCode As Activities.OutArgument(Of Integer)

Private _executer As New Common.Executer '自前のAP実行用クラス

Protected Overrides Sub Execute(ByVal context As NativeActivityContext)
    Try
        Dim
targetFileStrings As String = ControlChars.Quote + Me.TargetFile + ControlChars.Quote
        If Me.Arguments.Trim <> "" Then
            targetFileStrings += " " + Me.Arguments
        End If

        'アプリケーションの起動
        'Execute application
        _executer.ExecuteProcessWait(targetFileStrings, "", True)

        context.SetValue(ResultCode, _executer.ResultCode(0))

    Catch ex As Exception

    End Try
End Sub

自前で用意している AP 実行用のクラスは内部で単純に Process クラスを用いて実行しているだけと思ってください。そして今回用意したシンプルに戻り値を戻すコンソールアプリケーションは次のようなロジックです。

Function Main() As Integer

    Dim targetTime As Integer = Now.Second
    Return targetTime

End Function

起動した際に現在の秒を返却しているだけ、という非常にシンプルなものとなっています。先程の ExecuteApplicationActivity で上記コンソールアプリケーションを起動させるようにプロパティとして設定、Workflow の変数として戻り値を受け取るための Int32 型の変数を一つ作成し、ExecuteApplicationActivity、Display 双方のプロパティに設定します。現在用意している DisplayActivity では、表示させる値を扱うプロパティは InArgument(Of String) として定義していますので、デザイナーのプロパティダイアログ上では [変数].ToString と設定してあげる必要があります。

WF4-2

Workflowを実行すると上記のように、コンソールアプリケーション実行の結果がDisplay Activityによって表示されたのが確認できます。このように Context を通して値をやりとりするので、既存 AP を Workflow から利用しようと考えた場合でも、出力用インターフェース仕様を決めてしまえば、後はそれほど手間が発生しなくなります。非常に簡単に Workflow に組み込めるのが体感できるのではないでしょうか。

0 件のコメント:

コメントを投稿