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

是須閃避的 BCB TQuery OnExit BUG 嗎?

答題得分者是:RedSnow
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-14 16:42:13 IP:211.72.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-14 20:19:58 IP:218.19.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-15 03:46:03 IP:211.72.xxx.xxx 未訂閱
謝謝 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-15 04:35:30 IP:218.19.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-15 04:50:57 IP:211.72.xxx.xxx 未訂閱
謝謝 RedSnow, 我試過 BCB3,4, 目前使用 BCB5 Update2, 誠如您紅字所言, 我考慮 Form 上可能有 TDBEdit, TEdit, TDBGrid,... 等, 故加 ActiveControl 處理. 或許是版本問題吧, BCB5 若不將焦點移出再移入, 就會有 Mouse 不 Work 現像. Panel1 只是舉例用.
系統時間:2024-05-15 7:31:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!