基本仕様 第 8 章 前の章 次の章

VB C# ALL プログラミング言語によるフィルタ (ここで選んだ言語で選別された説明や図だけが表示されます)

8. メッセージのカスタマイズ

MANDALA.net を使用して作成したアプリケーションにおいては、実行時にデフォルトで様々な標準メッセージが表示されます。 たとえば、アプリケーションを終了する場合には、確認のためのダイアログボックスが表示されます。

これらは、いわばお仕着せのメッセージですから、その内容を変更したり、まったく表示されないように抑止したりしたい場合もあることでしょう。 MANDALA.net では、こういったメッセージのカスタマイズが簡単に行えるようになっています。

カスタマイズには、次の二つの方法のどちらかを用いることができますが、後者の方法をお勧めしています。

この章には、メッセージのカスタマイズについて、以下の順に記述してあります。

8.1 クラスモジュールの直接変更によるカスタマイズ

8.2 サブクラスの作成によるカスタマイズ

8.3 標準メッセージ一覧


8.1 クラスモジュールの直接変更によるカスタマイズ

メッセージのカスタマイズを実施するには、クラスモジュール Ae_MsgL9.vb に対して以下のような変更作業を行ってください。

メッセージのカスタマイズを実施するには、クラスモジュール Ae_MsgL9.cs に対して以下のような変更作業を行ってください。

メッセージのカスタマイズを実施するには、クラスモジュール Ae_MsgL9.java に対して以下のような変更作業を行ってください。

まず、カスタマイズ作業の第 1 ステップとして、クラスモジュール Ae_MsgL9.vb の名前を変更して、カスタマイズ版のクラスモジュールを作成してください。蛇足ながら、名前を変更するには、Visual Studio 統合開発環境でこのクラスモジュールを表示してから、ファイル(F) とメニュータイトルを開いて、名前を付けて Ae_MsgL9.vb を保存(A)... という操作を行ってください。

まず、カスタマイズ作業の第 1 ステップとして、クラスモジュール Ae_MsgL9.cs の名前を変更して、カスタマイズ版のクラスモジュールを作成してください。蛇足ながら、名前を変更するには、Visual Studio 統合開発環境でこのクラスモジュールを表示してから、ファイル(F) とメニュータイトルを開いて、名前を付けて Ae_MsgL9.cs を保存(A)... という操作を行ってください。

まず、カスタマイズ作業の第 1 ステップとして、クラスモジュール Ae_MsgL9.java の名前を変更して、 カスタマイズ版のクラスモジュールを作成してください。 蛇足ながら、名前を変更するには、eclipse 統合開発環境でこのクラスモジュールを表示してから、ファイル(F) とメニュータイトルを開いて、別名保管(A)... という操作を行ってください。

次に、カスタマイズ作業の第 2 ステップとして、メソッド AE_MsgLibrary の中の目指すメッセージコードに関するプログラムコードを変更してください。

たとえば、メッセージコード "APPEND" および "APPENDC" のメッセージに対して、次のようにメッセージの表示を抑止したり、メッセージの内容を変更したりする場合を考えてみましょう。

このようにするには、次のようにプログラムコードを変更してください。

    Case "APPEND" ' Updated
    Case "APPENDC" ' Updated
        If fB.MessageBoxShow(fB.myForm, "貸出し業務に移行します。", fB.MyTitle, _
        MessageBoxButtons.OKCancel, MessageBoxIcon.Information) _
        <> DialogResult.OK Then Return True ' Updated
    case "APPEND": // Updated
        break;
    case "APPENDC": // Updated
        if( fB.MessageBoxShow(fB.myForm, "貸出し業務に移行します。", fB.MyTitle, 
        MessageBoxButtons.OKCancel, MessageBoxIcon.Information) 
        != DialogResult.OK ) return true; // Updated
        break;
    if (uc_msgCode.equals("APPEND")) { // Updated
    }
    else if (uc_msgCode.equals("APPENDC")) { // Updated
        if( fB.MessageBoxShow(fB.myForm, "貸出し業務に移行します。", fB.MyTitle, 
        MessageBoxButtons.OKCancel, MessageBoxIcon.Information) 
        != DialogResult.OK ) return true; // Updated
        break;
    }

コードの変更に際しては、 Original という (変更前のステートメントであることを示す) 文字列を Updated という文字列に置き換えておくことをお勧めいたします。 こうすることで変更箇所を明示することができます。

上記の第 1 ステップと第 2 ステップのカスタマイズ作業によって、MANDALA.net の標準メッセージの変更作業ができたことになります。そして、この変更作業の後に、カスタマイズされたクラスモジュールを配布して、旧版原本のクラスモジュール Ae_MsgL9.vb の代わりに、新版クラスモジュールを組み込めば、カスタマイズされたメッセージが有効になります。なお、このカスタマイズ作業は、各開発プロジェクトの標準化作業の一環として、開発プロジェクトの共通作業に責任をもつチームが行うのがよいでしょう。

上記の第 1 ステップと第 2 ステップのカスタマイズ作業によって、MANDALA.net の標準メッセージの変更作業ができたことになります。そして、この変更作業の後に、カスタマイズされたクラスモジュールを配布して、旧版原本のクラスモジュール Ae_MsgL9.cs の代わりに、新版クラスモジュールを組み込めば、カスタマイズされたメッセージが有効になります。なお、このカスタマイズ作業は、各開発プロジェクトの標準化作業の一環として、開発プロジェクトの共通作業に責任をもつチームが行うのがよいでしょう。

上記の第 1 ステップと第 2 ステップのカスタマイズ作業によって、MANDALA.net の標準メッセージの変更作業ができたことになります。そして、この変更作業の後に、カスタマイズされたクラスモジュールを配布して、旧版原本のクラスモジュール Ae_MsgL9.java の代わりに、新版クラスモジュールを組み込めば、カスタマイズされたメッセージが有効になります。なお、このカスタマイズ作業は、各開発プロジェクトの標準化作業の一環として、開発プロジェクトの共通作業に責任をもつチームが行うのがよいでしょう。

ここでご注意ですが、メソッド AE_MsgLibrary の中のステートメントを直接的に変更すると、どこを変更したのか分かりにくくなります。また MANDALA.net のレベルアップの際に、メソッド AE_MsgLibrary の内容が変更されることがありますが、こんな場合にはその度に同じ変更を繰り返すことが必要になり、混乱が発生しかねません。

8.2 サブクラスの作成によるカスタマイズ

メッセージのカスタマイズをスマートに行うには、以下のようにクラス Ae_MsgL0 のサブクラスとなるクラスモジュールを作成してプロジェクトに組み込んで、 このサブクラスの中でメッセージを変更するのがよいでしょう。 なお、このようにした場合には、コード合成ツールによる再合成が必要です。

サブクラスを作成することによって、メッセージをカスタマイズすることにすれば、 たとえメソッド AE_MsgLibrary の内容が変更されても混乱に陥ることはないでしょう。 また、どこをどう変更したのか明確になります。

サブクラスのクラス名は、以下では Ae_MsgLxx としていますが、この名前は適当につけてください。 ただし、Ae_MsgL0 のサブクラスですから、Ae_MsgL0 を継承することが必要です。 それから、このサブクラスには AppliTech.WorkFrame.FormBase のインスタンスをパラメタとするコンストラクタが必要です。 なお、このコンストラクタの先頭では親クラス Ae_MsgL0 のコンストラクタを呼び出してください。

このようにして作成したサブクラスの中に、メソッド AE_MsgLibrary をオーバライドして、その中にカスタマイズコードを含めてください。 上記の例と同様にカスタマイズするのは、以下のようにすればよいでしょう。 なお、カスタマイズの対象にしないメッセージコードについては、親クラス Ae_MsgL0 の AE_MsgLibrary を呼び出してください。

サブクラスは以上の説明のようにして作成できますが、以下のコードをコピーアンドペーストで貼り付けて、そのコードの一部を修正するのが簡便で実務的な作成方法です。

Friend Class Ae_MsgLxx : Inherits Ae_MsgL0

    Friend Sub New(ByVal pm_fB As AppliTech.WorkFrame.FormBase)
        MyBase.new(pm_fB)
    End Sub ' New

    Friend Overrides Function AE_MsgLibrary(ByVal fB As AppliTech.WorkFrame.FormBase, ByVal pm_MsgCode As String, ByVal pm_AdditionalMsg As String) As Boolean
        Select Case pm_MsgCode.ToUpper() ' Updated
            Case "APPEND" ' Updated
            Case "APPENDC" ' Updated
                If fB.MessageBoxShow(fB.myForm, "貸出し業務に移行します。", fB.MyTitle, _
                MessageBoxButtons.OKCancel, MessageBoxIcon.Information) _
                <> DialogResult.OK Then Return True ' Updated
            Case Else ' カスタマイズの対象外のメッセージコード
                Return MyBase.AE_MsgLibrary(fB, pm_MsgCode, pm_AdditionalMsg)
        End Select
    End Function ' AE_MsgLibrary

End Class ' Ae_MsgLxx
using System.Windows.Forms;

internal class Ae_MsgLxx : Ae_MsgL0 {
    internal Ae_MsgLxx( AppliTech.WorkFrame.FormBase pm_fB ) : base(pm_fB) {
    }
 
    internal new virtual bool AE_MsgLibrary( AppliTech.WorkFrame.FormBase fB, string pm_MsgCode, string pm_AdditionalMsg ) {
        switch( pm_MsgCode.ToUpper() ) { // Updated
            case "APPEND": // Updated
                break;
            case "APPENDC": // Updated
                if( fB.MessageBoxShow(fB.myForm, "貸出し業務に移行します。", fB.MyTitle, 
                MessageBoxButtons.OKCancel, MessageBoxIcon.Information) 
                != DialogResult.OK ) return true; // Updated
                break;
            default: // カスタマイズの対象外のメッセージコード
                return base.AE_MsgLibrary(fB, pm_MsgCode, pm_AdditionalMsg);
        }
        return false;
    } // AE_MsgLibrary

} // Ae_MsgLxx
import System.Windows.Forms;
import jp.applitech.workframe.FormBase;

class Ae_MsgLxx extends Ae_MsgL0 {
    Ae_MsgLxx( AppliTech.WorkFrame.FormBase pm_fB ) {
        super(pm_fB);
    }
 
    boolean AE_MsgLibrary( FormBase fB, String pm_MsgCode, String pm_AdditionalMsg ) {
        String uc_msgCode = pm_MsgCode.toUpperCase();
        if (uc_msgCode.equalse("APPEND")) { // Updated
        }
        else if (uc_msgCode.equals("APPENDC")) { // Updated
            if( fB.MessageBoxShow(fB.myForm, "貸出し業務に移行します。", fB.MyTitle, 
                MessageBoxButtons.OKCancel, MessageBoxIcon.Information) 
                != DialogResult.OK ) return true; // Updated
        }
        else { // カスタマイズの対象外のメッセージコード
            return base.AE_MsgLibrary(fB, pm_MsgCode, pm_AdditionalMsg);
        }
        return false;
    } // AE_MsgLibrary

} // Ae_MsgLxx

繰返しのご注意ですが、このようにサブクラスを作成してプロジェクトに組み込んだ後には、コード合成ツールによる再合成が必要です。

なお、ここでは、1 階層のサブクラスの例を示しましたが、複数のサブクラスを作成して多階層にすることもできます。

8.3 標準メッセージ一覧

ここには、メッセージをカスタマイズするときの参考になるように、MANDALA.net の標準メッセージに関する次の情報が一覧にしてあります。

それぞれのメッセージが表示される条件に関する説明を読むよりも、メッセージの内容を見る方が、どのような場合にそれぞれのメッセージが表示されるのかを直感的に理解できるかもしれません。

なお、以下の説明の 緑色の斜体 の部分は、その内容が状況によって変わる可変部分であることを示しています。

以下の表の中には、Xxxx 指示という言葉が出現します。 Xxxx 指示とは、アプリ操作者がボタン Cm_Xxxx をクリックすること、 またはメニュー項目 Mn_Xxxx をクリックすることか、 これに相当する操作 (対応するショートカットキーの押下) をすること、 または Xxxx に対応づけられたファンクションキーを押下することを意味します。
 たとえば、Hardcopy 指示とは、アプリ操作者がボタン Cm_Hardcopy をクリックすること、 またはメニュー項目 Mn_Hardcopy をクリックすることか、 これに相当する操作 (対応するショートカットキーの押下) をすること、 または Hardcopy に対応づけられたファンクションキーを押下することを意味します。

メッセージコード メッセージが表示される条件 (表示する目的) メッセージの内容 関連フックメソッド
"APPEND" 追加モードで Execute 指示がなされたとき (アプリ操作者からの指示を再確認するため) 伝票を発行します。 Append *1
"APPENDC" 更新モードにおいて、追加モードに移行させる指示 (AppendC 指示) がなされたとき (アプリ操作者からの指示を再確認するため) データエントリに移行します。 AppendChk  
"CANCEL" 開始画面の復元の指示 (Cancel 指示) 操作がなされたとき (アプリ操作者からの指示を再確認するため) 当初の画面データ復元の指示によって、この画面データに関する変更はなかったとみなされて、当初の状態に戻ります。    
"CLEARDE" ボディ部の途中に初期化された明細行 (インプットがなされていない明細行) があるときに、別の明細行を初期化する指示 (ClearDe 指示) がなされたとき (警告のため) ボディ部または拡張ボディ部に挿入されている初期化された明細行を削除してから、この操作を行ってください。    
"COMPLETEC" Execute 指示がなされたが、インプットの必要な項目 (またはエラー状態の項目) が残っているとき (警告のため) インプットの必要な項目が残っています。
または、エラーの項目かインプット途中の項目が残っています。
インプットを完結させてください。
Append
SelectExec
Update
 
"COPYDE", "COPYITEM" 前行複写の指示 (CopyDe 指示) または、前項目複写の指示 (CopyItem 指示) がなされたが、(先頭行なので) 前行がないか、または前行にデータがインプットされていないとき (警告のため) コピーすべき前行のデータが存在しません。    
"CURRENT" Current フックメソッドで、戻り値 0 を指定した直後 (警告のため) データが存在しません。 Current *2
"CURSOR" ボディ部の明細行のうち、まだインプット操作を許していない行に (マウスや Tab キーの操作で) カーソルを移動させようとしたとき (警告のため) この上に空白の明細行があるので、ここにデータをインプットすることはできません。
カーソルを元の位置に戻します。
   
"DELETECM" DeleteCm 指示がなされたとき (アプリ操作者からの指示を再確認するため) 伝票を削除します。 Delete  
"ENDCK" 画面へのインプットが途中の状態で EndCm 指示がなされたとき (アプリ操作者からの指示を再確認するため) 終了すると、インプット途中のデータが有効になりません。 Close
CloseBLcl
 
"ENDCM" 画面へのインプットが完結した状態で EndCm 指示がなされたとき (アプリ操作者からの指示を再確認するため) 終了します。 Close
CloseBLcl
 
"FIRSTC" First 指示がなされたとき (アプリ操作者からの指示を再確認するため) 先頭のレコードに移ります。 First  
"FIRSTCM" First フックメソッドで、戻り値 0 を指定した直後 (アプリ操作者からの指示を再確認するため) データが存在しません。 First
Prev
*3
"HARDCOPY" Hardcopy 指示がなされたとき (アプリ操作者からの指示を再確認するため) 画面のハードコピーを印刷します。    
"HARDCOPYERROR" Hardcopy の処理が異常終了したとき (警告のため) 印刷の準備がなされていません。(エラーの詳細説明)    
"HEADCOMPLETEC" ヘッド部のインプットが完結していないのに、カーソルをボディ部またはテール部に移動させようとしたとき (警告のため) ヘッド部のインプットを完結させてください。    
"INACTIVEDE" ボディ部の明細行のうち、まだインプット操作を許していない行にインプット操作をしようとしたとき (警告のため) ここにデータをインプットすることはできません。
矢印キー、またはマウス、シフト + Tab キーでカーソルを上に移動してください。
   
"INDICATE" 画面へのインプットが途中の状態で、表示モードへの移行の指示 (Indicate 指示) がなされたとき (アプリ操作者からの指示を再確認するため) 表示モードに変更してよいですか? (一部のデータをインプットしていても、なかったものとみなされます。) Indicate  
"INDICATEE" 表示モードで Execute 指示がなされたとき (アプリ操作者からの指示を再確認するため) この表示を終えてよいですか? IndicateExec  
"INSERTDE" 明細行の挿入の指示 (InsertDe 指示) がなされたけれども、ボディ部に明細が詰まっているために、挿入することができないとき (警告のため) ボディ部または拡張ボディ部に余裕がないために、この操作はできません。    
"LASTC" Last 指示がなされたとき (アプリ操作者からの指示を再確認するため) 最終のレコードに移ります。 Last  
"LASTCM" Last フックメソッドで、戻り値 0 を指定した直後 (アプリ操作者からの指示を再確認するため) データが存在しません。 Last
NextFh
*4
"NEXTC" NextCm 指示がなされたとき (アプリ操作者からの指示を再確認するため) 次のレコードに移ります。 NextFh  
"NEXTCM" NextFh フックメソッドで、戻り値 0 を指定した直後 (アプリ操作者からの指示を再確認するため) この後ろにデータはありません。 NextFh *5
"OUTPUTONLY" 表示項目に (マウスや Tab キーの操作で) カーソルを移動させようとしたとき (警告のため) この項目は出力専用ですから、データをインプットすることはできません。
矢印キー、またはマウス、Tab キーでカーソルを移動してください。
   
"PRECHECK1" 必須入力項目に何もインプットをせずに Enter キーを押下したとき (警告のため) この項目にはインプットが必要です。 Check
CheckLC
*6
"PRECHECK2" 総括表の P (PreCheck) 覧に F 指定をした項目に対して、フル桁インプットではなく、中途半端なインプットをしたとき (警告のため) この項目には左端から右端まで文字をインプットしてください。 Check
CheckLC
*7
"QUERYUNLOAD" アプリまたは画面に対して強制終了の指示がなされたとき (アプリ操作者からの指示を再確認するため) 画面のタイトル部の文字列で示されるアプリ が起動されています。
これを終了してから Windows を終了してください。
  *8
"PREVC" Prev 指示がなされたとき (アプリ操作者からの指示を再確認するため) 一つ前のレコードに移ります。 Prev  
"PREVCM" Prev フックメソッドで、戻り値 0 を指定した直後 (アプリ操作者からの指示を再確認するため) この前にデータはありません。 Prev *9
"RECALC" ヘッド部の項目が変更されたときに、ヘッド部の項目からボディ部の項目への派生関係があるので、ボディ部の項目の再計算やチェックを行った結果、ボディ部の項目がエラー状態になったとき (警告のため) ヘッド部またはテール部の項目を変更したため、ボディ部または拡張ボディ部の項目に エラー個数 個のエラーが検出されました。
カーソルをエラーの項目に移動して修正してください。
Check
CheckLC
 
"RELCHECK" 関係チェックを行うべき状況になったが、エラー状態の項目があるので、まずはエラー状態の項目を修正すべきとき (警告のため) この項目より先にデータエラーの項目を修正してください。 RelCheck
RelCheckLC
 
"SELECTCM" 画面へのインプットが途中の状態で、選択モードへの移行の指示 (SelectCm 指示) がなされたとき (アプリ操作者からの指示を再確認するため) 選択モードに変更してよいですか? (一部のデータをインプットしていても、なかったものとみなされます。) SelectFh  
"SELECTE" 選択モードで Execute 指示がなされたとき (アプリ操作者からの指示を再確認するため) 選択条件がインプットされました。 SelectExec *10
"UPDATE" 更新モードで何らかのインプットをしてから Execute 指示がなされたとき (アプリ操作者からの指示を再確認するため) 伝票を更新します。 Update *11
"UPDATE2" 更新モードで何もインプットせずに Execute 指示がなされたとき (アプリ操作者からの指示を再確認するため) 何もインプットされていませんが、伝票を更新しますか? Update  
"UPDATEC" 画面へのインプットが途中の状態で、更新モードへの移行の指示 (UpdateC 指示) がなされたとき (アプリ操作者からの指示を再確認するため) 更新モードに変更してよいですか? (一部のデータをインプットしていても、なかったものとみなされます。) UpdateChk  
"VERSIONERROR" 再合成が必要なアプリケーションが起動されたとき (アプリ操作者にアプリケーションプログラムの誤りを通知するため) バージョンレベルなどが異なるので、 プログラムの再合成が必要です。    
"CENTRALLOAD" メインフォームに対応するセントラル側のプログラムの開設に失敗したとき (アプリ操作者に異常状態の発生を通知するため) (ExceptionForm によって例外が知らされる)    
"CENTRALFORMLOAD" フォームに対応するセントラル側のプログラムの開設に失敗したとき (アプリ操作者に異常状態の発生を通知するため) (ExceptionForm によって例外が知らされる)    
(上記以外) 不正なメッセージコードが指定されたとき (プログラムの誤りを警告するため) アプリケーション開発時に実施したメッセージの変更に問題があります。
メッセージコード (メッセージコード) の受け口のプログラムがありません。
   

*1: メソッド AE_MsgLibrary の標準プログラムでは、Enter キーによる指示の場合に限ってメッセージを表示するようにしている。

*2: ボディ部の中に明細行が存在しない場合であってもエラー (データが存在しないというエラー) にしたくないときには、 次のようにメソッド AE_MsgLibrary の戻り値を True にしてください。

    Case "CURRENT" ' Updated
        Return True ' Updated
    case "CURRENT": // Updated
        return true; // Updated
    if (uc_msgCode.equals("CURRENT")) { // Updated
        return true; // Updated

*3: ボディ部の中に明細行が存在しない場合であってもエラー (データが存在しないというエラー) にしたくないときには、 次のようにメソッド AE_MsgLibrary の戻り値を True にしてください。

    Case "FIRSTCM" ' Updated
        Return True ' Updated
    case "FIRSTCM": // Updated
        return true; // Updated
    if (uc_msgCode.equals("FIRSTCM")) { // Updated
        return true; // Updated

*4: ボディ部の中に明細行が存在しない場合であってもエラー (データが存在しないというエラー) にしたくないときには、 次のようにメソッド AE_MsgLibrary の戻り値を True にしてください。

    Case "LASTCM" ' Updated
        Return True ' Updated
    case "LASTCM": // Updated
        return true; // Updated
    if (uc_msgCode.equals("LASTCM")) { // Updated
        return true; // Updated

*5: ボディ部の中に明細行が存在しない場合であってもエラー (データが存在しないというエラー) にしたくないときには、 次のようにメソッド AE_MsgLibrary の戻り値を True にしてください。

    Case "NEXTCM" ' Updated
        Return True ' Updated
    case "NEXTCM": // Updated
        return true // Updated
    if (uc_msgCode("NEXTCM")) { // Updated
        return true // Updated

*6: Check フックメソッドでチェックする指定をしていれば、 そこで指定したメッセージが表示されます。

*7: Check フックメソッドでチェックする指定をしていれば、 そこで指定したメッセージが表示されます。

*8: ここで、強制終了の指示とは、ウィンドウの左上端にアイコンがあればそれをダブルクリックするか、 またはウィンドウの右上端の 印の閉じるボタンをクリックすることなどを意味します。 また、Windows 系 OS に対して強制終了の指示を与えると、各アプリを強制終了することになりますから、この場合も強制終了の指示だとみなされます。

*9: ボディ部の中に明細行が存在しない場合であってもエラー (データが存在しないというエラー) にしたくないときには、 次のようにメソッド AE_MsgLibrary の戻り値を True にしてください。

    Case "PREVCM" ' Updated
        Return True ' Updated
    case "PREVCM": // Updated
        return true; // Updated
    if (uc_msgCode.equals("PREVCM")) { // Updated
        return true; // Updated

*10: ★これはコメントになっています★

*11: メソッド AE_MsgLibrary の標準プログラムでは、Enter キーによる指示の場合に限ってメッセージを表示するようにしている。