# アラーム発生時に自動画面切り替えを行う

マニュアル > カスタマイズガイド > アラーム > # アラーム発生時に自動画面切り替えを行う |

概要

アラームコントロール（リモートアラームクライアント、リモートアラームグリッド）は、アラームの発生、復帰などのイベントを、OnAlarmNotificationイベントで受け取ることができます。クライアント側でスクリプトを記述して、このイベントでアラームの発生を受け取り、目的のフォームをOpenFormで開くようにしてやる事で、アラーム発生時に自動的に画面を切り替えることができます。

また、各アラームが発生した時の切り替え先画面のフォーム名は、アラームマスタのコメント列に含めておきます。OnAlarmNotificationイベントでは、発生したアラームのコメントを受け取ることができるため、受け取ったコメントからフォーム名を取り出してOpenFormメソッドの引数に引き渡すことで、発生したアラームに対応した画面を呼び出すという一連の処理の流れをつなげることができます。

| 自動画面切り替えを行うには、どの画面が表示された状態であってもアラームの状態を監視する必要があります。このような場合、アラームコントロールをバックグラウンドフォームに張り付けて動作させる方法が有効です。バックグラウンドフォームに関する詳細は、「バックグラウンドフォーム」を参照してください。

カスタマイズ例

１）アラームマスタの設定

アラームマスタにコメント列を追加し、アラーム時の表示先フォーム名を設定しておきます。

アラームＩＤ,発生復帰,確認,発生条件,コメント0 [ALARMID],[RECOVER],[ACK],[ONCONDITION],[CM0] 0,y,y,U01.F01.M0000,Form01 1,y,y,U01.F01.M0001,Form01 2,y,y,U01.F01.M0002,Form02 3,y,y,U01.F01.M0003,Form02 4,y,y,U01.F01.M0004,Form03

上記の例では、コメント列[CM0]にフォーム名を設定しています。

２）バックグラウンドフォームにリモートアラームクライアントを張り付ける

どのフォームが表示されている状態でも常にアラームの状態を監視するために、バックグラウンドフォームを利用します。バックグラウンドフォームは画面上には表示されず、常に裏で動作している特別なフォームです。

そして、バックグラウンドフォームとして動作させるフォームに、リモートアラームクライアントコントロールを貼り付けて利用します。バックグラウンドフォームが常駐することにより、リモートアラームクライアントコントロールを常に動作させておくことができます。

リモートアラームクライアントの初期化処理を記述します。

ここでは、OnLoginイベントに記述します。

リモートアラームクライアントの初期化スクリプト例）

    event OnLogin(login,level)
    {
    	if(login == F) {
    		return;
    	}
    	this.Connect();
    	this.SubscribeSummary("");
    }

３）画面表示切替処理の実装例１

リモートアラームクライアントのOnAlarmNotificationイベントに、アラームが発生した際に対象のアラームのコメント０に設定されたフォームを自動的に表示する処理を実装します。アラームが発生すると、OnAlarmNotificationイベントが発生します。Typeはアラームの状態、Commentsはアラームのコメントが配列で格納されます。Typeが”new”の場合のみ、OpenFormメソッドで画面の表示切り替えを行います。そのため、アラームが復帰、確認、状態が変化した場合は表示切り替えを行いません。

リモートアラームクライアントのスクリプト例）

    event OnAlarmNotification(Type,Date,AlarmId,bRecovered,bAcked,Comments)
    {
    	if(Type == "new") {
    		var vFormName = Comments[0];
    		::OpenForm(vFormName);
    	}
    }

４）画面表示切替処理の実装例２

上記の例を拡張して、画面初期表示時には画面切り替えを行わないようにする例を紹介します。

すでにアラームが発生している状態でクライアント画面を立ち上げた場合、発生中のアラームが立ち上げ直後に検出される事により画面切替が発生します。この挙動を回避する一つの方法として、OnAlarmNotificationDoneイベントを利用することで起動直後の自動画面切り替えを防ぐことができます。

OnAlarmNotificationDoneはアラームの通知終了を監視しており、アラームの通知が終了したタイミングでイベントが発生します。

この仕組みを利用し、このイベントが初回に発生したことを判別するフラグ値を変数に格納し、このフラグが立った以降のみ画面の切り替えを行うようにします。

リモートアラームクライアントのスクリプト例）

    var mvNotificationDoneFlag = F;

    event OnLogin(login,level)
    {
    	if(login == F) {
    		return;
    	}
    	this.Connect();
    	this.SubscribeSummary("");
    }

    event OnAlarmNotification(Type,Date,AlarmId,bRecovered,bAcked,Comments)
    {
    	if(mvNotificationDoneFlag == F) {
    		return;
    	}

    	if(Type == "new") {
    		var vFormName = Comments[0];
    		::OpenForm(vFormName);
    	}
    }

    event OnAlarmNotificationDone(bComplete,ShowRecordCnt,SearchRecordCnt,ActualShowRecordCnt,ActualSearchRecordCnt,LastRecordDate)
    {
    	mvNotificationDoneFlag = T;
    }

| 大量のアラームが同時に発生した場合、画面遷移が頻繁に行われてしまいます。この現象を回避するためには、タイマーイベントなどを使用して、一定期間内で１度にアラームが発生しても、最後に発生したアラームの画面にのみ画面遷移を行うようにする等の工夫が必要です。

| 上記のスクリプトの例ではOnAlarmNotificationDoneイベントをSubscribeSummaryより呼び出していますが、本来、OnAlarmNotificationDoneはSubscribeHistoricalから呼び出すイベントです。SubscribeSummaryから呼び出した場合、イベントのパラメータであるShowRecordCnt等の内容は不定であり、利用できない値である点に注意してください（※この例ではアラーム通知の終了を取得することを目的としてOnAlarmNotificationDoneを利用しており、特に問題は発生しません）。