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

請教一些欄message的問題

答題得分者是:syntax
frist
一般會員


發表:7
回覆:5
積分:2
註冊:2006-10-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-22 09:48:42 IP:211.22.xxx.xxx 訂閱
在BCB中要如何欄到所有的訊息?

還有,有些訊息必須return值

可是我用像ApplicationEvents VCL中的OnMessage

是void型態的 怎麼回傳?

而且好像不是所有訊息都攔的到

請高手提示一下吧!!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-22 09:53:07 IP:61.64.xxx.xxx 訂閱
先去看書吧,書上有寫答案的問題

真的不適合提出來問,以免別人認為你連基本工都不做
frist
一般會員


發表:7
回覆:5
積分:2
註冊:2006-10-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-23 12:27:55 IP:211.22.xxx.xxx 訂閱
我想是我沒把問題說清楚

我舉例說明:

首先我想偵測使用者登出事件

然後ShowMessage 再登出

(在WM_QUERYENDSESSION訊息中 回傳true為登出 回傳false為不登出)

問題是 : 雖然有測得訊息但不管我回傳true或false 程式都不會登出



// 在test.h中
LRESULT __fastcall OnLogOff(TMessage &msg) ;
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_QUERYENDSESSION, TMessage , OnLogOff)
END_MESSAGE_MAP(TComponent)



// 在test.cpp中
LRESULT __fastcall TForm1::OnLogOff(TMessage &msg)
{
ShowMessage("TEST");
rerurn true;
}





編輯記錄
frist 重新編輯於 2007-05-23 12:37:40, 註解 無‧
frist 重新編輯於 2007-05-24 11:12:27, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-23 23:57:24 IP:61.64.xxx.xxx 訂閱
我想你還是有地方沒說清楚

不知道你如何觸發 WM_QUERYENDSESSION 這個訊息

If any application returns zero, the session is not ended. The system stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

只要其他程式發送 false 就會停止登出

同時我想,有時你吃掉了這個資訊,沒有讓他繼續下去,也可能是不會登出的原因

另外你對訊息,應該不是很瞭解吧 (因為你的錯誤原因是你對訊息的認知不甚正確,也許是你一時的誤認,但原因仍舊是這樣)

你 return 了什麼,你很清楚,但 你 return 給誰 ?作用是什麼?

你需要在去看一下訊息的相關文件,相信你有

看處理一個訊息時 return True 與 return False 的意義為何
而你所謂的 WM_QUERYENDSESSION 要 return True 要設定在哪裡
弄清楚後,就解決你的問題了

方便的話把你找到的答案貼上來吧
frist
一般會員


發表:7
回覆:5
積分:2
註冊:2006-10-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-28 11:44:43 IP:211.22.xxx.xxx 訂閱
 沒人回答  只好自救了  = ="

其實只差一行指令 Dispatch

// 在test.h中

public:

void __fastcall OnQK(TMessage &msg) ;
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_QUERYENDSESSION,TMessage,OnQK)
END_MESSAGE_MAP(TObject)

// 在test.cpp中

void __fastcall TForm1::OnQK(TMessage &msg)
{
int iReBtn = MessageDlg("要登出嗎?",mtWarning,TMsgDlgButtons() << mbYes << mbNo,0);

if (iReBtn == mrYes)
{
msg.Result = true;
}
else if (iReBtn == mrNo)
{
msg.Result = false;
}

Dispatch(&msg.Result);
}






syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-28 16:00:43 IP:61.64.xxx.xxx 訂閱
別要說的那麼可憐麼!
自己找到答案,學到的最多
另外,這次你用的型態是 void 與先前的 LRESULT __fastcall
差異在哪嗎?
補充一下

如果使用
LRESULT __fastcall,就必需要 return True 或是 return False
這個 return 是控制下層訊息處理機制,這時就不需要再去
Dispatch(&msg.Result);
不然訊息會被處理兩次

而針對訊息的所要傳回的值,不管是數值、或是 True or False 都是設定在訊息內,也就是
msg.Result = true; or msg.Result = false;

你第一次之所以會都不成功,應該是在此產生混淆了,所以我其實已經回答你的問題,只要你有思考過
系統時間:2024-03-29 23:30:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!