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 | このブログの読者になる | 更新情報をチェックする

2015年01月06日

Android対応MessageDlgメモ

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

通常はこんな感じだろうか?
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  // 無名メソッド(anonymous method)
  class TLocalProc: public TCppInterfacedObject<TInputCloseDialogProc> {
    private:
    public:
      void __fastcall Invoke(const System::Uitypes::TModalResult AResult) {
        if( AResult == mrYes ) {
          ShowMessage(L"YES!!");
        }
        else {
          ShowMessage(L"NO!!");
        }
      }
  };
  // 非ブロッキングMessageDlg
  MessageDlg( L"よろしいですか?", TMsgDlgType::mtConfirmation, TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo, 0, new TLocalProc() );
}

さらに一歩進めて無名メソッド内の処理を外に出した(風に)してみた
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  // 無名メソッド(anonymous method)
  class TLocalProc: public TCppInterfacedObject<TInputCloseDialogProc> {
    private:
    public:
      TForm1 *FOwner;
      TModalResult FResult;
      __fastcall TLocalProc( TForm1 *AOwner ) {
        FOwner = AOwner;
      }
      void __fastcall Invoke(const System::Uitypes::TModalResult AResult) {
        // 結果を保持して自分を渡した同じイベントを呼ぶ
        FResult = AResult;
        FOwner->Button2Click(this); // --> [2]が実行される
      }
  };
  // 非ブロッキングMessageDlg
  // Senderをダウンキャストで無名メソッドかを判断する
  TLocalProc *proc = dynamic_cast<TLocalProc *>(Sender);
  if( proc == NULL ) {
    // [1]
    MessageDlg( L"よろしいですか?", TMsgDlgType::mtConfirmation, TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo, 0, new TLocalProc(this) );
  }
  else {
    // [2]
    if( proc->FResult == mrYes ) {
      ShowMessage(L"YES!!");
    }
    else {
      ShowMessage(L"NO!!");
    }
  }
}

そして無名メソッド使うとこんなエラーがでて、イベントハンドラに飛べなくなります。。。
xe7_無名メソッドバグ.jpg
__fastcall行でIDEの挙動が怪しくなるようです
IDEのバグだとおもうのですが。。。
QC調べようにもどんなspellで検索すればいいのか分からない

いろいろ面倒過ぎるwww
posted by sanahi at 01:50| 滋賀 ☁| Comment(0) | TrackBack(0) | C++Builder | このブログの読者になる | 更新情報をチェックする

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