設計上、画面のレイアウトを担当するGraphic、処理の内容を担当するCommand、そしてその間を取り持つScreenの3つの役割がそれぞれ分担されることによって、疎結合を実現しています。この方式を採用することで、各業務(画面)ごとに開発が行えるだけでなく、デザインとロジックを切り分けることで、依存性を低く保ち、たとえば画面デザイナーと処理記述のプログラマーが分散して開発を進めることができるようになっています。利用して間接的に呼び出すようになっています。ある画面から、別の画面の処理を呼び出したい、という場合には、「イベントバス」という概念を利用します。このイベントバスには、インスタンス化されたすべてのScreenが関連付けられており、あるScreenがこのイベントバスにメッセージを送ると、関連付けられているすべてのScreenにそのメッセージがブロードキャストされます。メソッドを呼び出してメッセージを送信します。メソッドに送られるので、受け側のScreenはそのメソッドをオーバーライドすることで、メッセージを受け取ることができます。any型の任意の値(またはオブジェクト)です。他のScreenにデータを渡す必要がある場合は、そのデータをもつオブジェクトをメッセージとして送信することができます。イベントは非同期で実行されますが、send-message-syncを利用することで、メッセージを送った後のイベントが実行し終えるまで同期して待つことが可能です。この同期方式を利用し、受け側のScreenの処理の中で送られてきたメッセージの中にデータを格納し、処理が終了した後、同期された送り側のScreenがそのデータを参照することで、間接的に戻り値のようにしてデータを受け取ることも可能です。利用したサンプルイベントバスを利用するサンプルを作成しましたので参考にして下さい。(親画面)の中に「クリア」ボタンと、タブコンテナが含まれ、そのタブコンテナの2つのペインが、それぞれ別のScreenを含んでいます。コンテナペインの中のScreenは、テキストフィールドをひとつずつ含んでいます。親画面の「クリア」ボタンを押すと、各コンテナの中のテキストフィールドの値がクリアされるという処理を、イベントバスを利用して実装しています。いうメッセージがイベントバスに送られます。中でテキストフィールドをクリアするCommandを呼び出しています。(カールゾンターク)とは、画面単位でプログラムを整理するためのCurlによるMVCフレームワークで、オープンソースとして提供しております。(ライセンス:Apache2.0)ソースコード及びバイナリファイルは、SourceForgeからダウンロードすることができます。Sonntagを使った開発では、1画面毎に以下の3種類のクラスを作ります。(コマンド)アプリケーションのUIに応じて、1つのウィンドウを複数の画面として開発することもできます。以下のようなヘッダー・メニュー・ボディに分かれたレイアウト構成の場合は、タブペインの場合は、のように画面を分割定義することができます。グラフィックとは(ScreenGraphic)デザインをする人が、画面レイアウトを定義するクラスとなります。Curlクラスで定義します。具体的には、以下のようなクラス定義となります。OrderEntryLayout・・・}スクリーンとは(Screen)画面毎のアプリケーションロジックを持つクラスとなります。このスクリーンクラス内で、画面の初期化やグラフィックへのアクセスなどを記述し、グラフィックの操作をカプセル化します。スクリーンを作成するには、フレームワークのクラスを継承したクラスを定義します。XxxxGraphic}」のようにVScreen-ofまたはScreen-ofを継承します。OrderEntryLayout}}・・・}コマンドとは(ScreenCommand)画面上の操作に応じた処理ごと(ボタンを押下したときの処理、イベントハンドラなど)にひとつずつ作成するもので、ロジックを記述します。コマンドを作成するには、フレームワークのマクロ(define-screen-command)で定義します。基本的な使い方を説明します。サンプルプログラムは以下のリンクからダウンロードできます。ファイルを特権のある任意のフォルダに解凍します。実行(ダブルクリック)すると以下のようなログイン画面(を模したウィンドウ)が起動します。ユーザIDに「sonntag」、パスワードに「curl」と入力してログインボタンを押すと画面遷移します。以下からこのサンプルプログラムのソースコードを説明していきます。画面毎に以下の3種類のクラスを作成します。スクリーングラフィックスクリーンスクリーンコマンドスクリーングラフィックは、静的な画面レイアウトを表すクラスです。アプリケーションロジックは記述しません。アプリケーションロジックはスクリーンとスクリーンコマンドに持たせます。スクリーンはスクリーングラフィックと1対1で定義するクラスです。このクラスには、スクリーングラフィック上のコントロールにアクセス(値の取得、設定など)する処理や、動的に変わるレイアウトの処理などを記述します。画面上のボタンが押された場合の処理など、アプリケーションにおける主要なロジックについてはそれぞれをスクリーンコマンドとして定義します。いうパッケージを定義しています。このパッケージ中に上述した3種類のクラスが含まれています。パッケージをインポートしています。画面の作成する場合は、最初にスクリーングラフィックを定義します。プログラムと同様、以下のいずれかの方法で定義できます。ファイルにログイン画面のスクリーングラフィックが定義されています。{default}・・・(略)}}このクラスのコンストラクタでは、ユーザIDやパスワードの入力フィールドおよびログインボタン、クリアボタンを生成・配置しています。vbox}}}このように、なるべくスクリーングラフィックはレイアウトのコードのみとなるように作成します。定義されたスクリーンクラスです。いうクラスを継承しています。Ex1LoginGraphic)を指定しています。いうスーパークラスを使用します。レイアウトクラスを指定します。利用する方法については、今後別の記事で解説する予定です。スクリーンからスクリーングラフィックへのアクセススクリーンはスクリーングラフィックに対する論理的なインターフェースを提供するように作成します。メソッド)を定義しています。“password-pf”}},・・・(略)}}スクリーンからはこの名前を使ってコントロールにアクセスできます。いうメソッドを使ってフィールドにユーザIDとパスワードのフィールドをセットしています。メソッドは以下のように定義されます。ファイルに定義されています。このファイルには、ログイン画面のログインボタンとクリアボタンに対応して、2つのスクリーンコマンドが含まれます。メソッドを使用するログインボタンのスクリーンコマンドについて見ていきます。マクロを使用して定義します。ログインボタンの処理に対応するスクリーンコマンドの定義は以下のようになっています。関連付けされたスクリーンコマンドの定義になります。ステートメントを記述できます。このステートメント中では、指定した変数名(上記の例では「screen」)でスクリーンを参照することができます。「login」コマンドでは以下の赤字部分でスクリーンのメソッドを呼び出しています。Ex1NextScreen}else{popup-message“ユーザID「sonntag」、パスワード「curl」を入力してください。いうメソッドはスクリーンのスーパークラスで定義されているものです。リファレンス参照)、その画面に表示を切り替えます。以下のような記述を加えることによってボタン押下時に実行されるようになります。コンストラクタ引数に含めます。マクロの引数で、スクリーンコマンドの名前を文字列で指定します。利用して作成した画面を表示する方法について説明します。画面を表示するためのスクリーンスロットというオブジェクトを提供しています。いうクラスを使用しています。指定しており、これによってログイン画面が表示されます。リファレンスは以下の手順でインストールできます。ドキュメント・ビューワのメニューから「ヘルプ→ドキュメンテーションのインストール」を選択する。検索や参照ができるようになります。スクリーングラフィックとして利用することができます。作成するレイアウトクラスにイベントハンドラなどを記述する必要がなくなります。作成した画面レイアウトを用意します。記述を追加してください。いうクラスを継承してスクリーンを定義します。作成したレイアウトクラス。SampleLayout)をパラメータで指定します。SampleLayout}}・・・(略)}このように作成したスクリーンは、チュートリアルで説明したスクリーンと同様、スクリーンスロットを利用して以下のように表示することができます。作成したレイアウトクラスのオブジェクトを参照できます。上でデザイン名(design-name)を指定したオブジェクトをスクリーンクラス内から参照する構文は以下のようになります。いう値をセットするコードです。メソッドを上記で示した方法の代わりに使用することもできます。上のオブジェクトに「デザイン名」ではなく「名前」プロパティを設定します。