Seasarプロジェクト ＞ Seasar.NETプロジェクト ＞ S2Container.NET ＞ S2Windows.NET ＞ 画面遷移をコントロール

# 目次

上へ

S2Windows.NETを使ったWindowsFormの画面遷移の制御について説明します。

一般に、WindowsFormの画面遷移を制御するには、 それぞれのWindowsFormのメソッドの中で呼び出すWindowsFormのオブジェクトを生成し、表示してきました。

そこを、WindowsFormや画面遷移をDIするためには次のようにします。

- 画面遷移用インターフェイスを用意する
- WindowsFormにプロパティを用意する
- 起動用クラスを用意する
- diconファイルの修正
- Quillで利用する場合
- WindowsForm用ユーティリティクラス

S2Windows.NETを使用するときには、 アプリケーション構成ファイルの<assemblys>にアセンブリ(Seasar.Windows)を指定します。

S2Windows.NETはSeasar.Quill.NETを必要とするようになりました（1.3.8より）。

# 画面遷移用インターフェイスを用意する

上へ

実行用ファイルを作成するプロジェクトにインターフェイスを追加します。

そして、WindowsFormを呼び出すメソッドを追加します。このメソッドを取り決めた命名規則に従って命名しておくと、 下記のdiconファイルを設定するときに楽になります。

Seasar.Windows.Attr.TargetForm属性を使ってメソッドに表示するフォームを設定します。

idは引数の例で、フォームのIDプロパティに引数の値がセットされます。 つまり、引数と同名のプロパティをフォームに用意していると引数の値をセットします。

C#

    public interface IFormDispatcher
    {
        [TargetForm(typeof ( FrmHoge ), ModalType.Modal)]
        void ShowHoge(int id);

        [TargetForm(typeof ( FrmHoge2 ), ModalType.Modal, "ReturnValue")]
        HogeDto ShowHoge2(int id);
    }

VB

    Public Interface IFormDispatcher
        <TargetForm(GetType(FrmHoge), ModalType.Modal)> _
        Sub ShowHoge(ByVal id As Integer)

        <TargetForm(GetType(FrmHoge2), ModalType.Modal, "ReturnValue")> _
        Function ShowHoge2(ByVal id As Integer) As HogeDto
    End Interface

一番目のメソッドの例でのTargetForm属性の最初の引数は、遷移先WindowsFormのtypeを指定します。 二番目の引数はWindowsFormのモーダルタイプを指定します。こちらでメソッドの返値を指定するには、 diconファイルで遷移先対象WindowsFormからの返値を取得するためのプロパティ名を指定します。

二番目のメソッドの例でのTargetForm属性の最初の引数は遷移先WindowsFormのtypeを指定します。 二番目の引数はWindowsFormのモーダルタイプを指定します。 三番目の引数は遷移先対象WindowsFormからの返値を取得するためのプロパティ名です。

# WindowsFormにプロパティを用意する

上へ

画面遷移用インターフェイスに作成したメソッドに引数がある場合、遷移先WindowsFormに引数と同名のプロパティを用意します。 型も一致させます。画面遷移時に、このプロパティに引数の値をセットすることになります。

画面遷移用インターフェイスに作成したメソッドに返値がある場合、遷移先WindowsFormに返値と同じ型のプロパティを用意します。 全てのFormで同じプロパティ名であれば、Diconファイルで指定し、Formごとに異なる場合はTargetForm属性で指定します。

# 起動用クラスを用意する

上へ

実行ファイルのプロジェクトにアプリケーション起動用クラスを用意します。 通常、プロジェクトの生成時に作られる最初のフォームからMain文を移してくればいいでしょう。 もちろん、プロジェクトのスタートアップオブジェクトもこの起動用クラスに変更します。

C#

    public class StartMain
    {
        /// <summary>
        /// DIコンテナ設定ファイル
        /// </summary>
        private const string PATH = "Examples.dicon";

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public StartMain()
        {
            ;
        }

        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        private static void Main()
        {
            Application.EnableVisualStyles();

            IS2Container container = S2ContainerFactory.Create(PATH);
            container.Init();

            ApplicationContext context = (ApplicationContext)
                container.GetComponent(typeof ( S2ApplicationContext ));
            if (context.MainForm == null)
                context.MainForm = (Form) container.GetComponent("MainForm");
            Application.Run(context);
        }
    }

# diconファイルの修正

上へ

diconファイルにWindowsForm、ApplicationContextの設定、AOPによる画面遷移コントロールを設定します。

WindowsFormの設定は次のように行います。

    <component name="frmHoge" class="Seasar.Windows.Examples.FrmHoge" />

WindowsFormをModalessで表示するときには、該当するWindowsFormのinstance属性にはprototypeを指定します。 そうしないと、 WindowsFormを閉じて、再度表示されなくなります。

起動用クラスで使うApplicationContextの設定は次のように行います。

    <component name="AppContext" class="Seasar.Windows.S2ApplicationContext" >
       <arg>container</arg>
       <!-- MainFormを初期起動フォームに変更する -->
       <property name="MainForm">frmHoge</property>
    </component>

WindowsFormをS2Containerに自動登録したときには、IAutoNamingインターフェイスの実装クラスであるSeasar.Windows.DefaultFormNamingクラスを利用します。このクラスはMainFormNameプロパティで指定したWindowsFormクラスをLabelプロパティ名でs2containerにコンポーネントの自動登録時に登録します。

AOPによる画面遷移の設定は次のように行います。画面遷移用インターフェイスのメソッドに対し、 Seasar.Windows.AOP.Interceptors.FormInterceptorでpointcutを設定します。

    <component name="Dispatcher" class="Seasar.Windows.Examples.IFormDispatcher">
        <!-- pointcutは命名規則に従ってつけたメソッド名を正規表現で表示する -->
        <aspect pointcut="Show.*">
            <component class="Seasar.Windows.AOP.Interceptors.FormInterceptor" >
              <!-- プロパティPropertyはFormからの返値用プロパティを指定する -->
              <property name ="Property">"ReturnValue"</property>
            </component>
        </aspect>
    </component>

上記のWindowsFormを設定したdiconファイルとDao等を設定したS2Unit.NETで使うdiconファイルで分けておいた方が、 S2Unit.NETを使用する場合、テストに不要なWindowsFormのオブジェクトをS2Container.NETが生成しないで済みます。

# Quillで利用する場合

上へ

Quillを使ってWindowsFormの画面遷移の制御を行う場合、上で説明したFormInterceptorに代わり、 Seasar.Windows.AOP.Interceptors.QuillFormInterceptorを利用します。

この場合、「画面遷移用インターフェイスを用意する」にあるように作成する代わりに、次のようにQuillのAOP指定をします

    [Implementation]
    [Aspect(typeof(Seasar.Windows.AOP.Interceptors.QuillFormInterceptor))]
    public interface IFormDispatcher
    {
        [TargetForm(typeof ( FrmHoge ), ModalType.Modal)]
        void ShowHoge(int id);

        [TargetForm(typeof ( FrmHoge2 ), ModalType.Modal, "ReturnValue")]
        HogeDto ShowHoge2(int id);
    }

VB

    <Implementation> _
    <Aspect(GetType(Seasar.Windows.AOP.Interceptors.QuillFormInterceptor))> _
    Public Interface IFormDispatcher
        <TargetForm(GetType(FrmHoge), ModalType.Modal)> _
        Sub ShowHoge(ByVal id As Integer)

        <TargetForm(GetType(FrmHoge2), ModalType.Modal, "ReturnValue")> _
        Function ShowHoge2(ByVal id As Integer) As HogeDto
    End Interface

そして「WindowsFormにプロパティを用意する」にあるとおりプロパティを用意します。

「起動用クラスを用意する」、「diconファイルの修正」にあるようなことは不要です。 ただし、Quillの「Windowsアプリケーションから簡単にQuillを利用する」にあるような設定を行う必要があります。

# WindowsForm用ユーティリティクラス

上へ

WindowsForm用にいくつかのユーティリティクラスを用意しています。入力チェックなどに使ってみてください。

- Seasar.Windows.Util.Validator -- 入力チェック用ユーティリティクラス

.NET 1.1版用では次のクラスもあります。

- Seasar.Windows.Util.Converter -- 変換用ユーティリティクラス

© Copyright The Seasar Project and the others 2004-2009, all rights reserved.