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

TEdit的OnExit Event 為何點選menu和系統的關閉X時沒作用

尚未結案
emw37
一般會員


發表:4
回覆:6
積分:2
註冊:2004-08-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-19 00:23:38 IP:211.76.xxx.xxx 未訂閱
各位大大好: 小弟的程式用了許多的Edit,並用OnExit做輸入資料的驗證工作,但發現到滑鼠點選到menu時(還有系統的最大最小化及關閉),並不會有Focus轉移的現象.意思是不會觸發Edit的OnExit的事件,因此在menu上選擇Save時並不能先有驗證資料的動作,想請問各位大大是否有解決的辦法? 或者想請問各位大大,關於Edit資料的驗證(數字.IP的格式,範圍),在Save前應該在哪個時機或Event觸發時來做這件事
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-19 00:35:23 IP:203.70.xxx.xxx 未訂閱
emw37您好 既然是在Save前要驗證,何不寫在Save指令前呢? 也就是在menuitem的click事件先驗證在save...    參考看看 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
emw37
一般會員


發表:4
回覆:6
積分:2
註冊:2004-08-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-19 01:05:13 IP:211.76.xxx.xxx 未訂閱
ENIX007您好: 您的方法可行,但萬一客戶Key錯好幾筆資料,那不是要回頭檢查有那幾個Key錯的,再一個個更正... 本來有想過用 Edit KeyPress 來立即的更新驗證,對於數值來說應該沒問題, 但我IP的輸入方式是一個field輸入xxx.xxx.xxx.xxx,因此須輸入完才能驗證 也許有人想說把IP分成四個Edit當做數值來處理,但客戶希望是完整IP輸入,所以就用了OnExit Event,不過又發現menu和系統的關閉X沒作用,唉..也許應該和客戶說說吧 期望有那位大大有更高明的方法? 拜託
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-19 01:41:58 IP:203.70.xxx.xxx 未訂閱
emw37您好 小弟再出個主意您參考看看 使用一個
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-19 02:12:59 IP:219.132.xxx.xxx 未訂閱
emw37:你的問題我希望有高手答案能令你滿意,
見到你說但我IP的輸入方式是一個field輸入xxx.xxx.xxx.xxx,因此須輸入完才能驗證
我提供一個Windows系統提供的IP控制項(來自對岸)
http://www.ccrun.com/doc/go.asp?id=592
作者: ccrun (老妖)
我整理後如下:
#include "ApiUnit1.h"
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  TInitCommonControlsEx ICC;
  ICC.dwSize = sizeof(TInitCommonControlsEx);
  ICC.dwICC  = ICC_INTERNET_CLASSES;
  if(!InitCommonControlsEx(&ICC))
    // 無法產生IP控制項;
  else {
    hIpEdit = CreateWindow(WC_IPADDRESS,NULL,WS_CHILD|WS_VISIBLE
              ,224,154,120,21,Handle,0,HInstance,NULL);
    // 224,154,120,21是控制項的left, top, width, height
    // IPM_CLEARADDRESS    清除IP控制項中的IP串
    SendMessage(hIpEdit,IPM_CLEARADDRESS,0,0);
    // IPM_SETADDRESS      設置IP控制項的IP串
    SendMessage(hIpEdit,IPM_SETADDRESS,0,MAKEIPADDRESS(192,168,0,1));
  }
}    請參考
Andy Chang
------
Andy Chang
emw37
一般會員


發表:4
回覆:6
積分:2
註冊:2004-08-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-19 13:59:39 IP:61.222.xxx.xxx 未訂閱
感謝ENIX007 and andychang1690,關於IP control 我會試試看!! 小弟有個想法,可否在Focus轉移時,抓到離開Focus的元件,然後判斷是否為Edit, 然後再利用Edit->Tag判斷是用那種檢查方法(IP or 數值),然後做檢查 因為沒被檢查到的一定是最後Focus的Edit 所以在Save時,抓到Form Focus的元件,判斷是否為Edit,然後再利用Edit->Tag判 斷是用那種檢查方法(IP or 數值),然後做檢查 覺得這樣可以減少程式碼...不過可否請各位大大給個範例 拜託!!!
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-19 14:31:40 IP:203.70.xxx.xxx 未訂閱
emw37您好 這樣也是可行的 關於抓Form的Focus是否為Edit元件如下: bool IsEdit = ActiveControl->ClassNameIs("TEdit");    參考看看 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-19 14:46:01 IP:219.132.xxx.xxx 未訂閱
ENIX007大大點出一個很重要的控制
ActiveControl
emw37大大你可以
#include 
TComponent *pComponent; 或是
TEdit *pEdit;
只要
bool IsEdit = ActiveControl->ClassNameIs("TEdit");
if (Is_Edit) {
  pEdit=(TEdit *)ActiveControl;
  // 這個pEdit就是你要執行的Edit你可以完全處理它。
  // 如是Edit1,這個pEdit就是Edit1,取pEdit->Text==Edit1->Text!
}
請參考!
Andy Chang
------
Andy Chang
emw37
一般會員


發表:4
回覆:6
積分:2
註冊:2004-08-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-19 17:23:59 IP:61.222.xxx.xxx 未訂閱
class TForm1 : public TForm { private: // User declarations void __fastcall Form1NewWndProc(TMessage &msg); TWndMethod Form1OldWndProc; }; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Form1OldWndProc=Form1->WindowProc; Form1->WindowProc=Form1NewWndProc; } void __fastcall TForm1::Form1NewWndProc(TMessage &Msg) { switch(Msg.Msg) { case WM_ENTERMENULOOP: case WM_SYSCOMMAND: if( ActiveControl->ClassNameIs("TEdit") ) switch( ActiveControl->Tag ) { case 1: // Value1 format //if check format is wrong then show message and return if (CheckValue1(ActiveControl)) {return;} break; case 2: //IP format //if check format is wrong then show message and return if (CheckIP(ActiveControl)) {return;} break; } break; } Form1OldWndProc(Msg); } 感謝ENIX007 andychang1690 給我的指教 這個攔windows message 是RaynorPao 給小弟的範例 現在已可以在menu and system bar 上click時做最後focus的Edit的檢查動作 小弟現在希望能做到攔Focus的變化,來檢查format,如此就可以不用每個Edit都 要寫他的OnExit() Event,如此只有設定Edit 的Tag 就可以決定檢查的方式 但試過了WM_KILLFOCUS WM_SETFOCUS 都沒反應也,希望各位大大能指教一下 拜託各位大大
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-20 15:47:39 IP:203.70.xxx.xxx 未訂閱
emw37您好 抓了一下Message,發現WM_KILLFOCUS訊息是直接發給Edit的,因此Form是接不到的... 只要把RaynorPao版主的範例改成Edit就可以接的到了... 只是這樣似乎無法節省程式碼,因為每一個Edit都要寫一個...(個人覺得...) 小弟還是覺得使用OnExit Event比較簡單,何況可以只寫一個押... 在這個Event裡判斷是哪一個元件觸發的就行了(利用Sender)    參考看看 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
emw37
一般會員


發表:4
回覆:6
積分:2
註冊:2004-08-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-21 17:01:11 IP:211.76.xxx.xxx 未訂閱
ENIX007: 您好,謝謝你的指教,我已經在Form create時,利用是否為Edit 和tag 來幫每個Edit設定其適合的檢查函數給OnExit, 所以我想將得分給ENIX007,andychang1690不好意思喔....
系統時間:2024-05-13 19:04:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!