-
Notifications
You must be signed in to change notification settings - Fork 49
UserGuide_RichClient.ja
2016年10月3日
- Open 棟梁を用いたアプリケーション開発を行う、SE・開発者
本ドキュメントは、リッチクライアント用機能の利用方法について纏めています。
本ドキュメントに記載の会社名・商品名は、各社の商標または登録商標です。
本ドキュメントは、クリエイティブ・コモンズ CC BY 2.1 JP ライセンスの下で利用可能です。
図中の凡例:赤枠=実装必須、赤枠 (破線)=実装に注意が必要、青文字=任意の実装が可能。 ※ 一部のコード図は元 Word 資料から抽出できずキャプションのみとしています。詳細はサンプル プログラムを参照してください。
Windows Form 用 P層ベースクラスである「画面コード親クラス2」には、次に示す P層の共通処理を実装できます。
表 1.1 「画面コード親クラス2」に実装できる P層の共通処理
| 項番 | 処理 | メソッド | 説明項 |
|---|---|---|---|
| 1 | 初期処理 (ページ ロード処理) | UOC_CMNFormInit(カスタム認証、権限チェック、閉塞チェック、ページ タイトルの設定、アクセス ログの出力 .etc) | 1.1.1 項 |
| 2 | P層イベント処理の前後処理:開始処理 | UOC_PreAction(処理時間の測定、アクセス ログの出力 .etc) | 1.1.2 項 |
| 3 | 終了処理 | UOC_AfterAction(処理時間の測定、アクセス ログの出力 .etc) | 1.1.2 項 |
| 4 | 例外処理 | UOC_ABEND(メッセージ編集、共通メッセージの表示、アクセス ログ、エラー ログ出力 .etc) | 1.1.3 項 |
基本的に「画面コード親クラス2」は 1 つのシステムに対して 1 つ作成します。サンプルは ~\root\programs\C#\Samples\WS_sample\WSClient_sample にあります (「MyBaseControllerWin」クラスを参考にできます)。
図 1.1 「画面コード親クラス2」の実装のテンプレート
※ 「MyBaseControllerWin」クラスには共通的な UI 実装を追加することも可能ですが、「画面コード親クラス1」の「BaseControllerWin」クラスが abstract に指定されているため VS デザイナは使用できないので注意します。
「ページ ロード処理」は実装必須の処理です。「UOC_CMNFormInit」メソッドを「画面コード親クラス2」でオーバーライドし、カスタム認証、権限チェック・閉塞チェック、ページ タイトルの設定、アクセス ログの出力 .etc を実装します。
図 1.1.1 「ページ ロード処理」の実装例
「UOC_PreAction」「UOC_AfterAction」メソッドを「画面コード親クラス2」でオーバーライドし、処理時間の測定、アクセス ログの出力 .etc を実装します。
図 1.1.2 「P層イベント処理の開始・終了処理」の実装例
以下の 3 つの「UOC_ABEND」メソッドを「画面コード親クラス2」でオーバーライドします。
表 1.1.3 「画面コード親クラス2」に実装できる、3 つの「UOC_ABEND」メソッド
| 項番 | 対応する例外 | メソッド シグネチャ |
|---|---|---|
| 1 | 業務例外 | UOC_ABEND(BusinessApplicationException baEx, RcFxEventArgs rcFxEventArgs) |
| 2 | システム例外 | UOC_ABEND(BusinessSystemException bsEx, RcFxEventArgs rcFxEventArgs) |
| 3 | その他、一般的な例外 | UOC_ABEND(Exception ex, RcFxEventArgs rcFxEventArgs) |
- 業務例外の例外処理:処理後にリスローしない。「メッセージ編集」「共通メッセージの表示」を実装できる。
図 1.1.3-1 「業務例外の例外処理」の実装例
- システム例外の例外処理:処理後に「システム例外」をリスローする。「エラー ログ出力」を実装できる。
図 1.1.3-2 「システム例外の例外処理」の実装例
- その他、一般的な例外の例外処理:処理後にリスローする。「エラー ログ出力」を実装できる。
図 1.1.3-3 「その他、一般的な例外の例外処理」の実装例
本フレームワークの P層イベント処理機能は、下記コントロールのイベント (5 つ) に対応しています [1]。
表 1.1.4 P層イベント処理機能に対応するコントロール イベント
| 項番 | コントロール | イベント |
|---|---|---|
| 1 | ボタン (隠しボタン含む) | クリック イベント |
| 2 | ピクチャーボックス | |
| 3 | コンボボックス | セレクト インデックス チェンジ イベント |
| 4 | リストボックス | |
| 5 | ラジオボタン | チェック チェンジ イベント |
イベントを追加するには、業務フレームワーク (Business) 名前空間の「画面コード親クラス2」に P層イベント処理機能の拡張処理を実装します。ただしリッチクライアントはイベント数が多いので、.NET 標準のイベントハンドラから隠しボタン (HiddenButton) の DoClick メソッドで Click イベントを発生させるなどの工夫も必要になります (マルチプル・イベントやマルチキャスト・イベント等に対応する方法としても利用できます)。まず「画面コード親クラス2」の「ページ ロード処理」から「イベント追加処理」の「addControlEvent」メソッドを呼び出します。
図 1.1.4 「イベント追加処理」を「画面コード親クラス2」の「ページ ロード処理」から呼び出す
「addControlEvent」メソッドに実装する処理は、纏め者編 7 章:「P層イベント処理対応コントロール (イベント) の追加」と同様の処理方式です。
Windows Form の「画面コード クラス」をプロジェクトに追加して処理を実装します。
図 1.2 「画面コード クラス」の実装のテンプレート
- ページ ロード処理を実装する:「UOC_FormInit」メソッドを「画面コード クラス」でオーバーライドする。(図1.2.1)
-
「コントロールのイベント処理」を実装する:
- Windows Form 上にコントロール (
[prefix]任意の文字列) を配置する (プレフィックスは ASP.NET 版 P層と同様に app.config に定義)。(図1.2.2-1) - 「画面コード クラス」上に UOC メソッド
UOC_[prefix]任意の文字列_Clickを実装する。イベント ハンドラのシグネチャはprotected string イベント ハンドラ名(RcFxEventArgs rcFxEventArgs)とする。(図1.2.2-2、図1.2.2-3)
- Windows Form 上にコントロール (
カスタム コントロール テンプレートを [C#\Frameworks\Infrastructure\CustomControl\RichClient] 以下に用意しているので、これをカスタマイズしてプロジェクト用のカスタム コントロールを作成できます。対象は TextBox と MaskedTextBox の 2 つで、チェック・編集処理のカスタム実装を含みます。使用サンプルは [\C#\Samples\2CS_sample\CustCtrl_sample] です。VS のデザイン タイム プロパティを変更するだけで、チェック・編集処理の動作をカスタマイズできます。
図 1.3-1 各カスタム コントロールのデザイン タイム プロパティ
表 1.3 各カスタム コントロールのデザイン タイム プロパティ
| 項番 | プロパティ | 説明 | 備考 |
|---|---|---|---|
| 1 | CheckRegExp | 正規表現チェック | TextBox/MaskedTextBox 共通 |
| 2 | CheckProhibitedChar | 禁則文字チェック | |
| 3 | CheckType | チェックタイプ (IsIndispensabile 必須/IsHankaku 半角/IsZenkaku 全角/IsNumeric 数値/IsKatakana 片仮名/IsHanKatakana 半角片仮名/IsHiragana 平仮名/IsDate 日付) | |
| 4 | EditPadding | 文字埋め編集 | TextBox のみ |
| 5 | EditDigitsAfterDP | 小数点以下 x 桁編集 | |
| 6 | EditAddFigure | 桁区切り編集 (PadDir パッド方向/PadChar パッド文字) | |
| 7 | Mask_Editing | 編集中に適用されるマスク | MaskedTextBox のみ |
| 8 | Text2 | Mask を適用した値/マスクを除いた値を取得 | TextBox/MaskedTextBox |
| 9 | Text3 | Mask_Editing を適用した値を取得 | MaskedTextBox のみ |
カスタム コントロール テンプレートには、イベント (Enter:編集開始 + 全選択、Validating:単項目チェック、Validated:編集終了) とメソッド (Validate、GetDateTime、GetDecimal、GetDouble、GetFloat、GetInt16/32/64) が埋め込まれています。一括チェック処理は CmnCheckFunction.HasErrors メソッドを使用して容易に実装でき、チェック エラー情報は List<CheckResult> として返却されます。(図1.3-2)
非同期呼び出しは Windows Forms・WPF の双方のリッチクライアント アプリケーションから利用できます。
表 2.1 「非同期呼出コード親クラス2」に実装できる共通処理
| 項番 | 処理 | メソッド | 説明項 |
|---|---|---|---|
| 1 | 非同期呼出処理の前後処理:開始処理 | UOC_Pre(処理時間の測定、アクセス ログの出力 .etc) | 2.1.1 項 |
| 2 | 終了処理 | UOC_After(処理時間の測定、アクセス ログの出力 .etc) | 2.1.1 項 |
| 3 | 例外処理 | UOC_ABEND(アクセス ログ、エラー ログ出力 .etc) | 2.1.2 項 |
| 4 | 最終処理 | UOC_Finally(終了処理 .etc) | 2.1.2 項 |
サンプルは「MyBaseAsyncFunc」クラスを参考にできます。
図 2.1 「非同期呼出コード親クラス2」の実装のテンプレート
- 開始・終了を実装する(図2.1.1)
図 2.1.1 「非同期呼出コード親クラス2」の開始・終了処理
- 例外、最終処理を実装する(図2.1.2-1):最終処理 (UOC_Finally メソッド) は、スタート処理 (Start、StartByThreadPool メソッド) と対応させて「スレッド数管理」「画面ロック管理」を行います。スレッド数は app.config に定義します。
図 2.1.2-1 「非同期呼出コード親クラス2」の例外・最終処理
※ この処理部はクリティカルセクションですが、非同期スレッド側で実行される最終処理 (UOC_Finally) 内のクリティカルセクションでは、Control.Invoke や Dispatcher.Invoke などの主スレッド経由の同期呼び出しを行わないよう注意します (デッドロックを防ぐため)。
非同期呼び出し処理の実装箇所は、Windows Forms の Form や WPF の Window のイベントハンドラ上になります。
図 2.2-1 非同期呼出し処理の実装例
※ C# の匿名関数 (クロージャ) のデリゲートを使用していますが、VB では使用できないので、通常のメソッドを定義して AddressOf 演算子でデリゲートします。VB ではレキシカル スコープでローカル変数を使用できないため、各処理からアクセスする変数はメンバ変数に定義します。
BaseAsyncFunc.SetResult デリゲート内でフォーカス移動やチェックエラーの反映などを行う場合、画面がロックされているため処理結果が反映されないことがあります。この場合は処理を別メソッドに切り出し、必要に応じて Control.BeginInvoke や Dispatcher.BeginInvoke を (画面がアンロックされるまで) 繰り返すよう実装します。
図 2.2-2 結果表示処理でフォーカス移動やチェックエラーの反映などを実装する場合の実装例
非同期イベントは、Windows Forms・WPF や常駐型アプリケーションで利用できる、名前付きパイプ名を使用したプロセス間通信が可能な非同期のイベント処理を実装するためのフレームワークです (名前付きパイプ名のコネクションは都度接続方式)。
初期化メソッドを呼び出します (第一引数:コチラの名前付きパイプ名、第二引数:接続先の名前付きパイプ名の文字列配列、第三引数:接続待ちの待機時間 (ミリ秒))。終了処理では終了メソッドを呼び出します。(図3.1-1、図3.1-2)
AsyncEventFx.RegisterAsyncEvent メソッドで登録、AsyncEventFx.UnRegisterAsyncEvent メソッドで登録抹消します。エントリ (AsyncEventEntry オブジェクト) には以下を設定します(図3.2-1、シグネチャは図3.2-2)。
-
イベント区分 (
AsyncEventEnum.EventClass):Thread (スレッド関数)、ThreadPool (スレッド プール)、WinForm (Control.BeginInvoke)、WPF (Dispatcher.BeginInvoke) から選択。 - 機能 ID:非同期イベントのイベント名 (0〜36 文字)。
- Control:イベント区分が WinForm、WPF の場合、BeginInvoke に使用するコントロール。
- イベントハンドラ:非同期イベントを受信して処理を遂行するデリゲート。
登録した非同期イベントは、呼び出しメソッドで呼び出せます (第一・二引数:送り先のイベント区分+機能 ID、第三・四引数:送り元のイベント区分+機能 ID、第五・六引数:名前付きパイプ名、第七・八引数:送信データのデータ長と送信データ (バイト配列))。(図3.3)
※ 送信データのヘッダーは C 構造体のバイナリ表現であるため、C/C++ とのデータ交換も可能です。
C/S 2層アプリケーションのサンプルは ~\root\programs\C#\Samples\2CS_sample にあります。C/S 2層アプリケーション開発では、P層フレームワーク (Windows Forms)、B層フレームワーク (C/S 2層用)、D層フレームワークを使用できます。
- 使用 (継承):「業務コード親クラス1」に C/S 2層用のクラスを使用し、「業務コード親クラス2」がそれを継承、「業務コード クラス」が更にそれを継承する。
図 4.1-1 C/S 2層用の B層フレームワークを使用(継承)
-
トランザクションの開始:C/S 2層のクライアント側では、サーバ側と異なり、都度コミット・ロールバックせず手動で制御する。B層の呼び出し時に
MyFcBaseLogic2CS.UOC_ConnectionOpenメソッドが呼び出されるので、ここでトランザクションを開始する (既に DB 接続が確立されている場合は呼び出されない)。
図 4.1-2 B層呼び出し時のトランザクション分離レベルの指定
-
トランザクションの終了:
DbEnum.IsolationLevelEnum.NoTransactionを指定している場合、以降は自動コミット トランザクションとなる (図4.1-3:DB 接続の切断)。それ以外の分離レベルの場合は、コミット・ロールバックを手動で制御する (図4.1-4:トランザクションの終了 + DB 接続の切断)。DB 接続・切断オーバーヘッドの軽減にはコネクション プーリング [2] を使用する。
C/S 2層用の B層・D層フレームワークを利用するのに必要な app.config のパラメタがあります (ASP.NET Web 開発と比較して使用できない機能があるため、不要なパラメタがいくつかあります)。各パラメタの説明は「纏め者編」1.2 節を参照してください。(図4.2-1)
Web デプロイ部品は、実行モジュールをクライアント端末にデプロイするツールです。実行モジュールを複数の [ZIP ファイル] にアーカイブし、ダウンロード一式の情報を [配置マニュフェスト ファイル] に纏めることができます。クライアントから [配置マニュフェスト ファイル] への URL を指定するだけで、実行モジュール一式をデプロイできます (差分の ZIP ファイルのみのダウンロードにも対応)。
[Zip パッケージを作成] タブで、[フォルダ] (圧縮対象)、[ファイル名] (圧縮ファイル名) を入力し [圧縮] ボタンを押下します。
図 5.1 ZIP パッケージの作成
ポイントはチェック ボックスの状態です。オフ (デフォルト) の場合はインストール ディレクトリ直下に ZIP ファイル名と同じ名前のフォルダを作成し復元します (フォルダ毎に圧縮する場合に適する)。オンの場合はインストール ディレクトリ以下に構成をそのまま復元します (一度に複数のファイルやフォルダを配置する場合に適する)。
[配置マニュフェスト] タブで、ZIP ファイル、[インストール ディレクトリ] (環境変数使用可能)、[EXE 名 (パス)] (カンマ区切りで起動チェック EXE、起動 EXE [3]) を指定し、[マニュフェストファイルを作成する] ボタンを押下します。
図 5.2 配置マニュフェストの作成
作成後は、[配置マニュフェスト ファイル] と全ての ZIP ファイルを WWW サーバ上の同じディレクトリに配置します。
[HTTP でデプロイ] タブが、実行モジュールをクライアント端末にデプロイするタブです。
図 5.3-1 Web デプロイ(GUI で実行)
このツールは CUI としても実行でき、/HELP オプションでヘルプを確認できます。
図 5.3-2 Web デプロイ(CUI の /HELP コマンドを実行)
WWW サーバの URL には [配置マニュフェスト ファイル] への URL を指定し、Credential (認証や資格) 情報 (ユーザ ID、パスワード、ドメイン名) を入力します。プロキシ サーバを経由する場合は、プロキシ サーバの URL と Credential 情報を入力します (URL 指定が無い場合は IE 設定を適用、none 指定でプロキシ未使用)。以下の config 値も調整可能です。
<!-- app.config -->
<!--非同期呼び出し処理の多重度(2以上の設定が必須)-->
<add key="FxMaxThreadCount" value="3"/>
<!--プログレスダイアログが閉じるまでの待機設定(秒)-->
<add key="PDWSleepSec" value="3"/>-
MSGDefinition.xml:各種表示メッセージの調整 -
Log4DeployZipPackWithHTTP.xml:ログ出力設定の調整 (log4net)
図 5.3-4 フローチャート:ツール起動までの流れ
図 5.3-5 フローチャート:アプリの更新&起動までの流れ
Open 棟梁の通信制御機能を用いた 3 層化の処理方式では、汎用 Web サービス インターフェイスと Web サービス クライアント プロキシを利用したオブジェクトのバイナリ転送を採用しているため、クライアント側とサーバ側のランタイムが等しい必要があります。.NET とランタイムの異なる Silverlight と通信を行う場合は、汎用 DTO を使用します。
汎用 DTO は、DataSet、DataTable クラスのオブジェクト モデル・データ構造を模倣し、データを文字列にマーシャリングする機能と行の変更ステータス (DataRowState) [5] に対応したカスタム クラスで、低レベルなステートメント・クラスで実装されているため Silverlight でも利用できます (Windows CE や Java にも移植可能)。
表 (テーブル) に相当するものとして DTTble クラスを使用します (関連クラス:DTColumn 列、DTRow 行)。
図 6.1 DTTble の生成・定義・操作
-
DTTble.AcceptChangesメソッド:DTTble への変更をコミットし、変更ステータスをDataRowState.Unchangedにリセットする (実行前はDataRowState.Added)。 -
DTTble.Rows.ToDataSourceメソッド:データ バインディング先 (ItemsSource) に、変更ステータスがDataRowState.Deletedの行を除いた DTRows コレクションを返す。
-
マーシャル操作 (
DTTbles.Saveメソッド):StringWriter と DTTbles コレクションを使用して DTTbles コレクションを文字列に変換する。(図6.2-1) -
アンマーシャル操作 (
DTTbles.Loadメソッド):StringReader と DTTbles コレクションを使用して文字列を DTTbles コレクションに変換する。(図6.2-2)
.NET 用の DTTble クラスには、相互変換メソッドも用意されています。
-
DTTble.ToDataTable():DTTble → DataTable へ変換 (DataRowState は復元できない)。Windows Forms の DataGrid などにデータ バインディングする場合に利用する。 -
DTTble.FromDataTable():DataTable → DTTble へ変換 (DataRowState を復元する)。.NET のサーバ側から Silverlight などに表データを返す場合に利用する。
行 (ロウ) の生成は DTTble.Rows プロパティの AddNew メソッドを使用します。DTRow への操作はデータ バインディングした UI コントロールから、またはインデクサ (インデックス、名前) を使用したアクセスで可能です (更新操作を行うと変更ステータスが DataRowState.Modified になる)。削除操作は DTRows.Delete メソッドで変更ステータスを DataRowState.Deleted に変更します(図6.3-1:論理削除)。変更ステータスの確認は DTTble.GetChanges メソッドや DTRows.Find メソッドで変更行の DTRows コレクションを一度に取得できます(図6.3-2)。
- リッチクライアントの P層イベント処理機能が対応するコントロール イベント (5 つ)。
- データ プロバイダのコネクション プーリング機能。
- カンマ区切りで起動チェック EXE、起動 EXE を指定する。
- .NET でデータ移送処理の実装で慣例的に利用される。
- 行の変更ステータス (DataRowState)。
-以上-