インタラクティブな
リッチクライアントの開発と実行
Magic xpa

本マニュアルに記載の内容は、将来予告なしに変更することがあります。これらの情報について MSE（Magic Software Enterprises Ltd.）および MSJ（Magic Software Japan K.K.）は、いかなる責任も負いません。
本マニュアルの内容につきましては、万全を期して作成していますが、万一誤りや不正確な記述があったとしても、MSE および MSJ はい
かなる責任、債務も負いません。
MSE および MSJ は、この製品の商業価値や特定の用途に対する適合性の保証を含め、この製品に関する明示的、あるいは黙示的な保証は一切していません。
本マニュアルに記載のソフトウェアは、製品の使用許諾契約書に記載の条件に同意をされたライセンス所有者に対してのみ供給されるものです。同ライセンスの許可する条件のもとでのみ、使用または複製することが許されます。
当該ライセンスが特に許可している場合を除いては、いかなる媒体へも複製することはできません。ライセンス所有者自身の個人使用目的で行う場合を除き、MSE または MSJ の書面による事前の許可なしでは、いかなる条件下でも、本マニュアルのいかなる部分も、電子的、
機械的、撮影、録音、その他のいかなる手段によっても、コピー、検索システムへの記憶、電送を行うことはできません。
サードパーティ各社商標の引用は、MSE および MSJ の製品に対するコンパチビリティに関しての情報提供のみを目的としてなされるものです。
本マニュアルにおいて、説明のためにサンプルとして引用されている会社名、製品名、住所、人物は、特に断り書きのないかぎり、すべて架空のものであり、実在のものについて言及するものではありません。

Magic xpa は Magic Software Enterprises Ltd. のイスラエルその他の国での商標または登録商標です。
Magic xpa Studio、magic xpa Client、magic xpa Enterprise Server および magic xpa RichClient Server は Magic Software Japan K.K.の商標です。
Pervasive.SQL® は Pervasive Software, Inc. の商標です。
IBM®, iSeries™, xSeries®, DB2® および WebSphere® は、IBM Corporation の商標または登録商標です。
Microsoft® および FrontPage® は、Microsoft Corporation の登録商標です。また、Windows™, WindowsNT™ および ActiveX ™

は Microsoft Corporation の商標です。
Oracle® は Oracle Corporation の登録商標です。
Linux® は Linus Torvalds の登録商標です。
GLOBEtrotter® と FLEXlm® は、Macrovision Corporation の登録商標です。
Interstage® は、富士通株式会社の登録商標です。
JBoss™ は、JBoss Inc. の商標です。
Systinet™ は、Hewlet-Packard Development Company の商標です。
一般に、会社名、製品名は各社の商標または登録商標です。
MSE および MSJ は、本製品の使用またはその使用によってもたらされる結果に関する保証や告知は一切していません。この製品のもたらす結果およびパフォーマンスに関する危険性は、すべてユーザが責任を負うものとします。
この製品を使用した結果、または使用不可能な結果生じた間接的、偶発的、副次的な損害（営利損失、業務中断、業務情報の損失などの損害も含む）に関し、事前に損害の可能性が勧告されていた場合であっても、MSE および MSJ、その管理者、役員、従業員、代理人は、いかなる場合にも一切責任を負いません。

Copyright 2009 Magic Software Enterprises Ltd.and Magic Software Japan K.K. All rights reserved.

2012 年 7 月 19 日

インタラクティブなリッチクライアントの開発と実行

1 インタラクティブなリッチクライアントアプリケーション
なぜリッチクライアントを使用するのでしょうか？ .................................................................................................1
リッチクライアントベースの開発 ................................................................................................................................................1
リッチクライアントベースの実行 ................................................................................................................................................1

2 サポートするアーキテクチャ
アプリケーションサーバのインフラストラクチャー .................................................................................................3
分散されたモジュール ....................................................................................................................................................................3
モジュールの分散 ............................................................................................................................................................................4

3 リッチクライアントタスクのライフサイクル
クライアントタスクの初期設定 ....................................................................................................................................................5
実行時のリッチクライアントタスク ............................................................................................................................................6
サーバ側とクライアント側のロジック ........................................................................................................................................6
コンテキスト管理 ............................................................................................................................................................................7
トランザクション ............................................................................................................................................................................8

4 リッチクライアントタスクの構成
リッチクライアントの開発概念 .....................................................................................................................................9
SDI ......................................................................................................................................................................................................9

イベントドリブンエンジン .............................................................................................................................................9
基本的な定義 .....................................................................................................................................................................10
リッチクライアントタスクのタイプ ............................................................................................................................................10

ユーザインタフェース .....................................................................................................................................................10
リッチクライアントフォーム ........................................................................................................................................................10

サブフォーム .....................................................................................................................................................................10
サブフォームが必要な場合 ............................................................................................................................................................11

フレームレイアウト .........................................................................................................................................................12
色とフォント .....................................................................................................................................................................12
リッチクライアントタスクの設定 .................................................................................................................................12
アイコンファイル名 ........................................................................................................................................................................13
トランザクションモード ................................................................................................................................................................13

リッチクライアントプログラムの設定 .........................................................................................................................13

5 実行時の動作
コール処理コマンド .........................................................................................................................................................14
別のリッチクライアントタスクを呼び出す ................................................................................................................................14
他のタスクを呼び出す ....................................................................................................................................................................15

エラー処理コマンド .........................................................................................................................................................15
クライアント側のメッセージ ........................................................................................................................................................15

システムイベントハンドラ .............................................................................................................................................16
リッチクライアントの内部処理 ....................................................................................................................................................16

エラー処理 .........................................................................................................................................................................16
リッチクライアントタスクでの例外 ............................................................................................................................................16

クライアントのリソースにアクセスする .....................................................................................................................16
実行ファイルの起動 ........................................................................................................................................................................16

非インタラクティブタスク .............................................................................................................................................17
メニューとツールバー .....................................................................................................................................................17
ステータスバー .................................................................................................................................................................17
ユーザ認証 .........................................................................................................................................................................17iインタラクティブなリッチクライアントの開発と実行

6 実行環境実行の準備 .........................................................................................................................................................................19
リッチクライアントモジュール ....................................................................................................................................................19
Magic xpa の実行モード ..................................................................................................................................................................20
初期プログラム ................................................................................................................................................................................20

Windows での実行 ............................................................................................................................................................20
必要条件 ............................................................................................................................................................................................20
ClickOnce ...........................................................................................................................................................................................20.NET マニフェストファイル ..........................................................................................................................................................21
Magic xpa のリッチクライアントインタフェースビルダ ..........................................................................................................21
マニフェストファイルの保護 ........................................................................................................................................................21
アプリケーションにパラメータを渡す ........................................................................................................................................22

モバイルでの実行 .............................................................................................................................................................22
必要条件 ............................................................................................................................................................................................22
Magic xpa のリッチクライアントインタフェースビルダ ..........................................................................................................23
インストールパッケージファイルの保護 ....................................................................................................................................23

XML データの暗号化 ......................................................................................................................................................23
実運用環境への移行 .........................................................................................................................................................23
実行ユーザ数の制限 .........................................................................................................................................................24
運用環境の更新 .................................................................................................................................................................24

7 MDI 動作環境のシミュレート
MDI 環境とはどのようなものでしょうか？ ...............................................................................................................26
なぜ、MDI フレームワークを使用するのでしょうか？ ...........................................................................................................26

MDI フレームワークの作成 ...........................................................................................................................................26
サブフォームを使用する ................................................................................................................................................................26

トランザクション .............................................................................................................................................................28
メニュー .............................................................................................................................................................................28

8 ブラウザコントロール
なぜ、他のアプリケーションにアクセスする必要があるのでしょうか？ .............................................................29
ブラウザコントロール .....................................................................................................................................................29
ブラウザコントロール特性 ............................................................................................................................................................30

帳票の作成と表示 - ブラウザコントロールの実装 .....................................................................................................30

9 アプリケーションのモニタ
目の前にある問題 .............................................................................................................................................................32
ロギング ............................................................................................................................................................................................32

Magic xpa のロギング ......................................................................................................................................................32
動作のロギング ................................................................................................................................................................................32
アクティビティモニタ ....................................................................................................................................................................32フィルタ ............................................................................................................................................................................................32
サーバ同期 ........................................................................................................................................................................................33
ネットワーク情報の表示 ................................................................................................................................................................33

10 プログラムの移行
事前準備 .............................................................................................................................................................................34
機能上の違い .....................................................................................................................................................................34
プルダウンメニュー ........................................................................................................................................................................34
他のプログラムを呼び出す ............................................................................................................................................................34
サポートされない関数 ....................................................................................................................................................................35
ユーザイベント ................................................................................................................................................................................35
バッチタスクからリッチクライアントタスクの呼び出し ........................................................................................................35
帳票出力 ............................................................................................................................................................................................35ii

インタラクティブなリッチクライアントの開発と実行

フォーム特性 ....................................................................................................................................................................................35
子ウィンドウ ....................................................................................................................................................................................35
ファントムタスク ............................................................................................................................................................................36
コントロール特性 ............................................................................................................................................................................36
コントロールの動作 ........................................................................................................................................................................36
データ項目 ........................................................................................................................................................................................37
ステータスバー ................................................................................................................................................................................37
物理トランザクション ....................................................................................................................................................................37
並行するコンテキスト間のイベント ............................................................................................................................................37
動作環境 ............................................................................................................................................................................................37
クライアントとサーバの式 ............................................................................................................................................................37

11 モバイル用の RIA アプリケーションの開発iii

インタラクティブなリッチクライアントの開発と実行

iv

インタラクティブなリッチクライアントの開発と実行

Chapter

1

インタラクティブなリッチクライアントアプリケーション
イ ン タ ラ ク テ ィ ブな リ ッ チ ク ラ イ ア ン ト アプ リ ケーシ ョ ンの簡単な開発 と 実行

Magic xpa はアプリケーションのフロントエンドとして、.NET ベースのクライアントを使用した高度なビジネスアプリ
ケーションの開発と実行を容易に行うとができます。Magic xpa はインタラクティブな .NET クライアント機能を提供します。これは、Magic xpa のアプリケーションサーバによってサポートされ、全てテーブルをもとに作成されたものです。このドキュメントは、インタラクティブな Web アプリケーションの開発と実行のための新しい技術に関する概要を説明したものです。

なぜリッチクライアントを使用するのでしょうか？
アプリケーションをリッチクライアントとして実行させるべきいくつかの理由があります。
アプリケーションをリッチクライアントにすることで、共通のインターネットネットワークを使用して世界中でアクセスすることができる、Web アプリケーションになります。

リッチクライアントベースの開発
Magic xpa はインターネット対応のインタラクティブなアプリケーションを迅速に開発することができます。テーブルをもとに簡単に開発する機能を使用することで、アプリケーションの実行環境やコンポーネント、およびロジックを簡単に定義することができます。Java や JavaScript などのようなリッチクライアントのプログラミングに関する知識もあまり必要としません。Magic
xpa のリッチクライアント開発機能では、以下のことが可能になります。

• 容易なフォーム設計 …… Magic xpa Studio 上でリッチクライアントタスクのフォームを設計することが可能な、統合された［フォーム］エディタを提供しています。外部ツールは必要ありません。

• クライアント / サーバ間のロジックの切り分けの自動化 …… Magic xpa は定義内容に基づいて、ロジックがサーバまたはクライアントのどちらで実行されるかを自動的に決定します。

• ローカルなクライアント OS 環境との対話機能 …… リッチクライアントを使用することで、ローカルな環境変数の読み込みやローカルコマンドの実行などローカル PC との対話処理を行うことができます。

リッチクライアントベースの実行
マルチスレッドで動作する Magic xpa のアプリケーションサーバは、大量のトランザクションとリクエストを迅速に処理することができます。アプリケーションサーバは、個々のクライアントの処理を扱い、各ユーザのコンテキストを透過的に管理します。リッチクライアントの実行機能には以下のような便利な機能があります。

• シンクライアント …… リッチクライアントを使用することで、クライアント側に専用のソフトウェアをインストールする必要がなくなります。サーバでクライアントで必要なすべてのデータ、ロジック、およびフロー管理モジュールを提供します。アプリケーションのすべてのソフトウェア要素はサーバ側に存在します。これにより、管理や保守が容易となり、経費が削減され拡張性が向上します。

• OS のネイティブなルック & フィール …… リッチクライアントは、.NET ベースで作成されており、クライアント OS に基づいたルック & フィールで動作します。

1

インタラクティブなリッチクライアントの開発と実行• コンテキスト管理 …… リッチクライアントタスクのために、アプリケーションはサーバ側でコンテキストを作成します。開始から終了するまで、コンテキストはタスクの状態を記録します。

• 自動化されたデータ管理とクライアント / サーバの同期化 …… サーバは自動的にデータ管理とトランザクションを処理します。

• ブラウザを使用しない …… 実行には Web ブラウザを必要としません（最初の起動時のみ、InternetExploler が必要です）。

2インタラクティブなリッチクライアントの開発と実行

Chapter2

サポートするアーキテクチャ
エン ド ユーザはど の よ う にアプ リ ケーシ ョ ンにア ク セ スする ので し ょ う か？そ し て、 アプ リ
ケーシ ョ ンサーバはど の よ う に リ ク エ ス ト を処理する ので し ょ う か？

Magic xpa のアプリケーションサーバの実行環境は、Magic xpa によって提供される分散アプリケーションアーキテクチャを使用することで、簡単に構築することができます。アプリケーションサーバは、多数のユーザからの同時アクセスを処理するために設計されたコンテキスト管理機能によって自動的に最適化されます。

アプリケーションサーバのインフラストラクチャー
Magic xpa のアプリケーションサーバのエンジンは、リッチクライアントからのリクエストを処理するために開発されています。

分散されたモジュール
Magic xpa のアプリケーションサーバを構成する基本的なモジュールは、以下の通りです。

WWW サービス機能
Web サーバは、リモート上のリッチクライアントからリクエストを受け取るために必要です。Magic インターネットリクエスタ
を使用することで、Web サーバはリクエストをアプリケーションサーバに送ることができます。

インターネットリクエスタ
Magic xpa はインターネットリクエスタのモジュールを提供します。これは実行モジュールとして Web サーバと組み合わせて利用されます。クライアントからのリクエストがインターネットリクエスタに送られると、モジュールは添付データを含めたリク
エストをアイドル状態のアプリケーションサーバに送ります。Magic xpa のインターネットリクエスタは、MRB（Magic Request
Broker）によって管理されているサーバエンジンのリストを使用してアイドル状態のアプリケーションサーバを見つけることが
できます。

MRB
Magic xpa は MRB と呼ばれるミドルウェアエージェントを提供します。MRB は利用可能なアプリケーションサーバエンジンを処理し、インターネットリクエスタから利用可能なアプリケーションサーバエンジンにリクエストを送信します。MRB には、
ロードバランシング機能と障害発生時に対する回復機能があります。

Magic アプリケーションサーバ
Magic アプリケーションサーバは、インタラクティブなリッチクライアントアプリケーションを実行する上で中心的な役割を果たします。これが実際の実行ユニットです。これは各リクエストを処理し、受信された各タイプのリクエストに対するアプリ
ケーションロジック全体を実行します。アプリケーションサーバは、MRB が実行されている場所を指定することで、MRB と接続しサーバエンジンをインターネットリクエスタで利用可能になるようにさせる必要があります。

3

インタラクティブなリッチクライアントの開発と実行

アプリケーションサーバエンジンは、1 つのエンジンのプロセスを使用して、複数のリクエストを処理するように設計されています。これは、Magic サーバエンジンのマルチスレッド機能を使用して実現しています。

モジュールの分散
上記のモジュールは同じマシン上にインストールしたり、異なる OS を使用した異なるマシン上に分散させることもできます。
Magic xpa のインストール処理とアプリケーションサーバによって、必要なモジュールのインストールと実行のための環境設定は自動的に行われます。インターネットリクエスタは、クライアント側から送られるリクエストを処理します。インタネットリ
クエスタは、Magic エンジンと異なる PC 上に置くこともできます。

図 2-1 この図は、リッチクライアントがどのようにアプリケーションサーバと通信し、どのように返り、分散されている Magic xpa モジュール間でどのように相互作用しているかを表しています。

4インタラクティブなリッチクライアントの開発と実行

Chapter3

リッチクライアントタスクのライフサイクル
タ ス ク の ラ イ フサ イ ク ル （ リ ク エ ス ト が送 ら れてか ら 、 タ ス ク 処理が完了する ま でに タ ス ク 内で行われ る処理内容） について よ り 詳細に知っ ておいて く だ さ い。
ッチクライアントタスクには、オンラインタスクのほぼ全ての機能が備わっています。タスクはレコードまたはタスクのレベルでトランザクションをオープンし、どのようなロジックユニットも処理することができます。リッチクライア
ントタスクは、暗黙のうちにタスクやレコード、コントロールの各ロジックユニットを実行し、基本的なデータの参照や操作（スクロールや修正、削除、作成）を行うことができます。また、ほとんどの Magic xpa の処理コマンドや関数を実行することができます。

リ

クライアントタスクの初期設定
リッチクライアントプログラムを実行させるための最初のリクエストによって、Magic エンジンは要求されたリッチクライアントタスクを開きます。このリクエストのためにコンテキストがオープンされ、ユニークなコンテキスト IDが作成されます。コンテキストが作成されたことを知らせるために、短い応答がすぐにリッチクライアントエンジンに戻ります。
応答を受信すると、2 番目のリクエストが Magic サーバに送られます。これはサーバ上で以下の処理を実行することをリッチク
ライアントタスクに示すものです。
1. 暗黙の初期設定。これは、以下の処理を実行します。

• タスクに定義されたデータベーステーブルをオープンします• 変数項目を初期設定します• 範囲と位置付を行います• 最初のデータビューを作成します
2.［タスク前］ロジックユニットに定義された処理コマンドを実行します。
タスク定義自体は、Magic エンジンによって定義されていますが、アプリケーションサーバはタスクのインタフェース情報やロジック、データ内容を 1 つの XML データに変換します。XML データはリッチクライアントエンジンに送られ、エンジンはその構造や関数、定義されたタスクロジックに従ってインタフェースを表示します。
XML データの内容は、リッチクライアントエンジンに送られる情報量を減らすために圧縮されます。
これらのサーバ側の処理コマンドに続いて、［タスク前］と［レコード前］の更新処理によって影響するすべての関連データを使用して XML 形式の結果ページが作成されます。このファイルは、リッチクライアントエンジンに送られ、組み立てられて、
エンドユーザで参照できる状態になります。
リッチクライアントプログラム内の、データビューとして BLOB 項目が沢山定義されている場合、（他のデータ型の項目と同じように）BLOB 項目はサーバとクライアントの間でやり取りが行われ、プログラムのパフォーマンスを低下させる原因となります。
BLOB 項目を使用する必要がないのであれば、データビューで定義しないようにすることを推奨します。サーバ側の処理で使用するための項目であれば、これらの項目を処理するためのバッチタスクを別途作成するようにしてください。

5

インタラクティブなリッチクライアントの開発と実行

実行時のリッチクライアントタスク
リッチクライアントタスクがクライアント側で構築されると、データおよびタスクとそのデータのために定義されたロジックが実行され、エンドユーザで利用可能になります。Magic xpa の標準的な実行機能に加え、受け取った XML
データに基づいてアプリケーションに定義されたタスクロジックが実行されます。

ロジックユニット
リッチクライアントモジュールは、タスクに定義された関連するロジックユニットを自動的に実行します。

タスクレベル
タスクの起動時、［タスク前］で初期設定処理が実行されます。これはサーバ側で実行されるロジックユニットで、クライアン
ト側の処理コマンドはここでは実行されません。タスクの終了時には、［タスク後］が実行されます。ここでは定義されている
処理コマンドに依存し、サーバ側で実行されたり、クライアント側で実行されたりします。

レコードレベル
エンドユーザが現在のレコードにカーソルを移すと、そのレコードに対して［レコード前］が実行されます。
［レコード後］は、修正されたレコードを抜けた場合や、［タスク特性］の［強制レコード後］特性が「Yes」に設定された場合、または、レコードの削除を行った後に実行されます。

コントロールレベル
コントロールにパークされると、そのコントロールの［コントロール前］が実行されます。カーソルがそのコントロールから抜けた場合、そのコントロールに対する［コントロール後］が実行されます。レコードが修正された状態でそのコントロールを抜けると、［コントロール後］の前にそのコントロールに対する［コントロール検証］が実行されます。

エラーレベル
対応するエラーが発生した場合、エラーに対する［イベント］ロジックユニットが実行されます。このロジックユニットは、サーバ上で実行されます。エラー処理の詳細について、Magic xpa の『リファレンスヘルプ』内のエラー処理の説明を参照してください。

その他のイベントロジックユニット
タスクがアイドル状態にある場合にイベントが発行されすると、このイベントに対応した、システム、内部、ユーザ、タイマ、
および式の各［イベント］ロジックユニットが実行されます。

タスクモードリッチクライアントタスクは、照会、修正、作成、および削除の各基本的なタスクモードが指定可能で、その実行規則に基づいて実行されます。例えば、照会モードではデータの修正や削除ができず、修正モードでは可能になります。

再計算
リッチクライアントエンジンは、データを修正することで再計算を発生させることができます。修正されたデータに基づいて、項目やリンクレコード、および［可視］特性の値が自動的に再計算されます。

サーバ側とクライアント側のロジック
リッチクライアントタスクのロジックには、Magic xpa で利用可能なほとんどの処理コマンドや関数を利用することができます。しかしその特性上、サーバ上で実行させる必要があるため、クライアント側で実行させることができな
いものがあります。1 つの例として、［フォーム出力］処理コマンドと DbDel 関数があります。
［フォーム出力］処理
コマンドは、リッチクライアントタスクで利用できないことに注意してください。

透過的な処理リッチクライアントエンジンは、処理コマンドと関数をサーバ側で実行させるかクライアント側で実行させるかを自動的に区別しています。XML データが作成される際に、処理コマンドや処理コマンドが使用する関数のタイプに基づいて、サーバ側なのかクライアント側で実行されるかの情報を含めています。
ノート

6

インタラクティブなリッチクライアントの開発と実行

リッチクライアントは、処理コマンドが定義されるテーブル内で、どちらで実行されるかが定義内容に基づいて表示されます。これは、混合モードとして処理コマンドを定義した場合、リッチクライアントエンジンは、サーバ側とクライアント側の異なる処理モードを切り替えながら実行することを意味しています。この場合、パフォーマンス上の問題が発生します。
Magic xpa はモードが混在するような設定を行った場合、構文チェックユーティリティによってチェックされます。このような場合は、サーバ側で実行される関数と処理コマンドの使用を最小化するようにしてください。

処理コマンド［エラー］処理コマンドなどの処理コマンドは、クライアント側でのみ実行可能です。
［コール Web サービス］処理コマンドなどの処理コマンドは、サーバ上でのみ実行されます。
他の処理コマンドは、それらのパラメータと特性に基づいてサーバ側またはクライアント側で実行されます。

動的なインタフェース定義［コントロール特性］は常にクライアント側で評価されます。その結果、サーバ側の関数を含む式が定義された場合はパフォー
マンスが低下します。このため、［コントロール特性］に対するサーバ側の関数の定義は許可されず、構文チェックユーティリ
ティでエラーになります。

リンクコマンド［リンク］コマンドは、手続上の処理コマンドではありませんがサーバ側で実行されます。これは、リンクが再計算されるたびに新しいリンクを実行するため、リッチクライアントがサーバを参照することを意味しています。

コンテキスト管理
並行実行のリッチクライアントタスクを新規に実行した場合、呼び出された初期プログラムはサーバ側でコンテキストを作成します。それが実行する瞬間から終了する瞬間までコンテキストはタスクの状態を記録します。各コンテキ
ストはコンテキスト ID によって識別されます。これは、サーバ上にある同じコンテキストの連続的なリクエストを識別させるために使用されます。

コンテキスト ID
新しいコンテキストが作成された場合、ユニークなコンテキスト ID が新しいコンテキストのために作成され、クライアントに送り返されます。リッチクライアントタスクのライフサイクル中に作成されたすべてのリクエストによって、クライアントはコンテキスト ID をアプリケーションに戻します。このように、アプリケーションサーバは、リクエストがどのコンテキストに属するリッチクライアントなのかを認識することができ、そのタスクのコンテキスト内でこの（リッチ）クライアントを提供し続けることができます。

コンテキストの内容
コンテキストにはタスクの構造に関するすべての情報が含まれています。例えば、全てのタスクやメインのタスクからオープン
されるサブタスク、実行ツリー構造内のクライアントの位置などが含まれています。またコンテキストは、データベースカーソ
ルをタスクとそのサブタスクのためにオープンできるようにしておきます。
コンテキストは、サーバに返されるすべてのデータ操作ステートメントを、定義されたトランザクション内に保持しています。
コンテキストは、リッチクライアントタスクの実行情報を保持しています。これは指定されたコンテキストに対してローカルに処理されます。実行情報には、メモリテーブルや常駐テーブル、メインプログラムの項目、SetParam 関数によって設定されたグ
ローバルパラメータ、および環境設定が含まれます。これらの実行情報ユニットのインスタンスは、新しいコンテキスト毎に別々に発生し、修正内容はそのコンテキストでのみ参照できます。

コンテキスト非稼働タイムアウト
サーバ側で保持されるコンテキスト情報は、メモリリソースを必要とします。たくさんのシステムリソースを使用する可能性があるコンテキストを保持する場合、サーバの負荷を軽減するためコンテキストにタイムアウトを設定することができます。
［コンテキスト非稼働タイムアウト］の設定は、［オプション \ 設定 \ 動作環境 \ アプリケーションサーバ］にあります。この設定は、クライアントが非稼働状態をチェックする時間間隔を指定します。
「コンテキスト非稼働」とは、リッチクライアントタ
スクの実行中にクライアント / サーバ間のアクセスがない状態を意味します。
［コンテキスト非稼働タイムアウト］は、1/10 秒単位で設定します。デフォルト値は 6000（10 分）です。
コンテキストがタイムアウトに到達すると、コンテキストはサーバから削除されます。このタイムアウトを設定することで、放棄されたコンテキストがサーバ上に蓄積されることを防止することができます。
リッチクライアントタスクが開発モードで実行された場合、［コンテキスト非稼働タイムアウト］は無制限になります。

7

インタラクティブなリッチクライアントの開発と実行

データ操作
リッチクライアントエンジンは、データの修正処理（レコードの修正、登録、削除）を行うことができます。すべてのデータ操作ステートメントはリッチクライアントエンジンによって保持され、以下のインスタンスでサーバに送られます。
1. レコードレベルのトランザクションでレコードを抜けた場合
2. タスクレベルのトランザクションでタスクを終了した場合

トランザクション
Magic エンジンは、リッチクライアントタスクによって生成されたデータ修正によるトランザクションを処理します。
リッチクライアントタスクでは、「遅延トランザクション」と呼ばれるトランザクションを使用します。

遅延トランザクション
クライアントから送られたすべてのデータ操作はコンテキストによって保持され、トランザクションが完了するまではデータ
ベースエンジンに送られません。トランザクションがロールバックされた場合、保持されているトランザクション情報は廃棄されます。Magic エンジンがデータベースエンジンの物理トランザクションを遅延させるようなデータ操作方法を、「遅延トランザクション」と呼びます。
トランザクションのこの処理は、すべての特定のデータ操作ステートメントに対して、繰り返される送信処理をデータベースエ
ンジンに保存し、アプリケーションサーバの能力より大きなスケーラビリティを提供します。
遅延トランザクションの詳細は、Magic xpa の『リファレンスヘルプ』の「データ管理」のセクションか『データ管理』のホワ
イトペーパを参照してください。

8

インタラクティブなリッチクライアントの開発と実行

Chapter4

リッチクライアントタスクの構成
Magic xpa には、 リ ッ チ ク ラ イ ア ン ト タ ス ク の ロ ジ ッ ク と その イ ン タ フ ェース を定義する ための容易で簡潔なパ ラ ダ イ ムがあ り ます。

データビュー定義とリッチクライアントタスクのロジックは、イベントドリブンで SDI 形式のオンラインタスクと同じように構成されています。リッチクライアン トタスクは、インタフェース定義がオンラインタスクと異なっています。また、タスクの一般的な動作もリッチクライアントの性質上、異なるものがあります。

リッチクライアントの開発概念
SDI
リッチクライアントの概念は、Magic xpa の SDI プログラムのパラダイムの機能や可能性の一部分として成り立っています。SDI プログラムは、それ自身でメニューやツールバー、およびステータスバーを持ち、他のタスクと並行して実行させることができます。SDI プログラムは、フローティングウィンドウやモーダルタスクのような並行して実行させることのできない別のタスクを呼び出すこともできます。
リッチクライアントの動作が SDI のため、MDI 環境が全くない状態になります。利用可能なメニューは SDI クライアントに表示されます。これを前提としてアプリケーションを設計する必要があります。このドキュメントでは、「MDI ライク」なインタ
フェースを設計する方法についても説明します。
SDI の環境と特性の詳細については、Magic xpa の『リファレンスヘルプ』を参照してください。
ノート
リッチクライアントの開発と実行は、SDI のパラダイムに基づいていますが、.Net 環境の制限のため、すべての機能が利用できるわけではありません。動作環境による制限については後で説明します。

イベントドリブンエンジン
リッチクライアントアプリケーションを設計するために、Magic xpa のイベントドリブンアーキテクチャを使用すると、以下のような利点があります。

• アプリケーションのロジックが理解しやすくなります。
• アプリケーションがより柔軟になります。
• 分析が容易になります。
• コードが再利用できます。
イベントドリブン方式を使用することで、エンドユーザの操作とは独立したコードを作成することができ、より効率的なアプリ
ケーションを作成することが可能になります。アプリケーションのビジネスプロセスに名前を付けたり、イベントと対応するロ
ジックユニットの関係を明確にすることで、アプリケーションがより理解しやすく、より扱いやすいものにすることができます。
すべてのアプリケーション要素を処理するために、それがタスクやレコード、コントロールであったとしても、イベントドリブ
ンアーキテクチャを使用するようにしてください。
再使用可能なグローバルなロジックユニットを定義するために、ハンドラの階層構造を利用することができます。

9インタラクティブなリッチクライアントの開発と実行

イベントドリブンアーキテクチャの詳細については、『イベントドリブンアーキテクチャ』のホワイトペーパを参照してください。

基本的な定義リッチクライアントタスクのタイプ［タスク特性］内で、［タスクタイプ］特性を「C= リッチクライアント」と定義することができます。タスクをリッチクライアントと指定することで、開発及び実行時にリッチクライアントタスクとしての適切な機能が提供されます。

データビュー定義
リッチクライアントタスクのデータビューは、そのメインソースと任意の数のリンクテーブルを使用してオンラインタスクと同じように定義することができます。
ノート［リンク］コマンドによる再計算が発生すると、リッチクライアントエンジンは、アプリケーションサーバエンジンに接続し、新しいレコードを取得します。このため、あまりにも多くの［リンク］コマンドを使用すると、サーバ側との処理に負荷がかかる可能性があります。
従って、［リンク］コマンドはできるだけ使用しないようにすることを推奨します。例えば、データコントロール（データソースの内容をもとに、選択肢を表示させるコンボボックスのような選択コントロール）を使用することで［リンク］コマンドの代わりになる場合があります。
また、［結合リンク］コマンドを使用する場合もあります。この場合、コマンドはメインソースと一緒にデータ
ベースからフェッチされ、データの 1 つの集まりとしてリッチクライアントエンジンに送られます。
アプリケーションのデータ構造を定義したり、タスクのデータビューを定義する内容に関する詳細は、Magic xpa の『リファレンスヘルプ』を参照してください。

並行性
リッチクライアントタスクの並行動作は、オンラインタスクとは異なります。リッチクライアントタスクは、その親タスクとその実行時のタスクツリー内の他のすべてのタスクと並行して実行されます。しかし、階層内の親タスクまたは他の全てのタスクを終了した場合、下位の全てのスクは自動的に終了します。
タスクの［並行実行］特性を「True」に設定すると、新しいコンテキストでタスクが起動されます。新規コンテキストで実行されるタスクの優位性は、起動元のタスクが終了しても呼び出されたプログラムが終了しないということです。

ユーザインタフェース
リッチクライアントフォーム
リッチクライアントフォームは、通常のオンラインフォームと同じ方法で定義することができます。
リッチクライアントの場合のフォーム定義は、SDI のメカニズムに基づいていますが、いくつか利用できない特性があります。例えば、MDI が存在しないフォームの場合、［開始位置］特性の「MDI の中央」のオプションが無効になります。このようなオプションは指定できません。

リッチクライアントコントロール
リッチクライアントの［フォーム］エディタでは、通常のオンラインフォームと同じように様々なユーザインタフェースを定義することができます。通常のオンラインタスクのコントロールと同じように、ページの色々なコントロールを定義し、データをそれに割り当て、特性を自由に定義することができます。
インタフェース定義によって、コントロールの表示を様々に変えることができます。各コントロールの［特性］シートには、設定可能な色々な特性が表示されています。リッチクライアントでは、オンラインタスクとまったく同じコントロールをサポートしているわけではありません。サポートされないコントロールは無効表示されます。

サブフォームMagic xpa は、1 つの単一のインタフェース内に異なるタスクのデータを簡単に表示させることができます。各タスクは定義されたロジックに従って、指定されたインタフェース部分を処理します。リッチクライアントは、カーソルの位置に基づいて、あるタスクから別のタスクに透過的に制御を切り換えることができます。

10インタラクティブなリッチクライアントの開発と実行

サブフォームが必要な場合
リッチクライアントが、メインのビューの上に（データが複数のレコードから構成される）特別なデータを表示するように設計する場合、サブフォームが必要になります。これは通常「1 対多の関係」と呼ばれます。
このような場合、通常は複数のタスクが関連しますが、［サブフォーム］コントロールを使用することで、2 つの個別のタスクを同じインタフェース内に表示させることができます。
［サブフォーム］コントロールの境界内に別のタスクのフォームを表示させることで、1 対 1 の関係でもサブフォームを使用することもできます。

サブフォームコントロール［サブフォーム］コントロールは、メインのリッチクライアントタスクのコントロールの 1 つとして定義されます。ここでタスクが指定されると、子タスクを呼び出します。
［サブフォーム］コントロールは、メインのタスクに別のタスクの表示の一部を処理するという論理的な定義になります。

パラメータ
データや項目、または式を指定することで、呼び出すタスクにパラメータを渡すことができます。渡されたパラメータは、呼び出されたタスクに単にデータを渡すためだけに必要なのではありません。パラメータは、リッチクライアントが子タスクのビューを再表示させるための基準となります。
サブフォームのパラメータとして渡された項目が変更されると、そのサブフォームのビューは自動的に再表示されます。パラメータが式で渡される場合、値が変更されてもサブフォームのビューは再表示されません。パラメータとして何も渡されない場
合、サブフォームはメインのタスクレコードをスクロールしても再表示されません。サブフォームの再表示は、［サブフォーム］
コントロールの［自動再表示］特性に依存します。この特性の詳細については、Magic xpa の『リファレンスヘルプ』を参照してください。
ノート
下位のタスクがメインのタスクのサブタスクの場合、メインのタスクの［データビュー］エディタに定義された項目は、パラメータとして渡さなくても直接アクセスすることができます。
しかし、子タスクのデータビューに関連する項目は、サブフォームの再表示機能を実行させるためにパラメータとして渡す必要があります。

ネストされたサブフォーム
メインのタスクに複数のサブフォームを定義することができます。各サブフォームには、独自にネストされたサブフォームを定義することもできます。

サブフォームのライフサイクル
Magic xpa のアプリケーションサーバは、サブフォームとして定義されているすべてのタスクを自動的にオープンします。その際、サブフォームタスク（サブフォームに定義されたタスク）に対する［コール］処理コマンドを定義する必要はありません。
ノート
サブフォームタスクは、親タスクに対する子となります。このため、サブタスクの［フォーム特性］の［ウィンドウタイプ］特性が「C= 子ウィンドウ」として定義されたように動作します。

リッチクライアントの初期設定
メインのタスクの［タスク前］を実行した後に、各サブフォームで定義されたタスクがオープンされ、［タスク前］が実行されます。メインタスクの［レコード前］が実行され、それに続いて各サブフォームタスクの［レコード前］タスクが実行されます。ネストされたサブフォームは、親のサブフォームの［タスク前］が実行された後でオープンされます。

実行中のリッチクライアントタスク
メインのタスクをスクロールし、パラメータとして渡される項目の内容が更新されると、サブフォームのデータビューは［自動再表示］特性に従って再表示されます。サブフォームタスクが再表示されても、サブフォームタスクの［タスク前］や［レコード前］は実行されません。
メインタスクのコントロールからサブフォームタスクのコントロールにカーソルが移動されると、サブフォームタスクに制御が切り替わり、対応するサブフォームタスクのレコードの［レコード前］が実行されます。

11インタラクティブなリッチクライアントの開発と実行

リッチクライアントの終了
サブフォームが定義されたタスクを終了すると、各サブフォームタスク の［タスク後］がその親タスクの［タスク後］の直前に実行されます。
ノート
サブフォームタスクは、単独で終了させることはできません。例えば、［イベント実行］処理コマンドで［終了］の内部イベントを発行させてサブフォームタスクを終了させようとした場合、メインタスクも終了します。

サブフォームまたはフレームの内容を置き換える［出力先］と呼ばれる新しい特性が、［コール］処理コマンドに追加されました。この特性には、プログラムをどのサブフォーム
上で実行させるかを指定します。Magic エンジンは実行しているプログラムを終了させ、新しいプログラムの初期設定を行います。これにより、［サブフォーム］コントロールに表示されるタスクを動的に変更させることが可能になります。
この機能は、［フレーム］コントロールに対しても有効です。

フレームレイアウト
タスクをリッチクライアントタスクとして定義した場合、フォームの（［クラス］カラムが「0」の場合の）インタフェースタイ
プは、自動的に「C= リッチクライアント表示形式」が設定されます。ただし、「A= リッチクライアントフレーム形式」に変更することもできます。
フレームを使用することで、1 つのウィンドウ内に複数のリッチクライアント画面を表示させることができます。各画面では、個別にプログラムを実行させることができます。

色とフォントオンラインタスクと同じ方法でコントロールの色とフォントを定義することができます。
リッチクライアントモジュールの初期設定の段階で、［アプリケーション特性］に定義されたアプリケーションの基本色とフォントが表示に使用されるリッチクライアントモジュールに渡されます。
ノート
指定されたフォントがクライアント側の PC で利用できない場合、OS が代わりにどのデフォルトフォントを表示するかを決定します。

リッチクライアントタスクの設定
ほとんどのリッチクライアントタスクの設定は、オンラインタスクと同じように行うことができます。ただし、リッチクライアントタスクには関係ない設定もあります。また、リッチクライアントタスクにだけ関係する設定もあります。ここでは、これらの設定のいくつかについて説明します。

チャンクサイズ（式）タスク \ 特性 \ 高度な設定［チャンクサイズ（式）］特性は、追加レコードとしてクライアントに渡されるレコード数を定義します。
例えば、この特性が「100」に設定された場合、アプリケーションサーバでタスクが起動されると、最初の 100 レコードがクライアントに渡されます。これによって、エンドユーザはローカル上で最初の 100 のレコードを参照することができるようになります。エンドユーザが、レコードの与えられた範囲を越えてスクロールしようとすると、クライアントはサーバに通知し、追加の 100 レコードを受け取ります。
レコードの集まりは、レコードのローカルキャッシュとしてクライアントに蓄積されます。エンドユーザがテーブルの最後や先頭に移動すると、ローカルキャッシュは消去され、キャッシュはレコードの 1 回分のチャンク数のレコード群を格納します。

ビュー事前読込
タスク \ 特性 \ データ

この特性は、事前にデータビュー全体を取得するかどうかを定義します。値が「True」に設定されると、サーバはタスクの初期設定中にデータベースからすべての関連するレコードを取得します。これは小さなテーブルに対しては、非常に便利です。この特性を「True」に設定した場合、［チャンクサイズ］特性の値をデータベースから取得されたすべてのレコードを保持する上で十分なサイズに設定することを推奨します。

12

インタラクティブなリッチクライアントの開発と実行

メインフォーム
タスク \ 特性 \ インタフェース

通常のオンラインタスクと同様に、複数のフォームを定義し、［メインフォーム］特性を使用して実行時に表示されるフォーム
番号を式で指定することができます。

アイコンファイル名
タスク \ 特性 \ インタフェース

通常のオンラインタスクと同様に、リッチクライアントタスクで表示されるアイコンを定義することができます。タスクにアイコンが定義されていない場合、［アプリケーション特性］で定義されたアイコンが表示されます。

トランザクションモード
タスク \ 特性 \ データ

リッチクライアントタスクは、「W= 有効な遅延トランザクション」（上位タスクでオープンされているトランザクションを利用する場合）または「N= 新規のトランザクション」（トランザクションが既にオープンされていても、別のトランザクションを新規にオープンしたい場合）、および「N= なし」のみ設定できます。

リッチクライアントプログラムの設定
リッチクライアントプログラムでは、公開名を設定する必要があります。公開名を指定しない状態で、リッチクライ
アントプログラムを実行させることはできません。
さらに、外部からリッチクライアントプログラムを呼び出す場合は（第 6 章「実行環境」（19 ページ））で詳細を説明します）、プログラムの［外部］カラムをチェック状態に設定する必要があります。

13

インタラクティブなリッチクライアントの開発と実行

Chapter5

実行時の動作実行環境での リ ッ チ ク ラ イ ア ン ト タ ス ク は、 特殊な動作を行い ます。

.N

ET 環境での制約条件のため、リッチクライアントタスクのロジックを作成する前に、実行時の動作に関していくつか考慮する必要があります。

コール処理コマンド
別のリッチクライアントタスクを呼び出す［コール］処理コマンドを作成し、別のリッチクライアントタスクを指定することで、リッチクライアントタスクから別のリッチクライアントタスクを呼び出すことができます。また、呼び出すリッチクライアントタスクにパラメー
タを渡すこともできます。
サブフォームを使用してタスクの内容を表示させたい場合は、［出力先］特性に［サブフォーム］コントロールの名前を指定する必要があります。この内容についての詳細は、第 7 章「異なるプログラムを表示する」（27 ページ）で説明します。
フレームセット内にタスクの画面を表示させたい場合は、［出力先］特性に［フレーム］コントロールの［フレーム名］特性に設定された名前を指定する必要があります。

モーダルウィンドウ
［フォーム特性］で、［ウィンドウタイプ］特性を「M= モーダル」に設定することができます。リッチクライアントタスクが、「モーダル」と設定された別のタスクを呼び出した場合、呼び出されたタスクが終了するまで、起動元のタスクの処理は停止されます。呼び出されたタスクの実行中は、起動元のタスクにフォーカスを移動させることができません。これは通常のオンライ
ンプログラム間での動作に似ています。
リッチクライアントフォームが「M= モーダル」と指定されていない場合は、呼び出されたタスクのウィンドウがオープンされた状態でも、起動元のタスクの動作は中断されず、呼び出されたタスクから起動元のタスクにフォーカスを自由に移動させることができます。
ヒント
メインフォームの［ウィンドウタイプ］特性は、タスクウィンドウの様式を定義します。［コール］処理コマン
ドで呼び出されたタスクの様式を指定したい場合は、様式を設定するパラメータを定義し、［コールプログラ
ム］処理コマンドで設定したい値をパラメータで渡すことにより実現できます。この時、このパラメータの値を使用した式に基づいて呼び出されたプログラムのウィンドウタイプを指定することもできます。この方法によって、起動元のプログラムは、呼び出されたプログラムの動作を制御することができます。

タスクの初期設定［タスク前］（タスクの初期設定フェーズ）は、すべてサーバ側で実行されることを知っておいてください。これは、初期設定
フェーズでリッチクライアントタスクを呼び出す［コール］処理コマンドを定義した場合、以下の規則に基づいて実行されます。

• すべての［コール］処理コマンドは指定された時間で実行されますが、呼び出されたタスクのウィンドウは［タスク前］の終了後にクライアント側でオープンされます。これは、他の処理コマンドが実行された後に、すべての［コール］処理コマンドが実行されるということを意味しています。

14

インタラクティブなリッチクライアントの開発と実行

タスクの終了［タスク後］から呼び出されたリッチクライアントタスクは、呼び出されたタスクがすでに終了しているため表示されません。
呼び出されたリッチクライアントタスクは実行されますが、サーバ側で直ちに終了します。この場合、［タスク前］と［タスク後］がサーバ側で自動的に実行されます。
しかし、呼び出されたタスクが並行実行するように設定されている場合、このような制限はありません。

他のタスクを呼び出す
リッチクライアントタスクからは、どのようなバッチタスクでも呼び出すことができます。
バッチタスクはサーバ側で実行されるタスクで、制限のない通常のバッチタスクとしてすべての機能を持っています。
リッチクライアントタスクは、他のリッチクライアントタスクとバッチタスクを呼び出すことができます。
バッチタスクはサーバ上で実行され、リッチクライアントタスクはクライアントで実行されるためで、バッチタスクはリッチク
ライアントを呼び出すことはできません。
「非インタラクティブタスク」（17 ページ）の説明を参照してください。

同期呼び出しバッチタスクを呼び出す［コール］処理コマンドは常に同期モードで実行されます。これは、バッチタスクが終了するまで、クライアントの処理が待たされることを意味しています。

処理の開始と終了
バッチタスクの開始と終了を指定するオプションメニューは、リッチクライアントタスクから起動された場合はサポートされません。

エラー処理コマンド
クライアント側のメッセージ
アプリケーションの実行中にエンドユーザに対しメッセージを表示させるため、［エラー］処理コマンドを使用することができます。

表示
確認メッセージは、以下の 2 つの方法で表示させることができます。

• B= ボックス …… ダイアログボックスがクライアントに表示されます。このボックスを閉じるまで、タスクの処理は中断されます。

• S= ライン …… クライアントのステータスバーにメッセージが表示されます。
メッセージが表示される間もタスクの処理は継続され、ユーザ側の操作は必要ありません。フォームにステータスバーが定義されていない場合、メッセージは表示されません。しかし、リッチクライアントは SDI メカニズムに似ているため、クライアントのステータスバーは実質的には SDI プログラムのステータスバーになります。従って、確認メッセー
ジをフローティングウィンドウのステータスバーに表示しようとした場合、対応する SDI フレームのステータスバーに表示されます。

タスクの初期設定［エラー］処理コマンドはクライアント側の処理コマンドです。
［タスク前］はサーバ側で実行されるロジックユインタラクティ
ブなリッチクライアントの開発と実行ニットになるため、［エラー］処理コマンドは［タスク前］では定義できません。

タスクの終了［エラー］処理コマンドが［タスク後］に定義された場合、現在のタスクが終了されるため、メッセージが表示されなくなる可能性があります。しかし、［表示タイプ］が「S= ライン」に設定されている場合、メッセージは実行タスクツリー内の SDI プロ
グラムのステータスバーに表示されます。

15

インタラクティブなリッチクライアントの開発と実行

システムイベントハンドラ
リッチクライアントの内部処理
実行中のリッチクライアントのウィンドウは、オンラインタスクと同じようにキーボードコマンドなどの［システム］
イベントに対する処理機能を持っています。

エラー処理
リッチクライアントタスクでの例外
実行中のリッチクライアントタスクで発生したエラーは、Magic xpa の他のタスクと同じような方法で処理することができます。
基本的なエラー処理の詳細については、Magic xpa の『リファレンスヘルプ』の「エラー処理」のトピックを参照してください。

コール処理コマンドとエラー処理
エラーによる［イベント］ロジックユニットは、サーバ側で実行されます。これは、別のリッチクライアントタスクを呼び出す［コール］処理コマンドなどの処理が、エラーによる［イベント］ロジックユニットの終了後に実行されることを意味しています。

Rollback 関数［確認］ダイアログボックスを表示するロールバックオプションは、リッチクライアント上では実行されません。このため、Rollback 関数の最初のパラメータは無視されます。

クライアントのリソースにアクセスする
アプリケーションを実行する場合、アプリケーション内のプログラムが、クライアント側に存在する特定のファイルにアクセスしたり、実行形式のファイルを起動するなどの処理が必要になることがあります。
ここでは、リッチクライアントプログラムがローカル側のリソースにアクセスする方法について説明します。各方法の詳細については、Magic xpa の『リファレンスヘルプ』を参照してください。

実行ファイルの起動
ローカル側にある実行形式ファイルを起動させることができます。
［コール OS コマンド］処理コマンドに、［実行］特性が追加されています。この特性は、OS コマンドをサーバ側で実行させるのか、クライアント側で実行させるのかを指定することができます。ここでは、クライアント側の実行形式ファイルを起動させるため、「C= クライアント」を選択してください。

クライアント側のファイルやフォルダへのアクセス
リッチクライアントタスクでは、クライアント側にアクセスするための専用の関数を使用することができます。
関数には、以下のものがあります。

• ClientBlb2File• ClientFile2Blb• ClientFileCopy• ClientFileDelete• ClientFileInfo• ClientFileListGet• ClientFileOpenDlg• ClientFileSaveDlg• ClientFileRename• ClientDirDlg
16

インタラクティブなリッチクライアントの開発と実行

ローカルマシンの環境変数の取得
クライアントマシンの一時ディレクトリのような環境情報を取得する必要があるかもしれません。以下の関数を使用すること
で、このようなことが可能になります。

• ClientOSEnvGet

アプリケーションの起動時に環境変数を取得する
アプリケーションの起動時に環境変数を取得する場合は、HTML ファイル内の envvars パラメータに環境変数を指定することで可能になります。この設定は、リッチクライアントインタフェースビルダを使用する際に指定することができます。
これらの環境変数はサーバに送られ、リッチクライアントモジュールがクライアント側で読み込まれる前に取得することができます（ClientOSEnvGet 関数とは対照的です）。この方法を使用することで、GetParam 関数で環境変数を取得し、それに応じた初期設定処理を行うことができます。

非インタラクティブタスク
以前に説明したように、バッチタスクはサーバ上で実行されるため、リッチクライアントタスクを呼び出すことはできません。
しかし、（インタラクティブなタスクを呼び出すという目的で）時々クライアント側でバッチ処理を実行させたいという必要性が発生します。これは、［タスク特性］内の［インタラクティブ］特性という新しく追加された特性のチェックを外すことで実現できます。
非インタラクティブなリッチクライアントタスクは、ユーザの入力処理を待たずに自動的にレコードを処理し、メインソースのすべてのレコード処理を終了するか、［タスク終了］特性の条件を満たした場合にタスクが終了されるという点を除いて、インタラクティブなリッチクライアントタスクと同じように動作します。

メニューとツールバー
MDI 環境がない場合、唯一のメニューは SDI フレームに表示されるものになります。どのメニューを表示するか、
またはツールバーを表示するかどうかなどは、リッチクライアントフォームの［フォーム特性］の［SDI］セクションで定義することができます。
［フォームタイプ］が「SDI」の場合のみ、これらの特性が有効になります。
リッチクライアント環境において、最初に起動されたタスクは定義されたメニューを表示します。従って、SDI プログラムでは
プルダウンメニューを定義し、それをプログラムに割り当てる必要があります。

ステータスバー
MDI 環境がない場合、基本的にはステータスバーは表示されません。これは、ステータスバーに送られたメッセージが表示されないことを意味しています。これはアプリケーションの要求仕様をもとに必要に応じて修正してください。ステータスバーを表示するかしないかは、リッチクライアントフォームの［フォーム特性］の［SDI］セクションにある［ステータスバー表示］特性で定義することができます。
注意
SDI ウィンドウのステータスバーは、MDI フレームのステータスバーと同じ機能を持っていません。SDI ウィ
ンドウ内で自動ヘルプやエラーメッセージを表示する場合だけに使用されます。

ユーザ認証
ユーザ認証は、オンライン環境での認証方法と同じように行うことができます。
HTML を起動する際に、（バックグラウンドモードで起動された）Magic 実行エンジンは、Magic.ini の設定をもとにユーザ認証する必要があるかどうかを確認します。
［ログオン］ダイアログが必要であれば（［MAGIC_ENV］セクションで「InputPassword=Y」が設定された場合）、実行エンジンは Magic xpa の［ログオン］ダイアログを表示します。ここで入力されたユーザ ID やパスワードは、Magic xpa のセキュリティファイルをもとにチェックされます。
［ログオン］ダイアログで［キャンセル］ボタンをクリックしてもアプリケーションは実行されます。
［ログオン］ダイアログから入力されたユーザ ID は User() 関数で取得できるため、［キャンセル］ボタンをクリックされた場合は、User 関数を使用して（空白が返ります）チェックすることができます。
例えば、［キャンセル］ボタンをクリックされた場合は、Guest ユーザとして扱ったり、アプリケーションを即終了させたりする
ようにアプリケーション側でチェック処理を組み込むことで柔軟に対応できます。
また、あらかじめプログラムに実行権を設定しておくことで、実行させるプログラムを制限することができます。

17

インタラクティブなリッチクライアントの開発と実行

LDAP を使用した認証方式を利用することもできます。LDAP 認証を使用するための設定方法は、『リファレンスヘルプ』を参照してください。
注意
Active Directry 認証は使用できません。

18

インタラクティブなリッチクライアントの開発と実行

Chapter6

実行環境
リ ッ チ ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 ど の よ う に起動 さ れ、 実行時にど の よ う に表示 さ れる ので し ょ う か？

前の章では、開発上の概念と動作環境について説明しました。そして、実行時のルック＆フィールに関する一般的な項目、
特に、実行環境を設定するために必要な様々な特性についていくつか説明しました。
この章では、実行環境とリッチクライアントの環境をどのように設定するかについて説明します。

リッチクライアントアプリケーションを実行させる場合、外部に公開する必要のあるアプリケーションの要素があると同時に、公開したくない要素もあります。従って、Magic リッチクライアントアプリケーションに対して安全な環境を構築する上で、ア
プリケーションの要素は 2 に分類することができます。

• 内部向けのリソースファイル……これらは、ECF、基本色定義、フォント定義、ユーザ定義、などの Magic エンジンがアクセスするためだけに必要なローカルファイルです。内部ファイルは、Web サーバによってアクセス可能にしないで、プロジェクトフォルダ内のような ECF が置かれているフォルダ付近に配置してください。

• 外部向けのリソースファイル……これらは、HTML やマニフェスト、イメージ、および PDF などのクライアント側でアクセスする必要があるファイルです。外部ファイルは、Web サーバを経由してアクセススすることが可能であり、Web
サーバのエイリアスを使用して公開されます。

実行の準備
リッチクライアントの実行モジュールが .NET Framework の環境で実行できるように、リッチクライアントアプリ
ケーションをデプロイする必要があります。
リッチクライアントの実行環境は、インターネット環境で実行されることを意図しているため、使用されている
テクノロジを理解しておくことを推奨します。

リッチクライアントモジュール
すべてのタスク情報とデータは、.NET モジュールを使用して処理され実行されます。このモジュールは、実際のクライアント
エンジンとして実行されます。

リッチクライアントフォルダ• Magic xpa のインストール処理によって、インストールフォルダ内に以下の 4 つのサブフォルダを作成します。
• Scripts …… インターネットリクエスタファイルが格納されます。
• RIACache …… タスクやイメージ、メニューのためにキャッシュデータを格納します。
• RIAModules …… リッチクライアントタスクを実行するために必要なファイルやメッセージ表示用データを格納しています。

• PublishedApplications …… HTML やマニフェストのような公開する必要のあるファイルの格納先です。
これらのフォルダは、インストールディレクトリ内に作成されます。これらは、次のセクションで説明する Web エイリアスで管理されます。

19

インタラクティブなリッチクライアントの開発と実行

Web エイリアス
Web エイリアスは、リッチクライアントアプリケーションを実行するために必要です。

• Magic22Scripts …… Scripts ディレクトリを参照しています。
• Magic22RIAApplications …… PublishedApplications ディレクトリ を参照しています。
これらの設定内容は、アプリケーションの内容に応じて変更することもできます。

動作環境設定リッチクライアントキャッシュの位置は、必要に応じて変更することができます。この設定は、Magic xpa の［動作環境］ダイ
アログの［アプリケーションサーバ］タブで行うことができます。

• リッチクライアントキャッシュパス …… アプリケーションサーバがリッチクライアントのキャッシュファイルを書き込む物理ディレクトリ（デフォルト：< インストールディレクトリ >\RIACache）を指定します。

Magic xpa の実行モード
Magic xpa のリッチクライアントアプリケーションを正しく実行させるには、［実行モード］（動作環境 \ システムタブ）を「バッ
クグラウンド」に設定する必要があります。Magic xpa Studio からアプリケーションをデバッグする場合は、オンラインモードで実行させます。
ノート
オンラインモードで起動した場合、リッチクライアントアプリケーションは 1 ユーザでしか実行させることができません。

初期プログラム
外部からプログラムを呼び出す場合は、このプログラムの［外部］カラムをチェックさせる必要があります。
このプログラムのフォームは SDI として定義することを推奨します。
このプログラムが起動されると、新しいコンテキストが自動的にオープンされ、その後のすべてのプログラムはそのタスクツ
リー内で実行されます。

Windows での実行
必要条件
RIA アプリケーションは、クライアントに以下のソフトウエアがインストールされることを必要条件とします。

• .NET Framework• MsHtml.dll
これらのインストールパッケージは、Magic xpa の RIAModules フォルダ内にコピーされており、これを使用して手動でインストールすることができます。
リッチクライアントインタフェースビルダによって作成された HTML ファイルは、これらのインストール処理を簡単に行うことができるように、ガイダンスを表示しています。これについては、後で説明します。
.NET Framework は、Windows Vista SP1 以上の OS ではすでにインストールされています。従って、改めてインストールする必
要はありません。

ClickOnce
ClickOnce は Microsoft 社によって開発されたテクノロジーで、Web から直接 .Net アプリケーションを実行させることができます。このテクノロジーによって、クライアントアプリケーションをインターネットからだけだけでなくデスクトップ環境からも実行されることが可能になります。
ClickOnce を使用する利点の一つは、（.NET Framework や MsHtmlSetup などの必要条件を除き）管理者権限を必要としないでア
プリケーションをインストールしたり、アップグレードできる方法が提供できることです。
注意20

インタラクティブなリッチクライアントの開発と実行

Web サーバに、.NET のインストール処理が組み込まれていない場合、MIME タイプ拡張を定義する必要があります。
以下の操作で定義できます。
1. IIS を開きます。
2. Web サイトのプロパティを開きます。
3.［HTTP ヘッダー］タブをクリックします。
4.［MIME マップ］グループ上の［ファイルの種類］ボタンをクリックします。
5. ウィンドウが開いたら、［追加］ボタンをクリックします。
6. 以下の値を設定します。
拡張子

コンテンツの種類.manifest

application/x-ms-manifest.application

application/x-ms-application.NET マニフェストファイル
アプリケーションを実行するためのフレームワークが得られたら、アプリケーションをどのように実行するかを定義する必要があります。つまり、Magic アプリケーションをどのように認識し、実行させるかを Click Once に教える必要があります。これについては、.NET のマニフェストファイルで経由で実現できます。ここには、Click Once の起動メカニズムをどのように組み込
むかを定義する記述が含まれています。

Magic xpa のリッチクライアントインタフェースビルダ
Magic xpa では、「リッチクライアントインタフェースビルダ」と呼ばれる、簡単に .NET マニフェストファイルを定義することができるユーティリティを提供しています。これは、プロジェクトを開いている状態でプルダウンメ
ニューから［オプション / インタフェース ビルダー/ リッチクライアント］
を選択することで起動することができます。
このユーティリティは、必要な手順をウィザード形式で示しながら HTML とマニフェストファイルを作成していくものです。このウィザードでは、Click Once で起動されるリッチクライアントモジュールの名前を指定します。1 つの Magic アプ
リケーションに対して複数のリッチクライアントモジュールとマニフェストファイルを定義することもできます。
ユーティリティ内で、リッチクライアントモジュールが読み込まれた場合、最初に起動するプログラムを指定します。起動されるプログラムは、［公開名］カラムと［外部］カラムが設定されていなければなりません。
リッチクライアントインタフェースビルダは、２つの外部ファイルを作成します。

• HTML ファイル …… クライアントでの Click Once の有効性をチェックし、必要であればインストールします。ここには、起動プログラムなどのいくつかのアプリケーション実行環境などの XML 定義が含まれています。

• マニフェストファイル …… サーバパスなどのアプリケーション環境が含まれています。
ノート
マニフェストファイルと HTML ファイルは、常に Web サーバ上の同じフォルダに配置してください。
Magic エンジンをアップデートした場合、マニフェストファイルを必ず再作成してください。

マニフェストファイルの保護.NET のマニフェストファイルを実行させるためには、証明書を使用して署名する必要があります。これはリッチクライアント
インタフェースビルダを使用する際に、証明書とそのパスワードを指定することで可能になります。
ノート
Magic xpa のインストール時に提供されたテスト用の証明書（test.pfx）は、発行元が確認できないため運用環境
では使用しないことを推奨します。通常は、発行元が確認できるような特定機関の証明書を使用してください。

マニフェストファイルの変更
インタフェースビルダで作成されたマニフェストファイルは署名されているため、テキストエディタで変更すると使用できなくなります。通常は、運用環境を元にマニフェストファイルを作成して配布することを推奨します。マニフェストファイルの作成
後にファイルを修正する場合は、修正後にマニフェストファイルを手動で署名し直す必要があります。

21

インタラクティブなリッチクライアントの開発と実行

マニフェストファイルを署名するには、Microsoft 社が提供しているツールユーティリティ（Mage.exe または、MageUI.exe）を使用します。これは、.NET Framework の SDK に同梱されているツールで、Microsoft 社のサイトからダウンロードすることができます。Mage.exe は、Magic xpa Studio のインストールフォルダにもコピーされています。
マニフェストファイルの変更は、以下の手順で行います。
1. テキストエディタでマニフェストファイルを修正します。以下の行以外は、修正しないでください。

• <deploymentProvider codebase="http://xxxxxx" />• <dependentAssembly dependencyType="install" codebase="http://xxxx">
2. 以下のコマンドを実行し、マニフェストファイルを署名します。
mage -Sign xxx.application -Certfile text.pfx -Password test

• xxx.application ……マニフェストファイル名• text.pfx ……Magic xpa が提供している証明書ファイル。Magic xpa Studio のインストールフォルダ内の Buiders\RC にコピーされています。特定機関によって発行された証明書がある場合は、そのファイルを指定してください。

• test ……証明書でマニフェストに署名する場合に使用するパスワード。Magic xpa が提供している証明書ファイルを使用する場合は、「test」と指定してください。特定機関によって発行された証明書を使用する場合は、その証明書用のパスワードを指定してください。
ノート• html ファイルは、署名する必要がありません。
• ツールの詳細説明は、Microsoft 社の以下のサイトを参照してください。
http://msdn.microsoft.com/ja-jp/library/acz3y3te%28VS.80%29.aspx

アプリケーションの実行
アプリケーションをデプロイすると、URL を指定して HTML ファイルを開くことでアクセスできます。URL を指定してアプリ
ケーションをインストールする処理は、PC 上で最初にアプリケーションを実行する場合のみ必要です。最初にアプリケーショ
ンを起動する際に、ClickOnce はスタートメニューにアプリケーション起動用のショートカットを作成します。次回アプリケー
ションを起動する場合は、このショートカットをクリックするだけになります。従って、ClickOnce をスタートするために初期起動時のみ Web ブラウザを利用します。

既知の Web ブラウザの問題• Google Chrome …… このブラウザを使用した場合、ダウンロードエリアにマニフェストファイルをダウンロードするだ
けで、実行させることはできません。

• Fire Fox …… このブラウザは、ClickOnce アプリケーションを実行するためのアドオンが提供されています（https://addons.mozilla.org/en-US/firefox/addon/1608）。

他の既知の問題
ClickOnce は、統合プロキシ認証のみサポートしています。基本認証、フォーム認証等はサポートしません。

アプリケーションにパラメータを渡す
起動時の URL を使用してリッチクライアントにパラメータを渡すことができます。このパラメータの値は、GetParam 関数を使用することでアプリケーション側で取得することができます。
例えば、リッチクライアントアプリケーションを以下の URL で起動した場合を想定します。
http://server/uniprojects/project/project.application?N1=v1&N2=v2

v1 の値は GetParam('N1') で、v2 の値は GetParam('N2') で取得できます。指定できる値は文字データのみで、UTF-8 でエンコードされます。このため日本語を渡す場合は、アプリケーション側で UTF8toAnsi 関数を使用して変換する必要があります。

モバイルでの実行
必要条件
RIA アプリケーションは、モバイル端末に以下のソフトウエアがインストールされることが必要です。

22

インタラクティブなリッチクライアントの開発と実行• .NET Compact Framework• Smart Device Framework
これらのインストールパッケージは、Magic xpa の RIAModules\Mobile フォルダ内にコピーされています。これらをモバイル端末にコピーし、実行することでインストールすることができます。リッチクライアントインタフェースビルダによって作成された HTML ファイルは、これらのインストール処理を簡単に行うことができるように、ガイダンスを表示しています。これについては、後で説明します。

Magic xpa のリッチクライアントインタフェースビルダ
Magic xpa では、「リッチクライアントインタフェースビルダ」と呼ばれる、簡単に .NET マニフェストファイルを定義することができるユーティリティを提供しています。これは、プロジェクトを開いている状態でプルダウンメ
ニューから［オプション / インタフェース ビルダー/ リッチクライアント］を選択することで起動することができます。
このユーティリティは、必要な手順をウィザード形式で示しながら HTML とマニフェストファイルを作成していくものです。このウィザード内で、モバイル端末からアプリケーションを実行する際に起動されるリッチクライアントモジュールの
名前を定義します。1 つの Magic アプリケーションで複数のリッチクライアントモジュールやインストールファイルを作成することができます。
ユーティリティ内で、リッチクライアントモジュールが読み込まれた場合、最初に起動するプログラムを指定します。起動されるプログラムは、［公開名］カラムと［外部］カラムが設定されていなければなりません。
リッチクライアントインタフェースビルダは、２つの外部ファイルを作成します。

• HTML ファイル……インストールパッケージと必要条件のインストールモジュールに対するリンクが含まれています。
• インストールパッケージファイル……RIA モジュールとアプリケーション接続詳細をインストールします。
ノート
Magic エンジンをアップデートした場合、マニフェストファイルを必ず再作成してください。

インストールパッケージファイルの保護
アプリケーションのインストールパッケージは、証明書によって署名されます。これはリッチクライアントインタフェースビル
ダを使用する際に、証明書とそのパスワードを指定することによって行われます。
ノート
Magic xpa のインストール時に提供されたテスト用の証明書（test.pfx）は、発行元が確認できないため運用環境
では使用しないことを推奨します。通常は、発行元が確認できるような特定機関の証明書を使用してください。

アプリケーションのインストールと実行
リッチクライアントインタフェースビルダは、CAB ファイルを作成します。これはモバイル端末でアプリケーションを実行する際に使用します。アプリケーションを実行する前に、モバイル端末でこのファイルを実行する必要があります。インストール
は、Windows\ スタートメニュー \ プログラムフォルダ内でアプリケーションのショートカットを作成します。このショートカッ
トを使用してアプリケーションを起動させることができます。
リッチクライアントインタフェースビルダが、必要な動作環境とインストールファイルに対するリンクを含む HTML ファイルを作成します。従って、モバイル端末からこのページを参照するだけで、必要なものをすべてインストールすることができます。

XML データの暗号化
リッチクライアントアプリケーションでは、クライアント PC とサーバ間は XML データでやり取りします。このデータはデフォ
ルトでは平文で処理されるため、機密上の問題が発生する場合があります。XML データを暗号化させるには、MAGIC.INI の［MAGIC_SPECIALS］セクションに以下のパラメータを設定してください。
［MAGIC_SPECIALS］
SecureBrowserClient=Y

実運用環境への移行
リッチクライアントビルダでマニフェストファイルを作成後、（エンドユーザなどの）運用環境にシステム関連のファイルを配置することになります。その際、開発環境とはシステム環境が異なる場合があります。ここでは、これらについての配置方法について説明します。

23

インタラクティブなリッチクライアントの開発と実行

運用環境の構築は以下の手順で行います。
1. uniPaaS RichClient Server をインストールします。その際、リッチクライアント実行モジュールもインストールされます。
2. アプリケーションファイルやデータファイルなどをコピーします。
3. 必要に応じてアプリケーションが正しく動作するための環境設定を行います。
注意
uniPaaS Enterprise Server では、リッチクライアント実行モジュールをインストールすることはできません。また
このライセンス（MGENT1P1）だけでは、リッチクライアントは動作しません。専用のライセンス（MGRIA1P1）が別途必要です。
4. 開発環境で Magic xpa Studio を起動し、リッチクライアントインタフェースビルダで運用環境に対応するサーバ名やエ
イリアス名を指定し、HTML やマニフェストファイルを作成します。アプリケーションサーバと公開サーバが異なる場
合は、ここで個別のサーバ名を指定することができます。
5. PublishedApllications フォルダにアプリケーション用の HTML ファイルやマニフェストファイル、イメージファイルのような URL を指定して表示させる必要のあるファイルをコピーします。
6. MRB の起動時に Magic エンジンが自動的に起動され、アプリケーションもロードされるように Mgrb.ini を修正します。
これで、クライアントから HTML ファイルにアクセスすることでアプリケーションが実行されます。

実行ユーザ数の制限
リッチクライアントアプリケーションが実行できるユーザ数は、提供されるユーザ数によって決まります。また、このユーザ数を上限として実際に実行できるユーザ数を制限することもできます。
［最大並行ユーザ数］（オプション / 設定 / 動作環境 / アプリケーションサーバ）にユーザ数を設定した場合、Magic エンジンがバックグラウンドで実行している状態では、指定されたユーザ（クライアント）数まで同時にアプリケーションを実行させることができます。これによって、アプリケーション毎に実行できるユーザ数を制限させることができます。
この設定が「0」の場合や、ライセンス数を超えた値を設定した場合は、ライセンス数まで起動できます。また、Magic エンジ
ンがオンラインで起動している場合は、1 ユーザでしか実行させることはできません。

運用環境の更新
アプリケーションの運用環境が変更された場合、内容に応じて以下のような変更作業を行ってください。

アプリケーション（ECF ファイル）のみの置き換える場合
アプリケーションファイルの更新以外、変更作業は必要ありません。

起動時のアプリケーション名やプログラム名が変更された場合起動用の HTML ファイル（xxxx.publish.html）の以下の赤字の部分を変更します。
<body onload="initialize()"><xml id="rcExecProps"><properties><property key="protocol" val="http"/><property key="server" val="ServerName"/><property key="requester" val="/uniScripts/MGrqispi.dll"/><property key="appname" val="DNSample"/><property key="prgname" val="entry"/><property key="arguments" val=""/>

アプリケーションサーバのホスト名 /URL が変更された場合
1. 起動用の HTML ファイル（xxxx.publish.html）とマニフェストファイル（xxxxx.application）の両方を変更します。
2. マニフェストファイルを証明書で署名します。署名の方法は、「マニフェストファイルの変更」（ページ 21）を参照してください。

Magic xpa をバージョンアップした場合同一バージョンの Magic xpa Studio でマニフェストファイルを作成し直し、運用環境にコピーしてください。

24

インタラクティブなリッチクライアントの開発と実行起動用の HTML ファイルをカスタマイズする場合
起動用の HTML ファイル（xxxx.publish.html）をユーザ向けにカスタマイズする場合、以下の点を注意してください。

• ヘッダセクション（<head> ～ </head>）の Script 定義を削除しないでください。ここでは、実行環境のチェックやアプ
リケーションのインストール処理に必要な関数が記述されています。

• ボディセクション（<body> ～ </body>）の <xml id="rcExecProps"> のタグ内も削除しないでください。ここでは、アプ
リケーションを実行する場合のパラメータを定義しています。起動させるアプリケーションに応じた変更は可能です。

• 上記の記述を除き、任意に変更することができます。その際、JapaScript に定義された関数を呼び出すことで以下の処理を実行させることができます。

• launchApplication() …… マニフェストを開き、アプリケーションのインストール処理を行います。
• installMsHtmlSetup() ……MsHtml コンポーネントのインストール処理を実行します。
• installDotNet()…….NET Framework のインストール処理を実行します。

モバイル用の起動環境を変更する場合
モバイル端末にアプリケーションをインストールする際に使用するファイルの内、HTML ファイル（xxxx.Mobile.html）は、修正できますが、パッケージファイル（xxxx.CAB）は、圧縮されさらに署名されているため、Magic xpa Studio のリッチクライア
ントインタフェースビルダで作成し直すようにしてください。

25

インタラクティブなリッチクライアントの開発と実行

Chapter7

MDI 動作環境のシミュレート
リ ッ チ ク ラ イ ア ン ト は SDI ですが、 どの よ う に し た ら MDI と し て動作 し ますか？の章では、SDI のパラダイムに基づくリッチクライアントの概念について説明しました。このパラダイムでは、プログ
ラムは 2 番目のプログラムを呼び出し、この新しいプログラムはデスクトップ上のフレームワーク内であればどこでも起動させることができます。基本的には、これらの 2 つのプログラムの間は接続されていないように見えますが、プログラムは他の実行ツリーの一部として実行されます。

前

MDI 環境とはどのようなものでしょうか？
MDI 環境には、プルダウンメニューやステータスバーなどを定義します。プログラムを呼び出すと、作成されたプ
ログラムは一定のフレーム内で動作します。
プログラムがメニューから起動されると、今まで実行していたプログラムが終了し、起動されたプログラムが表示されます。
リッチクライアントのテクノロジを使用して、「MDI ライクな」環境を作ることができます。

なぜ、MDI フレームワークを使用するのでしょうか？
MDI のルック＆フィールを実現する理由として以下のようなことが考えられます。

• ウィンドウ表示数を削減することができます。実行するタスクの表示を 1 つのウィンドウに納めることで、デスクトッ
プ上の何処で実行されるかの制御を行う必要がないため、扱いが簡単になります。

• SDI の場合、1 つのプログラムにフォーカスがある状態でも、実行中のすべてのタスクが同時に表示されます。このため、例えば、リッチクライアントプログラムの実行中に電子メールを受信した場合、受信データを表示させるために各タスクの制御をフォーカスのあるタスクに戻す必要性が発生します。

• メニューやツールバー、およびステータスバーが全て表示され、アクセス可能になります。
• ユーザが既に MDI 環境を使用している場合、新しい（SDI）環境についての説明を行う必要がなくなります。

MDI フレームワークの作成
動作環境を作成する場合、メニューやツールバー、ステータスバーなどの通常のルック＆フィールを設定する必要があります。これらのオプションについては、このドキュメントの各所で説明しています。
これらはすべて、リッチクライアントフォームの［フォーム特性］の［SDI］セクション内にある特性で定義します。
フレームが定義されているのであれば、プログラムのロジックを対応させる必要があります。プログラムで「MDIライクな」ロジックを定義します。
MDI のロジックは、第 4 章「サブフォーム」（10 ページ）で説明したサブフォームを使用することで実装することができます。

サブフォームを使用する
サブフォームを使用することで、別のプログラムを表示するためのフレームを作成することができます。これについては、第 4章「サブフォーム」（10 ページ）で説明しています。
26

インタラクティブなリッチクライアントの開発と実行［サブフォーム］コントロールで表示されるプログラムを変更するだけで MDI 用として利用することができます。

異なるプログラムを表示する
これを実施するための最初のステップは、［サブフォーム］コントロールに［コントロール名］を設定することです。他のすべてのコントロールと同じように、サブフォームにも名前を設定することが可能で、今回の場合には必須事項となります。1 つのフォーム上に複数のサブフォームを定義することが可能なため、コントロール一覧から［サブフォーム］コントロールを参照す
る場合、選択しやすいように各サブフォームにわかりやすいコントロール名を定義することを推奨します。
次のステップは、［コールプログラム］処理コマンドを修正することです。以前に説明したように、プログラムが Magic xpa Studioによってリッチクライアントプログラムとして認識されると、［コールプログラム］処理コマンドに［出力先］特性という新しい特性が有効になります。ここには、新しいプログラムが表示される場所として［サブフォーム］コントロールのコントロール
名を指定します。

実行時のサブフォーム
サブフォーム内でプログラムが実行されている時に、［コール］処理コマンドが実行され別のプログラムが起動されると、サブ
フォーム上の現在実行中のプログラムが置き換わります。この場合、現在［サブフォーム］コントロールに表示されているプロ
グラムは終了します。新しいプログラムは、サブフォームの規制の範囲内で初期設定され、表示されます。

位置に関する考慮事項
一般に、フォームはさまざまなサイズで表示されます。1 つの［サブフォーム］コントロールで実行している場合、全てのフォー
ムは、指定されたサイズの指定されたコントロールでの制約条件に対応させる必要があります。

• プログラムが表示されると、プログラム自身をそのコントロールの制約条件に対応させる必要があります。従って、定義されたフォームが小さい場合、フォームが［サブフォーム］コントロールに対応するようにサイズを大きくすることが期待され、フォームが大きい場合、対応してサイズを小さくするように求められます。

• 親フォームのサイズが大きくなると、［サブフォーム］コントロールのサイズもそれに応じて大きくなることが求められます。
［サブフォーム］コントロールのサイズが大きくなると、コントロール内で表示されるデータもがそれに応じて大きくなることが求められます。
結果として、フォームとテーブルを設計する場合、［位置］特性を考慮する必要があります。

終了ボタンをシミュレートする
オンラインプログラムでは、現在のプログラムを終了させる［閉じる］ボタンを表示させる場合があります。このような［終了］ボタン（［閉じる］や［完了］と表示する場合もあります）は、一般的に［終了］イベントを発行させるようにします。
しかし、サブフォームでこのイベントを発行させると、第 4 章「サブフォーム」（10 ページ）で説明したように親のプログラム
も一緒に終了することになります。従って、ロジックを工夫する必要があります。
以下ような方法を推奨します。
1. サブフォームに表示させるプログラムを作成します。このプログラムはどのような種類のオンラインプログラムでもかまいません。例えば簡単なテキスト表示させたり、通常のプログラムとして動作するものであれば任意に作成したものが利用できます。
2. メインプログラム内に「サブフォームの消去」という名前のユーザ定義のイベントを作成します。
3. 親プログラム内で、この新しいイベント（「サブフォームの消去」）に対するロジックユニットを作成します。このロジックユニット内で、［コールプログラム］処理コマンドを使用してデフォルトプログラムを呼び出します。［出力先］
特性には、定義したサブフォームのコントロール名を指定します。
4. 子タスクの中で、［終了］イベントに対する［伝播］特性を「No」に設定します。このロジックユニット内で、作成したユーザイベント（「サブフォームの消去」）を発行するようにします。
上記のプログラムを実行すると、現在のプログラムが終了し、デフォルトプログラムが表示されます。
ヒント作成された「MDI ライク」な環境を実行すると、メインタスクのウィンドウ内には何も表示されず、メニューとステータスバーのみが表示された状態になります。
このような環境をシミュレートするには、親タスクをダミータスクとして作成します。このダミータスクには、
1 つの文字型の変数項目を定義します。このタスクのフォームには、［サブフォーム］コントロール以外は、タスクに定義された 1 項目のみを表示させます。また、コントロールの寸法を全て「0」に設定します。

27

インタラクティブなリッチクライアントの開発と実行

トランザクション
第 3 章「トランザクション」（8 ページ）では、遅延トランザクションがリッチクライアントプログラムで使用されるトランザ
クションであることについて説明しました。
「MDI ライク」なプログラムでは、親タスクはマネージャとして動作します。このマネージャは継続的に実行され、必要に応じて［サブフォーム］コントロール内に別のタスクを呼び出すようになっています。起動されたタスクは、サブフォーム内で実行され、別のタスクが起動されると自動的に現在のタスクは終了されます。
親タスクがトランザクションをオープンした場合、サブフォーム内で起動されるすべてのタスクはこのトランザクション内で実行されます。サブプログラムが終了した場合、親のトランザクションがまだオープンされている状態のため、子プログラムのト
ランザクションはコミットされません。
このような場合、コミットさせる必要のあるラージトランザクションを作成します。この動作を考慮する必要があります。
マネージャ機能を持つ親タスクでは、トランザクションを使用しないように定義することを推奨します。このような場合、サブフォームで起動された各プログラムは、タスクの起動時にオープンされ、終了時にコミットされられる個別のトランザクションを持つことになります。
しかし、親タスクがトランザクションをオープンする必要があり、さらにサブフォーム内で実行するタスクが個別のトランザク
ションを持つ必要がある場合は、そのタスクは新しい遅延トランザクションを定義する必要があります。このような場合は、［タ
スク特性］の［トランザクションモード］特性を「N= 新規の遅延トランザクション」に設定してください。
ヒント
このような動作は、フレーム内でプログラムを実行させる場合も同じです。
タスクにフレーム形式フォームのみ定義されている場合、異なるフレーム内で実行されるプログラムが同じトランザクション内にある必要はないため、トランザクションを使用しないように設定してください。
親タスクが、トランザクションをオープンする必要があり、フレーム内で実行されるタスクが、個別のトランザクションを持つ必要がある場合は、新しい遅延トランザクションをオープンするように定義してください。

メニュー
今まで説明してきたように、MDI 環境をシミュレートするには、［コール］処理コマンドの一部の特性を使用します。
［メニュー］
リポジトリで［メニュータイプ］が「P= プログラム」に定義された場合は、このオプションがありません。
メニューから MDI 環境でプログラムを実行させるには、［メニュータイプ］を「V= イベント」に設定し、ユーザ定義のイベントを設定するようにします。これらのイベントは、メニューを表示する親プログラムで処理させるようにします。親プログラム
内のロジックユニット内で、表示させる［サブフォーム］コントロールを指定した［コール］処理コマンドを定義します。

28

インタラクティブなリッチクライアントの開発と実行

Chapter8

ブラウザコントロール
新 し いパ ラ ダ イ ムは独自の世界に存在する わけではあ り ません。 それは、 他のアプ リ ケーシ ョ
ン と 接続する必要があ り ます。 ど の よ う に し て接続 し ますか？

理

想的な世界では、外の世界にアクセスすることなく自己完結型のアプリケーションとして開発することができます。独
自の知識と経験を利用することで、さまざまな限界を克服することになります。
しかし、現実の世界はこれとは異なり、今日のアプリケーションは外部リソースへのアクセスが必要になります。

なぜ、他のアプリケーションにアクセスする必要があるのでしょうか？
最近のアプリケーションは相互接続が要求されます。これは、文書の PDF を作成し Acrobat Reader で表示させるよ
うにしたり、Excel ワークシートのデータを表示させるなどといった、より複雑なものになるかもしれません。
しかし、分散環境においては、クライアント側が表示を主目的とし、サーバ側でディスクへのアクセスを行うように処理を分けることができます。これにより、何処でどのようなものを作成する必要があるのかを決める必要性が発生します。

ブラウザコントロール［ブラウザ］コントロールは、他のアプリケーションとの相互接続を可能にするリッチクライアントタスク専用の新しいコントロールです。
［ブラウザ］コントロールは Internet Explorer の処理をシミュレートし、ブラウザの ActiveX コントロールが使用されたかのように動作します。このコントロールをフォームに配置すると、ブラウザが埋め込まれ、必要に応じたコントロールを使用することができます。
ブラウザが埋め込まれると、http://www.magicsoftware.com などのインターネットページを表示するためにこのブラウザを使用することができます。
インターネットブラウザは、次のような様々なタイプのファイルを表示させることができます。

• Word 文書• Excel シート• PDF ファイル
• 映画や音楽などのマルチメディアファイル• その他色々
この機能を任意の目的で使用することができます。例えば、Excel シートを表示させるために［ブラウザ］コントロールを使用することができます。
注意
ファイルを表示させるためには、クライアント側にそのファイルを表示させるためのアプリケーションがインストールされている必要があります。

29

インタラクティブなリッチクライアントの開発と実行

ブラウザコントロール特性
コントロールは通常のコントロールとして動作しますが、いくつかの特性を定義しておく必要があります。

• データ …… ［ブラウザ］コントロールに表示させる URL を指定します。埋め込まれたブラウザは、その URL にアクセスします。Internet Explorer は、ローカルなファイルシステム上のファイルにアクセスすることができますが、ローカル
ファイルに対してディレクトリパスではなく URL 指定でアクセスすることを推奨します。この場合、C:\temp\Excel.xlsなどのようにして Excel ファイルを表示する代わりに、http://server/tempDir/Excel.xls という指定で同じファイルにアクセスすることができます。

• コントロール名 …… ブラウザにアクセスする必要がある場合は、コントロール名を指定することを推奨します。
• 位置 …… 実行時にフォームのサイズが変更された場合に、コントロールのサイズも一緒に変更するように指定することができます。

ブラウザコントロールイベント［ブラウザ］コントロールは、「ブラウザステータス

テキスト変更」という内部イベントを発行させることができます。

［ブラウザ］コントロールによって表示されているアプリケーションのステータスバー内のテキストが変更されると、コントロー
ルはこのイベントを発行します。このイベントは、Magic xpa 内で処理することができます。
このイベントに対するハンドラは 1 つのパラメータ（ステータスバーの現在のテキスト）を受け取ることができます。
ステータスバーがインターネットブラウザのステータスバーであることに注意してください。表示されるかされないかはブラウザ側に依存します。
ノート［ブラウザステータス テキスト変更］イベントによって、リッチクライアントモジュールはブラウザから情報を受け取ることができます。
JavaScript を使用してステータスバーの値を変更することができ、それを行うことで、ブラウザ側で表示する
データをリッチクライアントに返すことでができます。

ブラウザコントロール関数
リッチクライアントでは、コントロールに表示させる内容を制御するための関数を使用することができます。

• BrowserSetContent …… コントロールに表示させる内容を設定することができます。この関数は、パラメータで指定された値を使用してコントロールを更新するもので、URL によって参照する内容をもとにコントロールを更新する方法とは異なります。

• BrowserGetContent …… コントロールに表示されている内容を取得します。この関数は、BrowserSetContent 関数とともに使用され、内容を取得し、テキストを処理し、コントロールに戻すことができます。

• BrowserScriptExecute …… ［ブラウザ］コントロールに表示されるファイルに定義されている VB Script や JavaScript の関数を実行します。

帳票の作成と表示 - ブラウザコントロールの実装
今まで、［ブラウザ］コントロールの背景となる概念に関して説明してきました。これを応用してみましょう。
アプリケーションを実行させる際に、帳票の提供が要求される場合があります。帳票によっては、単にデータを表示させるだけの簡単なものがあります。また、（例えば、地域毎に分類された前四半期の利益と損失などの）データ操作が必要な複雑な帳票もあります。
リッチクライアントが表示用のメカニズムであり、サーバ側はデータ抽出用のメカニズムを実行するものであることを理解しておく必要があります。プリンタは常にサーバ側に接続されています。
クライアント側で帳票を表示させるためのソシューションは、［ブラウザ］コントロールを使用し、PDF ファイルを表示するためにこれを拡張することです。このためには、以下の処理が必要です。
1. サーバ上にファイルが作成されるディレクトリを作成します。（例：D:\Pdf）
2. そのディレクトリを参照する Web サーバのエイリアス（例：pdf）を作成します。
3. 帳票作成のバッチタスク内で、PDF を作成するための処理を組み込みます。Adobe AcrobatR などのサードパーティ製のPDF 出力ツールを使用して GUI 印刷出力の内容を PDF に変換するようにします。ファイル名は「d:\Pdf\report.pdf」と設定します。
PDF 出力ツールは、指定したフォルダ内に自動的に PDF を出力し、出力結果を表示しないように指定できる機能が必要です。ファイル名は、［入出力ファイル］テーブルの［名前］カラムに論理名で指定することで動的に指定できます。
4. ファイルを表示させるリッチクライアントタスク内で、［ブラウザ］コントロールを定義します。
30

インタラクティブなリッチクライアントの開発と実行

5. コントロールには、以下の URL を参照するように指定します。http://server/pdf/report.pdf
6. PDF ファイルの作成タスクと表示タスクを順番に実行します。
ノート
PDF の表示タスク内から作成タスクを実行しても、フォーム内の［ブラウザ］コントロールは再表示されません。ファイルの作成後に表示タスクを起動するようにタスクの構成を工夫してください。

31

インタラクティブなリッチクライアントの開発と実行

Chapter9

アプリケーションのモニタ実行する と 不具合が発生 し ます。 ど の よ う に原因を見つけ出 し ますか？

常に正常に動作するアプリケーションを開発し実行させることが開発者の目標です。しかし、不具合は突然、当然のごとく発生し、しかも最も悪い状況で発生するものです。
この章では、リッチクライアントアプリケーションを監視する方法について説明します。

目の前にある問題
リッチクライアントのパラダイムは、主にデータを表示するシンクライアントと実行環境と相互作用するサーバに基づいています。
Magic xpa のデバッガを使用することで、サーバ側で処理されている内容を参照することがができますが、クライア
ント側の処理内容も確認する必要があります。ブレイクポイントを定義して処理を順番に確認することができないた
め、リモート側のクライアントを使用して実行させる場合、問題になります。

ロギング
このような問題の解決方法は、ログを出力するように設定し、出力されたログを参照することです。ログには、各レベルや各コ
ンテキストで発生した内容が出力されます。

Magic xpa のロギング
Magic xpa のデバッガには、クライアント側とサーバ側の両方で処理内容を表示させることのできる組込型のロギング機能が備わっています。

動作のロギング
アプリケーションを監視するには、Magic xpa Studio でプロジェクトを読み込む必要があります。これでロギング機能を使用することができます。
［デバッグ］メニューでデバッグモードを有効にすることで、アプリケーションはデバッグモードで実行され、ロギングが開始されます。

アクティビティモニタ［表示］メニューから［アクティビティモニタ］を選択すると、現在の動作内容が別ウィンドウ内に表示されます。
アクティブティモニタの表示内容についての詳細は、Magic xpa の『リファレンスヘルプ』を参照してください。

フィルタ
Magic xpa のロギング機能には、ログに出力したい内容を絞り込むことができます。フィルタの設定は、プルダウンメニューから［オプション \ 設定 \ ロギング］を選択することで可能です。

32

インタラクティブなリッチクライアントの開発と実行フィルタ機能に関する詳細は、Magic xpa の『リファレンスヘルプ』を参照してください。
ノート
クライアント側の処理内容を参照するには、［ロギング］テーブルの［クライアントの動作］の設定を「Yes」にする必要があります。この設定が「No」の場合、サーバ側の処理内容のみ記録されます。

サーバ同期
サーバ側のロギングを行うだけの場合は、サーバ側の処理コマンドがそのまま出力されます。しかし、クライアント側の内容をロギングする場合は、アクティビティモニタで参照するために処理内容をサーバに転送する必要があります。
各クライアントのコンテキストは、キャッシュメモリ内の自身の処理内容を記録します。リッチクライアントモジュールは、以下の場合、サーバ側に対しクライアントの処理内容を消去させます。

• サーバに対する次のリッチクライアントモジュールのアクセスが発生した場合• ロジックユニットが終了した場合。例えば、［レコード前］が終了した場合、リッチクライアントモジュールはサーバ側に対し処理内容を消去させます。
重要
アプリケーションのデバッグを行うとパフォーマンスが低下します。

ネットワーク情報の表示［リッチクライアント形式］フォームでは、ステータスバーでネットワーク状態を表示することができます。ネットワーク情報
は、ステータスバーの右の表示領域上でマウスポインタをホバーリングさせることで表示されます。プログラムが Magic xpa
Studio から実行された場合、この機能は常に有効になります。プログラムが実行エンジンで実行する場合は、アプリケーションの起動に使用される HTML ファイルの DisplayStatisticInformation パラメータを以下のように修正することで有効になります。
<body onload="initialization()"><xml id="rcExecProps"><properties>.....
<property key="DisplayStatisticInformation" val="Y"/><property key="LogClientSequenceForActivityMonitor" val="N"/><property key="InternalLogLevel" val=""/><property key="InternalLogFile" val=""/>

33

インタラクティブなリッチクライアントの開発と実行

Chapter

10
プログラムの移行
リ ッ チ ク ラ イ ア ン ト のプ ロ グ ラ ミ ン グは、 オン ラ イ ンプ ロ グ ラ ミ ン グ と 異な る も の と 思われがちですが、 実際はど う で し ょ う か？のドキュメントでは、リッチクライアントの技術と、アプリケーションを新しい環境の制約内で、よりよく動作させることを保証するための方法について説明してきました。このドキュメントの読者のほとんどは、Magic xpa のプログラミングに関しての初心者ではなく、独自のプログラミング方法を持っている場合があります。今までよく使用していたオプションのいくつかがリッチクライアントプログラミングでは利用できないものがあります。

ここの章では、リッチクライアント用にプログラムを作成する上で、注意しなければならない変更点について解説しています。新
しい方法で開発する場合を含め、今まで使用していたプログラムを修正する場合に発生する可能性のある問題点についても説明しています。
通常のクライアントプログラムをリッチクライアントプログラムに移行する際、動作の違いを考慮する必要があります。また、パフォーマンスに関しても考慮する必要があります。

事前準備
既存のアプリケーションを変更する前に、まずリッチクライアント準備ユーティリティを実行してください。このユーティリ
ティは、アプリケーションに定義されているモデルをスキャンし、［スタイル］特性の［GUI 表示形式］の内容を［リッチクラ
イアント表示形式］にコピーします。この処理は、継承が解除されている特性に対してのみ行われます。
［RM 互換］ロジックユニットを持つタスクは、リッチクライアントタスクに変換することができません。このようなロジック
は、イベントドリブン方式のロジックに変換する必要があります。

機能上の違いプルダウンメニュー
リッチクライアントアプリケーションは、アプリケーションのメニューを含む MDI フレームまたはコンテナを持っていません。
これは SDI プログラムの中で実装する必要があります。

他のプログラムを呼び出す
オンラインプログラムの場合、プログラムが別プログラムを呼び出すと、並行起動プログラムでない限り起動元のプログラムの処理は中断されます。しかし、リッチクライアントプログラムが別のプログラムを呼び出す場合、起動元のプログラムも並行して実行されます。この場合、サーバ側の 1 つのコンテキスト上で実行されます。
並行実行に設定されたプログラムを呼び出した場合、起動されたプログラムは、別のコンテキストをオープンし、新しい実行ツ
リー上の最初のプログラムとして実行されます。並行実行のプログラムを呼び出したプログラムを終了させても起動されたプロ
グラムは終了しません。
オンラインプログラムと同じように動作させるには、起動するプログラムをモーダルに指定する必要があります。これは、その［ウィンドウタイプ］特性を「M= モーダル」にすることで実現できます。

34

インタラクティブなリッチクライアントの開発と実行起動されるプログラムの［ウィンドウタイプ］特性が「デフォルト」の場合、プログラムをリッチクライアントに変更する際に自動的に「M= モーダル」に変更されます。

サポートされない関数
通常の Magic 関数の中にはリッチクライアントタスクでは利用できないものがあります。これらのほとんどは、簡単な回避手段があります。関数の中には、ロジックユニットに定義できないものがあります。例えば、KBPut と KBGet はサポートされません。これらの関数の代わりに、［イベント実行］処理コマンドと［イベント］ロジックユニットを使用することができます。

ユーザイベント（［ユーザアクション 1］～［ユーザアクション 20］のような）いくつかの内部イベントは、リッチクライアントタスクでは利用できません。通常のユーザイベントを作成し、これらのイベントの代わりとして使用する必要があります。
メインプログラム内の［ユーザイベント］テーブルに「ユーザアクション xx」という名前のユーザイベントが定義されている
場合、リッチクライアントタスクに変換する際に［ユーザアクション xx］イベントが同じ名前のユーザイベントに変換されます。
［ユーザアクション］がモデルに定義されている場合、リッチクライアント準備ユーティリティを実行することで［ユーザイベ
ント］に変換されます。この場合も、事前にメインプログラムのに［ユーザイベント］テーブルにイベントを定義しておく必要があります。

バッチタスクからリッチクライアントタスクの呼び出し
バッチタスクはサーバ上で実行されるため、インタラクティブなリッチクライアントタスクを呼び出すことができません。クライアント上でインタラクティブでないタスクを実行させる必要がある場合、リッチクライアントタスクをインタラクティブで動作しないように設定することで対応できます。
既存のプログラムをリッチクライアントタスクに変換する際、バッチタスクをリッチクライアントに変更すると自動的にインタ
ラクティブでないリッチクライアントタスクに変換されます。

帳票出力
帳票出力は、PDF ファイルとして出力し、関連プログラムを使用して PDF を表示することで実現できます。PDF は、クライア
ントに転送して保存したり、クライアント側でリモートアクセスすることができます。この例は、第 8 章「帳票の作成と表示 ブラウザコントロールの実装」（30 ページ）で説明しています。この例では、帳票を表示するために［ブラウザ］コントロール
を使用しています。

フォーム特性
以下の［フォーム特性］は完全にはサポートされていません。

• ウィンドウタイプ …… 以下のウィンドウタイプはリッチクライアントタスクではサポートされません。
• デフォルト• 分割子ウィンドウ• アプリケーションモーダル• MDI 調整• ウィンドウ一覧に表示• 寸法単位 …… 「ダイアログ」のみサポートします。寸法単位が「インチ」または「センチ」に設定され、［位置］特性に式が設定されている場合、手動でこれらの値を変更する必要があります。

• フォーム状態 ID• 分割 …… フォームが分割されている場合、「リッチクライアントフレーム形式」フォームが追加されます。
• フォント …… TrueType フォントだけがサポートされます。

子ウィンドウ［ウィンドウタイプ］特性が「C= 子ウィンドウ」に設定されたプログラムは、サブフォームに定義することでのみ実行させることができます。これらは新しいウィンドウを開くことはできません。

35

インタラクティブなリッチクライアントの開発と実行

ファントムタスク［サブフォーム］コントロールがサポートされたため、ファントムタスクはクライアント／サーバアプリケーションでも必要なくなりました。しかし、この機能を使用しているプログラムも存在しています。リッチクライアントタスクに移行する場合、プ
ログラムを呼び出す［サブフォーム］コントロールを追加し、ファントムタスクで呼び出すプログラムをサブフォームに定義する必要があります。
この後、プログラムを呼び出すためのロジックを削除してください。

コントロール特性
コントロールのルック＆フィールは、オンラインタスクでのコントロールとは異なる場合があります。コントロールの幅は、場合によっては設定されたテキストを全て表示するほど十分には広くないかもしれません。これは［コンボボックス］と［カラム］コントロールなどのチョイスコントロールで特に表れます。
移行する前に、プログラムのフォームを確認することを推奨します。
以下の［コントロール特性］は完全にはサポートされていません。

• コントロール共通• ヘルプ…… URL ヘルプのみサポートします。
• ［リストボックス］コントロール• 選択モード …… 複数選択はサポートしていません。
• ［ラジオボタン］コントロール• 複数行• テーブル内のラジオボタン …… テーブル内にラジオボタンを配置できません。
• ［テーブル］コントロール• マルチマーキング• 下辺の間隔• ［カラム］コントロール• カラムのマーキング• ［ツリー］コントロール• マルチマーキング• ツリー表示の保持 …… 「Yes」固定です。

コントロールの動作
いくつかのコントロールは、リッチクライアント環境では動作が異なります。プログラムを作成する時にその違いを事前に知っておき、これらを考慮する必要があります。

• ［ブラウザ］コントロール …… ［ブラウザ］コントロールは、リッチクライアントタスクでのみサポートされます。
• ［リッチエディット］コントロール …… 色やフォント、段落を設定する場合の動作が異なります。
• リッチクライアントタスクの場合は、バイナリ形式の BLOB 項目を使用します。
• オンラインタスクでは、Unicode 形式の BLOB 項目を使用します。
これ以外の書式を使用する場合、BLOB の内容を更新すると、設定された色やフォント、段落が削除されるかもしれません。

• パーク不可コントロールをクリックした後のキャレットの位置• オンラインタスクの場合は、キャレットは最も近いパーク可能コントロールに移動します。
• リッチクライアントタスクの場合、キャレットは現在の位置にとどまります。
• ［テーブル］コントロール• テーブル内に表示される変数項目の値を変更すると、すべての行の変数項目が一度に再表示されます。
• テーブルを参照するためにスクロールバーを使用しても、現在のレコードは移動しません。

36

インタラクティブなリッチクライアントの開発と実行• ［サブフォーム］コントロール …… オンラインタスクの場合、タスクがサブフォームによって表示されているのであれ
ば、キャレットがタスクを抜けると、タスクは自動的に終了します。リッチクライアントの場合は、コンテナタスクが終了するまで、タスクは実行し続けます。以下は、事前に知っておく必要のある問題点です。

• サブフォームの［タスク前］と［タスク後］は、一回だけ実行されます。
• IsFirstRecordCycle 関数は、一回だけ実行されます。
• 複数のサブフォーム内で同じデータソースを使用する場合、データソースの［名前］特性を使用すると、そのデータソースを使用する全てのサブフォームに影響します。

• サブフォームタスク内で［終了］イベントを発行すると、サブフォームのコンテナタスク内でイベントを発行することになり、結果として両方のプログラムを終了させることになります。親プログラムを終了させたくない場合は、［終了］
イベントは補足してください。2 回の終了がある場合、親プログラムを終了するためにキャンセルされなければなりません。

• サブフォームから Tab キーを押下すると親の次のコントロールに移動するように定義することができます。
• リッチクライアントでサブフォームをクリックすると、キャレットは現在のコントロールに止まり、フォーカスをサブフォームには移動しません。

• ［プッシュボタン］コントロール …… データ項目が定義されていないプッシュボタンをクリックすると［ズーム］イベ
ントを発行します。

• オンラインタスクの場合、独自の［ズーム］ロジックユニットが定義されたコントロール上でパークする場合だけ、［ズーム］イベントが発行されます。

• リッチクライアントタスクの場合、［ズーム］イベントが発行されます。

データ項目
OLE 型はサポートしていません。必要な場合は、サーバ上で実行するバッチタスクに移行してください。

ステータスバー
リッチクライアント・アプリケーションのステータスバーにはメッセージセクションのみ含まれるため、エラーメッセージを表示させるだけしかできません。「ズーム」や「挿入」、「上書」などは表示されません。
これは、コントロールに対応する［ズーム］イベントのロジックユニットが定義されていても、ステータスバーに「ズーム」が表示されないことを意味しています。
［コントロール特性］や［モデル特性］に自動ヘルプを定義した場合、この機能を実装する必要があります。
SpecialShowStatusBarPanes の設定を使用することで、ステータスバーにタスクモードを表示させることができます。

物理トランザクション
物理トランザクションはサポートしていません。
データ修正（登録、更新、削除 ) を必要とするリッチクライアントプログラムでは、遅延トランザクションが必要となります。
遅延トランザクションが設定されない場合、データの読み込みのみ利用できます。
継続してプログラムにアクセスする手段として、アプリケーションがデータベースに対し物理ロックに依存している場合、開発者はこの代替案を検討する必要があります。可能な選択肢として、Lock や Unlock 関数を利用することが考えられます。

並行するコンテキスト間のイベント
コンテキスト間でのイベントの発行はサポートされません。該当する場所であれば何処であっても、起動されるプログラムの［並行実行］は無効にすることができます。呼び出されるプログラムが、並行実行の場合と並行実行でない場合の違いは、前述の「他のプログラムを呼び出す」（34 ページ）を参照してください。

動作環境［カーソルの画面中央位置付］の設定はサポートされません。

クライアントとサーバの式
クライアントで実行される式は、リッチクライアントタスクの［代入］特性に指定できません。
混在させた式を使用することはできません。

37

インタラクティブなリッチクライアントの開発と実行別の側で実行される式による混在した処理コマンドを使用することはできません。
［コントロール特性］と［フォーム特性］には、サーバ側の式を使用することができません。

38

インタラクティブなリッチクライアントの開発と実行

Chapter11
モバイル用の RIA アプリケーションの開発
モバ イ ル用の開発、 どれだけ複雑なのですか？

モ

バイル端末からアプリケーションに接続できたら非常に便利になります。モバイル端末上で実行されるアプリケーションを開発するために、RIA テクノロジーを使用することができます。これによりデスクトップ上での RIA アプリケー
ションと同じルック＆フィールを持つことができます。

詳細は、『モバイルデバイス用 RIA』を参照してください。

39