TEdit的OnExit Event 為何點選menu和系統的關閉X時沒作用 |
尚未結案
|
emw37
一般會員 ![]() ![]() 發表:4 回覆:6 積分:2 註冊:2004-08-13 發送簡訊給我 |
|
ENIX007
高階會員 ![]() ![]() ![]() ![]() 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
emw37
一般會員 ![]() ![]() 發表:4 回覆:6 積分:2 註冊:2004-08-13 發送簡訊給我 |
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 發送簡訊給我 |
|
andychang1690
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
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 發送簡訊給我 |
感謝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 發送簡訊給我 |
|
andychang1690
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
ENIX007大大點出一個很重要的控制 ActiveControl emw37大大你可以 #includeAndy Chang
------
Andy Chang |
emw37
一般會員 ![]() ![]() 發表:4 回覆:6 積分:2 註冊:2004-08-13 發送簡訊給我 |
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 發送簡訊給我 |
emw37您好
抓了一下Message,發現WM_KILLFOCUS訊息是直接發給Edit的,因此Form是接不到的...
只要把RaynorPao版主的範例改成Edit就可以接的到了...
只是這樣似乎無法節省程式碼,因為每一個Edit都要寫一個...(個人覺得...)
小弟還是覺得使用OnExit Event比較簡單,何況可以只寫一個押...
在這個Event裡判斷是哪一個元件觸發的就行了(利用Sender) 參考看看
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
emw37
一般會員 ![]() ![]() 發表:4 回覆:6 積分:2 註冊:2004-08-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |