1. 程式人生 > >C#裡面MessageBox不能亂用,阻塞和非阻塞,模態對話方塊和非模態

C#裡面MessageBox不能亂用,阻塞和非阻塞,模態對話方塊和非模態

我一開始以為這個MessageBox跟Delphi裡面的ShowMessage是一樣的,程式裡可以隨便放,因為C#裡面就TM這一個封裝好的彈出對話方塊提示訊息函式,可以直接用的。


結果實習做程式測試被坑爹了,發現我錯了,C#這個MessageBox預設是模態對話方塊,是阻塞的,也就是說你不區點選okNOCancel他一直顯示在那裡程式裡後面的程式碼是停止的不往後執行,但是主程式仍然會響應其他訊息,比如Timer事件,造成時序邏輯混亂。

原來隨手寫的是這樣:

private void ReadOTPDataHandle()
        {
            if (xxxxxx)  //若命令字和地址都正確
            {
                xxxxxxxxxxxx;
            }
            else
            {
		MessageBox.Show("ERROR: communication data verify error!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cmdptr = 0; 
                mode = 4;
                comok = 100; 
                Btype = Type.Bu_no_type;
            }
        }


</pre><p></p><pre>

正確的寫法應該是把MessageBox放在程式段的最後,這樣:

private void ReadOTPDataHandle()
        {
            if (xxxxxx)  //若命令字和地址都正確
            {
                xxxxxxxxxxxx;
            }
            else
            {
                cmdptr = 0; 
                mode = 4;
                comok = 100; 
                Btype = Type.Bu_no_type;
                MessageBox.Show("ERROR: communication data verify error!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


就是下面兩圖的差別:


-------------

但是最後,那如果是普通的MessageBox.Show("asdfadsfasdf!"),這種不帶圖示和YesNo返回的,有沒有問題呢?是不是就跟Delphi裡面的ShowMessage一樣了非模態可以任意彈出不用去處理?