ActiveX対応アプリケーションをLANSAフォームから起動するためには、アプリケーションの参照をフォームに追加する必要があります。一番簡単なのは、ActiveXコンポーネントをフォームまでドラッグする、という方法です。これにより、コンポーネントを定義するDEFINE_COMステートメントが生成されます。
次のステートメントは「Word Application」コンポーネントを参照するもので、#VA_WORDコンポーネントをドラッグしてフォーム上で放すと生成されます。
DEFINE_COM CLASS(#VA_WORD.Application) NAME(#VA_WORD)
フォームを実行したとき、このDEFINE_COMステートメントに到達すると、「Word Application」(のインスタンス)が起動されます。すでにWordが実行中でも、それとは別に起動されます。
実際に試してみる場合は、アプリケーション名を次のように「#WordApp」と変更しておくとわかりやすいでしょう。
DEFINE_COM CLASS(#VA_WORD.Application) NAME(#WordApp)
参照を生成するタイミングの制御
この例では、LANSAフォームを実行してもその時点では「Word Application」が起動されません。Wordをいつ起動するか制御するため、動的参照としてコンポーネントを定義しておき、ボタンのClickイベントに対応してこの参照を割り当てるようにしてみましょう。
動的にコンポーネントを定義するため、次のように、ReferenceプロパティをDEFINE_COMステートメントに追加します。
DEFINE_COM CLASS(#VA_WORD.Application) NAME(#WordApp) REFERENCE(*DYNAMIC)
これを実行した時点では、Wordの参照は生成されません。Wordの開始ボタンを押したときWordが起動されるようにするため、SET_REFコマンドを使って、ボタンのClickイベントにWordの参照を割り当てます。
EVTROUTINE HANDLING(#STARTBTN.Click)
SET_REF COM(#WordApp) TO(*CREATE_AS #VA_WORD.application)
ENDROUTINE
参照が存在することの確認
Wordの起動前にプロパティ、メソッド、イベントを使おうとするとエラーになります。したがって、初期状態ではフォーム上のボタン類を無効にしておき、Wordが起動してから有効にするよう制御しなければなりません。IF_REFステートメントは、Wordの参照が生成済みであるか否かを確認するために使います。Wordの開始ボタンのClickイベントに、次のコードを追加してください。
EVTROUTINE HANDLING(#STARTBTN.Click)
SET_REF COM(#WordApp) TO(*CREATE_AS #VA_WORD.application)
if_ref com(#wordapp) is_not(*null)
set com(#ShowHideBtn #gpbx_1 #rdbn_1 #rdbn_2 #rdbn_3 #Addbtn #InsBtn #SaveBtn #CloseBtn #PrintBtn) enabled(true)
endif
ENDROUTINE