前のページ次のページ上に戻るホーム SophiaFramework 2.2

10.10. ダイアログ

ダイアログはユーザーへの警告やメッセージを表示するために 使用します。 ダイアログの生成方法や使用方法は ウィンドウの場合とほとんど同じですが、警告ダイアログや選択 ダイアログなど生成するだけですぐに使えるように実装されています。

10.10.1. ダイアログの生成

ダイアログを表示するには生成したいダイアログのインスタンスを new 演算子で生成します。

以下に警告ダイアログを表示するサンプル コードを示します。

SFMTYPEDEFCLASS(Demo)
class Demo : public SFRApplication {
  public:
    static inline SFCInvokerPtr Constructor(Void)
    {
      return(new Demo());
    }
	
  private:
    inline Demo(Void)
    {
      SFRDialogPtr   dialog;

      if (Exception() == NO_ERROR) {
        dialog = new SFRAlertDialog(this, SFURect(10, 10, 100, 100), "Alert", "Warning !", "OK", SFUSize(50, 18));
        if (dialog != NULL) {
          if (Exception(dialog->Exception()) != NO_ERROR) {
            delete dialog;
          }
        }
        else {
          Exception(ENOMEMORY);
        }
      }
      return;
    }
	
    virtual inline ~Demo(Void)
    {
      return;
    }
};

10.10.2. イベントの処理

上記コードでは警告ダイアログが表示され、OK ボタンが押されるか クリア キーが押されるとダイアログが閉じるというデフォルトの動作をします。 ダイアログの動作をカスタマイズするには、SREVT_DIALOG イベントを 受け取るハンドラを登録します。以下にサンプル コードを示します。

SFMTYPEDEFCLASS(Demo)
class Demo : public SFRApplication {
  public:
    static inline SFCInvokerPtr Constructor(Void)
    {
      return(new Demo());
    }
	
  private:
    inline Demo(Void)
    {
      SFRDialogPtr   dialog;

      if (Exception() == NO_ERROR) {
        dialog = new SFRAlertDialog(this, SFURect(10, 10, 100, 100), "Alert", "Warning !", "OK", SFUSize(50, 18));
        if (dialog != NULL) {
          if (Exception(dialog->Exception()) == NO_ERROR) {
            Exception(dialog->RegisterHandler(srevt_dialog, HANDLER_BEFORE, Dialog_static, this));
          }
          else {
            delete dialog;
          }
        }
        else {
          Exception(ENOMEMORY);
        }
      }
      return;
    }
	
    virtual inline ~Demo(Void)
    {
      return;
    }
	
    static inline Bool Dialog_static(ConstSFUEventRef event, VoidPtr responder)
    {
      DemoPtr(responder)->Dialog_handler(event.p16(), SFRAlertDialogPtr(event.p32()));
      return(TRUE);
    }
	
    inline Void Dialog_handler(UInt16 status, SFRAlertDialogPtr dialog)
    {
      switch (status) {
        case SRP16_ESCAPE:
          // something to do
          break;
        case SRP16_OK:
          // something to do
          break;
      }
      dialog->DialogHandler();
      // 以下の方法でも良いです。
      //dialog->Invoke(SFUEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, TRUE));
      return;
    }
};

上記コードではダイアログの OK ボタンが押されたときもしくはクリア キーに よりダイアログがエスケープされたときに Dialog_handler 関数が 呼び出されます。Dialog_handler 関数にはどのような理由で呼び出されたかの パラメータとオブジェクトのポインタが渡されますので、それを 利用して処理を行います。

OK ボタンが押されたときは SRP16_OK が、クリア キーが押されたときは SRP16_ESCAPE が上記サンプル コードの変数 status に渡されます。

また、ハンドラを登録したときにダイアログのデフォルト動作を オーバーライトしているので、明示的にダイアログを破棄しなければ ダイアログが閉じません。

破棄する方法はレスポンダのそれと同じですが、方法が2通りあります。 一つは、ダイアログのデフォルト ハンドラを呼び出す方法。もう一つは、 SREVT_RESPONDER_TERMINATE イベントをダイアログに送信する方法です。

10.10.3. ダイアログの種類

ダイアログは標準で2種類定義されています。 SFRAlertDialogSFRAskDialog です。 それぞれのダイアログは継承して使用することはできません。 独自のダイアログを定義する場合は SFRDialog から継承したクラスを作成します。