線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4008
推到 Plurk!
推到 Facebook!

TMaskEdit 的錯誤攔截

答題得分者是:Justmade
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-19 23:54:34 IP:61.66.xxx.xxx 未訂閱
請問各位! 我用 TMaskEdit, 建立一個有 editmask功能的輸入欄, 例如我指定 AAA-999 如果我在輸入時沒有符合其mask規定, delphi會跳出一個英文的錯誤訊息 Invalid Input Value... 請問我要如何做才能攔截這個錯誤(在被Delphi攔截跳出此視窗之前), 同時 由我的程式來解決, 而且這段攔截要寫在那一個event之中? 謝謝!
ilancky_oo_
一般會員


發表:0
回覆:1
積分:0
註冊:2002-12-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-20 01:12:46 IP:61.231.xxx.xxx 未訂閱
試著將 AAA-999 設為小寫的 aaa-999 這樣 錯誤訊息應該不會出現 至於要如何攔截錯誤訊息 則請各位大大再幫忙回答
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-20 02:31:31 IP:61.66.xxx.xxx 未訂閱
引言: 試著將 AAA-999 設為小寫的 aaa-999 這樣 錯誤訊息應該不會出現 至於要如何攔截錯誤訊息 則請各位大大再幫忙回答
這不是我要的, 欄位必須設定 AAA-999
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-20 08:37:29 IP:61.219.xxx.xxx 未訂閱
1. 你可能不容易找到好位置攔截, 大概只能在onChange或onKeyPress 2. 目的是更改系統的訊息,為何不考慮一次解決,改掉所有訊息 將consts,rtlconsts兩個unit複製加到你的project中, 更改其中字串為中文,重新Compiler
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-20 08:43:54 IP:218.16.xxx.xxx 未訂閱
我大約的看了一下,發現該元件引發該信息有以下三種時機 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-20 15:27:03 IP:61.66.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-20 15:42:33 IP:61.219.xxx.xxx 未訂閱
那只好這樣了
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-11-13 14:59:17 IP:59.120.xxx.xxx 未訂閱
最近也剛好遇到這個問題,這篇文章真是幫助不少

如果來整合一下,似乎也不賴

基礎課程 - Delphi Interceptor Classes

leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2012-11-13 16:42:26 IP:118.165.xxx.xxx 訂閱
原來類別還可以這樣攔截 很奇妙
感覺這招不能濫用 感謝分享~~

===================引 用 GrandRURU 文 章===================
最近也剛好遇到這個問題,這篇文章真是幫助不少

如果來整合一下,似乎也不賴

基礎課程 - Delphi Interceptor Classes

編輯記錄
leveon 重新編輯於 2012-11-13 01:43:17, 註解 無‧
cat200188
中階會員


發表:37
回覆:78
積分:68
註冊:2005-01-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2012-11-14 00:45:40 IP:59.126.xxx.xxx 訂閱
請問此網站中
[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;
[/code]
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2012-11-14 17:37:10 IP:59.120.xxx.xxx 未訂閱
感謝提供!
已修改原文內容!

===================引 用 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;
[/code]
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;"> <iframe name="content"></iframe>
系統時間:2024-04-25 16:18:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!