是須閃避的 BCB TQuery OnExit BUG 嗎? |
答題得分者是:RedSnow
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
1. TQuery 的 RecordCount 與 RecNo
若 Open() 時 SQL 所 SELECT 進的筆數為10筆, 於5th筆 Insert,Post 後變11筆,
再於6th筆 Insert, Post 後會變成5th筆(共12筆), 原5th(new)變6th筆.
刪6th(New)筆剩10筆,再刪3rd(Old)筆剩9筆,....故若要計算總筆數, 應自行控制.
TQuery 對 Client/Server 資料庫, 無正確的 RecNo 可用, 故 TDBGrid 的
VerticalScrollBar 無法停駐於正常的比率位置, Borland.tw 解釋這是用
Client/Server 便無法得知之故, 但總覺得是因 dbtables.pas 之 procedure
TBDEDataSet.GetRecord 未處理之故(或許 BDE 便未處理), 若改用 TADOQuery,
TDBGrid 的垂直捲軸與 RecNo 便正常, 但 TADOQuery 又有其他問題, 唉!!
2. 編輯資料的檢查與 OnExit, SetFocus
常見大家提到 OnExit 與 SetFocus() 與 Color 的問題, 也一直困擾在下,
最後乾脆繼承 TDBEdit 與 TEdit 自製新元件, 增加一些 Property 與 Method,
於內部 DoEnter、DoExit、Change 處理: Focused 與非 Focused 自動變色, 限制
數值、字串年度、年月、年月日、Text.Length() 之 Max 與 Min, 是否准 null,
TEdit 對數值自動 Edit 時靠左, Exit 後靠右, 數值之 DisplayFormat 及粗略的
字串允許字元之檢查....等, 才較方便使用.
但 OnExit 仍有一問題一直無解:
//------------
String sx0 = ",11,12,13,14,"; String sx2 = "," Edit2->Text ","; if (!sx0.Pos(sx2)) { ShowMessage("Data error!"); Edit2->SetFocus(); Abort(); // 無本式亦可 } else { if (Edit2->Text == "12") { int a = Application->MessageBox("Is data correct?","Warning", MB_ICONEXCLAMATION||MB_YESNO); if (a != ID_YES) { Edit2->SetFocus(); Abort(); // 無本式亦可 } // 或只做 ShowMessage("Warning! Data maybe not correct!"); } }//------------ 則若以 Mouse 點 Edit3, 因 ActiveControl 是 Edit3, 會先執行 Edit2->OnExit() 再執行 Edit3->OnEnter(), 若 Edit2->Text == "11" 或 = "12" 但未選 ID_YES, 則 Edit3->OnEnter() 會未被執行, 不知是否會一直被堆放在 Message Queue 中? 若選 ID_YES, 則 Edit3 會因 MouseUp 未被執行, 而處於 Mark Text 模式下, 須再 Click 一下才會正常. 雖不嚴重, 但總覺得不完美! |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
herbert2 您好: 試試看先清除 Edit3 的 Focus,然後才呼叫 MessageBox(),若是 MessageBox() 傳回 IDYES,再重設 Focus 給 Edit3:
if (Edit2->Text == "12") { PostMessage(Edit3->Handle, WM_KILLFOCUS, 0, 0); int a = Application->MessageBox("Is data correct?","Warning", MB_ICONEXCLAMATION|MB_YESNO); if (a != IDYES) { Edit2->SetFocus(); }else{ PostMessage(Edit3->Handle, WM_SETFOCUS, 0, 0); } }另外您設定 MessageBox 的參數似乎錯誤,其中的 || 好像應該改成單個 |,而且其後的判斷式,也應該將 ID_YES 改成 IDYES (沒有 Underline),您參考一下。 |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
謝謝 RedSnow 的指教!
用 || 乃因直接從 bcb.dci 拷入, 忘了去掉一個 |.
ID_YES 為筆誤.
依您建議, 確實解決 Mouse 的問題, 但 OnExit 開頭, 須加
TWinControl *WCx = ActiveControl;
且改用
if (WCx) {
PostMessage(WCx->Handle,WM_SETFOCUS,0,0);
Panel1->SetFocus();
WCx->SetFocus();
}
才能完全正常, 否則"插入符"消失, 在恢復焦點之 ActiveControl 上 Click Mouse 也都無反應.
曾嘗試用 PoseMessage(WCx->Handle,WM_LBUTTONDOWN,0,0);
或 WM_LBUTTONUP,WM_CLICKACTIVE, WM_MOUSEACTIVATE 等都無效.
再次謝謝您!
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
herbert2 您好: 這真的是蠻奇怪的,我的程式碼是經過測試,確認沒問題後才貼上來的,原先未使用 PostMessage() 之前,我試過直接設定 Edit3 的 SetFocus(),結果才是像您所描述的一樣,會看不到游標 (其實游標確實有 Focus 在 Edit3 裡邊,直接按字母鍵會插入字元,按下刪除鍵也能刪掉字元,只是看不到游標而已),之後我試過用 SendMessage() 並加上 WM_KILLFOCUS 來處理,結果仍相同,所以後來我才改用 PostMessage()。 我未加上 ActiveControl 的處理是因為您並未將完整的程式碼貼上來,我並不知道您有幾個 Edit 物件要處理?我僅能就所知的有限資訊來做測試,因此我假設 Focus 離開 Edit2 時,是進入 Edit3,所以才直接寫死為 Edit3,如果您測試時是直接由 Edit2 跳到 Edit3 去,那麼 ActiveControl 也會是 Edit3,有沒有加上 ActiveControl 的結果應該都是相同的,剛才我也再度做過測試,您的敘述中有沒有 Panel1->SetFocus() 與 WCx->SetFocus() 都不影響游標的正常顯示,但是少了 PostMessage() 就不行了,您的測試結果和我的測試結果竟然會不同,那會不會是版本的問題呢? 如果您的程式中有多個 Edit 物件,而且各個 Edit 物件的處理動作是大同小異的話,您也可以考慮將 OnExit 寫成共用的事件處理程序,只要在其內加上 Sender 的強制轉型,以及各個 Edit 物件的判斷處理就可以了。
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |