全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2451
推到 Plurk!
推到 Facebook!

關於 MessageBox 的問題

尚未結案
Jack222
一般會員


發表:9
回覆:8
積分:3
註冊:2004-11-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-24 19:42:35 IP:61.222.xxx.xxx 未訂閱
小弟我想顯示一個沒有 Parent 的 MessageBox, 如 MessageBox( NULL, "Content", "Caption", MB_OK), 但若是想把 "OK" 鈕換成 "Cancel" 鈕, 請問可以做的到嗎? 我也試過用 MessageDlg("Content", mtInformation, TMsgDlgButtons() << mbCancel, 0), 但它還是隸屬於 Application, 而不是獨立的; 或者是另外設計一個 Dialog, 但使其自己 Run 起來, 而不是呼叫 ShowModal() 後, 一定要做出回應, Application 才會繼續 Run 下去, 這該如何做到呢? Thanks ~
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-24 23:38:10 IP:61.64.xxx.xxx 未訂閱
用 Show() 不要用 ShowModal() 把 "OK" 鈕換成 "Cancel" 鈕 應該是做不到,MessageBox 的參數設定裡 本來就沒有只有一顆 Cancel 鈕的設定
pika2005
初階會員


發表:27
回覆:48
積分:25
註冊:2005-02-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-25 02:47:45 IP:218.162.xxx.xxx 未訂閱
引言: 小弟我想顯示一個沒有 Parent 的 MessageBox, 如 MessageBox( NULL, "Content", "Caption", MB_OK), 但若是想把 "OK" 鈕換成 "Cancel" 鈕, 請問可以做的到嗎? 我也試過用 MessageDlg("Content", mtInformation, TMsgDlgButtons() << mbCancel, 0), 但它還是隸屬於 Application, 而不是獨立的; 或者是另外設計一個 Dialog, 但使其自己 Run 起來, 而不是呼叫 ShowModal() 後, 一定要做出回應, Application 才會繼續 Run 下去, 這該如何做到呢? Thanks ~
Jack222您好,按下Button會出現這訊息..不知道這個行不行.. 我有些部分程式參考timhuang這篇.. http://delphi.ktop.com.tw/topic.php?topic_id=28515 Timer1的Enable預設為false..Interval為1000
TForm *f1;
TButton *b1;
TLabel *l1;    void __fastcall MyShowmessage(const String msg,int fontsize)
{
  f1 = new TForm(Form1);
  b1 = new TButton(f1);
  l1 = new TLabel(f1);      l1->Font->Size = fontsize;
  l1->Caption = msg;
  l1->Top = 20;
  l1->Font->Color = clGreen;
  l1->Left = 20;
  l1->Parent = f1;
  l1->Width=300;      f1->Width = 300;
  f1->Height = 150;
  f1->Top = Screen->Height / 2 - f1->Height / 2;
  f1->Left = Screen->Width / 2 - f1->Width / 2;
  f1->BorderStyle = bsDialog;
  f1->BorderIcons<Caption = "結果";      b1->Parent = f1;
  b1->Top = 60;
  b1->Left = 100;
  b1->Caption = "Cancel";
  b1->ModalResult= mrCancel;      f1->Show();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     MyShowmessage("您好,此訊息一秒後,自動關掉",10);
     Timer1->Enabled = true;
}    void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
         f1->Free();
         Timer1->Enabled = false;
}
發表人 - pika2005 於 2005/03/25 02:49:28
Jack222
一般會員


發表:9
回覆:8
積分:3
註冊:2004-11-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-25 10:46:18 IP:61.222.xxx.xxx 未訂閱
感謝指教, 發問之前小弟也有查到 28515 這一篇. 我想問題的癥結是 MessageBox or Dialog 要能真正與 Application 分開 Run, 也就是當 MessageBox or Dialog 秀出來的時候, 在工作列上, 應該會看到兩個應用程式(或最小化的圖示). 我目前的做法是, Create a Thread 來呼叫 MessageBox(NULL, ...), 當 User 按 "Cancel" 鈕時, 透過改變一個 Global Variable, 可停止 Application 正在進行的動作, 但無奈的是 MessageBox 不支援只放一個 "Cancel" button, 現在多了一顆 "OK" button, 真的是有點奇怪, 所以又試了 MessageDlg 和自己做 Dialog 再 ShowModal(), 結果也是會"黏"在 Application 上, 若是用 Show() 的話, 其與 ShowModal() 的主要差別在於不暫停 Application 和等待 User 的回應, 但它還是會等 Application Run 完, 才能接受 User 的回應, 如此一來, 便無法達成可讓 User 臨時中止的功能.
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-25 11:38:08 IP:60.248.xxx.xxx 未訂閱
改成這樣子做呢? 把 Application.Handle 給那個 MessageBox 然後,你按下 [Cancel] 的時候 MessageBox 就 PostMessage 給 Application.Handle Application 這邊呢,只要在 Form 上放一個 ApplicationEvents 就可以在 OnMessage 事件裡,接到那個 Message 就可以在那個事件裡,做你想做的事 如果是要打斷你正要做的事情的話 在做事的那段程式碼裡,最好有定期去檢查旗標或者是類似中止條件的動作
Jack222
一般會員


發表:9
回覆:8
積分:3
註冊:2004-11-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-25 15:13:40 IP:61.222.xxx.xxx 未訂閱
謝謝建議, 大概知道你的意思, 我已經有做出中止的機制, 其動作大致如下: 主程式 Create 一個 Thread 後, 繼續去做許多次相同的事, 每做一次就會去判斷某一變數, 看是否要中止執行, 而這個變數可被 Thread 更改, Thread 起來時, 會 Call if(MessageBox(NULL, ... ,MB_OKCANCEL|MB_DEFBUTTON2) == IDCANCEL), 若成立則更改那個變數, 這是可以 Work 的 (但我不想要 "OK" button), 因為 User 可以不必等主程式跑完就能自由切換到這個 MessageBox 並做出回應 (Click "Cancel" button), 就好像 Modeless 的 Dialog 一樣. 若使用 BCB 提供的 MessageBox routines 或自己做 Dialog, 還是無法模擬出 Win32 API MessageBox 的行為, 因為 User 雖然"看"的到, 但卻"按"不到 (Parent-Child 的關係), 直到主程式 Run 完, 把 CPU Resource 交出來後, User 才可以按 "Cancel" button.
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-25 15:52:44 IP:60.248.xxx.xxx 未訂閱
那,如果是另外建一個 Form Style 選成 Dialog 然後用 Show 就行了吧 這樣應該就可以了 對了,你說的那種不能按鈕的情形 可能是因為你的程式已經把整個動作卡死了 所以,沒有辦法再去對畫面 VCL 進行處理 你就在你檢查停止條件那裡 再加上一行 Application->ProcessMessages() 去處理一下畫面就行了 再試試看吧
Jack222
一般會員


發表:9
回覆:8
積分:3
註冊:2004-11-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-25 16:16:33 IP:61.222.xxx.xxx 未訂閱
Thanks~ 這一招可以, 但若再加上 Delay, 則更可以看到 "Cancel" button 被按下的情形: ULONG DelayTime = GetTickCount() plus 100; while(GetTickCount() < DelayTime) Application->ProcessMessages();
系統時間:2024-05-15 4:22:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!