2015年01月14日

Android対応MessageDlgメモ2

MessageDlgを非ブロッキング版で実装する面倒な処理メモ2(C++BuilderXE7)

今回は、MessageDlgを連続で出す方法を考察

前回の方法からさらに汎用化を進めて無名メソッドを外に出してみます。
外に出すことにより、前回の様なIDEのイベントハンドラに関するエラーの回避できます。
今回はコンストラクタで 「複数のインスタンス判別用にStatus」を、「イベント発生用にTNotifyEvent」をもらうようにしました。
//---------------------------------------------------------------------------
// 無名メソッド(MessageDlg用)
class TMessageDlgProc: public TCppInterfacedObject<TInputCloseDialogProc> {
  private:
    TNotifyEvent FEvent;
    UnicodeString FStatus;
    TModalResult FResult;
  protected:
  public:
    __fastcall TMessageDlgProc( UnicodeString AStatus, TNotifyEvent AEvent ) {
      FStatus = AStatus;
      FEvent = AEvent;
    }
    void __fastcall Invoke(const System::Uitypes::TModalResult AResult) {
      FResult = AResult;
      if( FEvent != NULL ) {
        FEvent(this);
      }
    }
    __property TModalResult Result = { read=FResult, write=FResult };
    __property UnicodeString Status = { read=FStatus, write=FStatus };
};

そして今回も、同じイベントを何度もコールさせて状況により処理分けしています。
以下は最大で3回のMessageDlgを出しています。
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  // 非ブロッキング入力BOX
  // Senderをダウンキャストで無名メソッドかを判断する
  TMessageDlgProc *proc = dynamic_cast<TMessageDlgProc *>(Sender);
  if( proc == NULL ) {
    // [1]
    MessageDlg( L"よろしいですか1?", TMsgDlgType::mtConfirmation, TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo, 0, new TMessageDlgProc(L"Status1", Button3Click) );
    return;
  }

  if( proc->Status == L"Status1" ) {
    if( proc->Result == mrYes ) {
      // [2]
      MessageDlg( L"よろしいですか2?", TMsgDlgType::mtConfirmation, TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo, 0, new TMessageDlgProc(L"Status2", Button3Click) );
    }
    else {
      ShowMessage(L"YESx0");
    }
  }
  else if( proc->Status == L"Status2" ) {
    if( proc->Result == mrYes ) {
      // [3]
      MessageDlg( L"よろしいですか3?", TMsgDlgType::mtConfirmation, TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo, 0, new TMessageDlgProc(L"Status3", Button3Click) );
    }
    else {
      ShowMessage(L"YESx1");
    }
  }
  else if( proc->Status == L"Status3" ) {
    if( proc->Result == mrYes ) {
      ShowMessage(L"YESx3");
    }
    else {
      ShowMessage(L"YESx2");
    }
  }
  else {
  }
}
posted by sanahi at 04:18| 滋賀 ☀| Comment(0) | TrackBack(0) | C++Builder | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

Remarks
記事中にソースコードが含まれる場合、ソースコードの再利用、改変、「オレのものにする」等は自由ですが、
ソースコードを利用して起こった問題は一切責任を負いません。(自己責任での利用となります。)
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。