TMaskEdit 的錯誤攔截 |
答題得分者是:Justmade
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
ilancky_oo_
一般會員 發表:0 回覆:1 積分:0 註冊:2002-12-12 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
我大約的看了一下,發現該元件引發該信息有以下三種時機
1. 當使用者按 Enter 時
2. 當用任何方法離開 EditMask 時
以上兩種情況均是因呼叫 ValidateEdit 發現與 mask 不乎時呼叫ValidateError而發出 exception 的。
3. 當你直接給 value 給 MaskEdit.text 而不乎合 Mask 時,這種情況最好辦,直接用 try MaskEdit.text := xxx except 即可。 第1種情況也比較好欄截 :
procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char); begin if (Word(Key) = VK_RETURN) then try MaskEdit1.ValidateEdit; except showmessage('Mask Error when pressing Enter'); Abort; // 不給機會 maskedit 自行 ValidateEdit end end;但第二種情況比較難...因為它是發生於 OnExit 之前,在OnExit 寫 code 已經太遲。 較完整一次過處理1及2的方法是,你可以在 onEnter 時用特定的 application.onException 取代原先的而 onExit 時再換回來 : type TForm1 = class(TForm) MaskEdit1: TMaskEdit; .... procedure MaskEdit1Exit(Sender: TObject); procedure MaskEdit1Enter(Sender: TObject); private OriException : TExceptionEvent; procedure MaskException(Sender: TObject; E: Exception); .... procedure TForm1.MaskException(Sender: TObject; E: Exception); begin if E is EDBEditError then showmessage('MaskError') else OriException(Sender,E); end; procedure TForm1.MaskEdit1Enter(Sender: TObject); begin OriException := Application.OnException; Application.OnException := MaskException; end; procedure TForm1.MaskEdit1Exit(Sender: TObject); begin Application.OnException := OriException; end;這樣當使用者進入 MaskEdit 時, EDBEditError 便會被你的 MaskException 處理而其他 exception 則轉介到原先的 Application.onException 處理。不過第三種況由於可能 focus 不在 maskedit, 所以要獨立處理,或是將 處理方法直接寫在標準的 Application.onException 裡。 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 1. 你可能不容易找到好位置攔截, 大概只能在onChange或onKeyPress 2. 目的是更改系統的訊息,為何不考慮一次解決,改掉所有訊息 將consts,rtlconsts兩個unit複製加到你的project中, 更改其中字串為中文,重新Compiler我除了要顯示我自己的訊息外, 我還必須要攔截它的Exception不使其觸發, 改由我自己的 function 來動作, 所以改掉 conts內容並沒有達到我要的目的。 我試了 Justmade兄的方法可以做到, 感謝了! 發表人 - P.D. 於 2003/03/20 15:34:05 |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
那只好這樣了
TNewMaskEdit = class(TMaskEdit) procedure ValidateError; override; end;在ValidateError中隨你高興怎麼玩吧 例: TForm1=class(TForm) ... public MEdit1: TNewMaskEdit; end; procedure Tform1.FormCreate(Sender: TObject); begin MEdit1:=TNewMaskEdit.create(self); MEdit1.parent:=self; MEdit1.left:=100; Medit1.top:=100; Medit1.EditMask:='!90:00:00>LL;1;_'; end;這是RunTime Create, 如果要在DesignTime使用, 加個Register放到元件盤上吧 |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
|
cat200188
中階會員 發表:37 回覆:78 積分:68 註冊:2005-01-18 發送簡訊給我 |
請問此網站中
[code delphi] procedure TMaskEdit . ValidateError; var testDate: TDateTime; begin // 為了避開系統的錯誤訊息,故不使用 inherited //inherited; if ( Word (Key) = VK_RETURN) then try MaskEdit1 . ValidateEdit; except showmessage( 'Mask Error when pressing Enter' ); Abort; // 不給機會 maskedit 自行 ValidateEdit end end ; key從何而來 是否應該改成 [code delphi] procedure TMaskEdita.ValidateError; var SMaskEditErra :String; begin // 為了避開系統的錯誤訊息,故不使用 inherited //inherited; SMaskEditErra := '這是中文測試!!'; raise EDBEditError.CreateResFmt({$IFNDEF CLR}@{$ENDIF}SMaskEditErra, [EditMask]); end; [/code] 比較簡單 但 中文都會有亂碼 還請各位大俠指點一二 ===================引 用 leveon 文 章=================== 原來類別還可以這樣攔截 很奇妙 感覺這招不能濫用 感謝分享~~ ===================引 用 GrandRURU 文 章=================== 最近也剛好遇到這個問題,這篇文章真是幫助不少 如果來整合一下,似乎也不賴 基礎課程 - Delphi Interceptor Classes
------
....... |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
感謝提供!
已修改原文內容! ===================引 用 cat200188 文 章=================== 請問此網站中 [code delphi] procedure TMaskEdit . ValidateError; var testDate: TDateTime; begin // 為了避開系統的錯誤訊息,故不使用 inherited //inherited; if ( Word (Key) = VK_RETURN) then try MaskEdit1 . ValidateEdit; except showmessage( 'Mask Error when pressing Enter' ); Abort; // 不給機會 maskedit 自行 ValidateEdit end end ; key從何而來 是否應該改成 [code delphi] procedure TMaskEdita.ValidateError; var SMaskEditErra :String; begin // 為了避開系統的錯誤訊息,故不使用 inherited //inherited; SMaskEditErra := '這是中文測試!!'; raise EDBEditError.CreateResFmt({$IFNDEF CLR}@{$ENDIF}SMaskEditErra, [EditMask]); end; [/code] 比較簡單 但 中文都會有亂碼 還請各位大俠指點一二 ===================引 用 leveon 文 章=================== 原來類別還可以這樣攔截 很奇妙 感覺這招不能濫用 感謝分享~~<style type="text/css">qtl { position: absolute; border: 1px solid #cccccc; -moz-border-radius: 5px; opacity: 0.2; line-height: 100%; z-index: 999; direction: ltr; } qtl:hover,qtl.open { opacity: 1; } qtl,qtlbar { height: 22px; } qtlbar { display: block; width: 100%; background-color: #cccccc; cursor: move; } qtlbar img { border: 0; padding: 3px; height: 16px; width: 16px; cursor: pointer; } qtlbar img:hover { background-color: #aaaaff; } qtl>iframe { border: 0; height: 0; width: 0; } qtl.open { height: auto; } qtl.open>iframe { height: 200px; width: 300px; } </style><qtl none; left: 423px; top: 712px;"> |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |