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

OnChange 時還原數值及阻止跳 Record

尚未結案
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-16 17:33:18 IP:218.103.xxx.xxx 未訂閱
我想在 TField.OnChange Event 中檢查用戶輸入的數值合法與否, 若不合法則把值還原, 其中遇到了一些問題。    首先, 我本來很直覺地覺得使用 TField.OnValidate 去做檢查, Validate 嘛, 字面解釋就是做這項工作的, 可是發覺 Event 當中的 OldValue 不能取得原本的舊值, 但在 OnChange Event 中卻可以, 於是改用了 OnChange Event, 測試程式碼如下:
procedure TForm1.ClientDataSet1mytextChange(Sender: TField);
begin
  if ClientDataSet1MyText.NewValue = '123' then
    ClientDataSet1MyText.AsString := ClientDataSet1MyText.OldValue;
end;
上面假設 '123' 是非法字串, 結果運作得很好; 可是, 觸發 TField.OnChange 的, 不光是用戶把 Input Focus 轉到下一個 Field, 也可能是直接跳到另一個 Record, 為了防止這種情況, 程式加一個 Slient Exception:
procedure TForm1.ClientDataSet1mytextChange(Sender: TField);
begin
  if ClientDataSet1MyText.NewValue = '123' then
  begin
    ClientDataSet1MyText.AsString := ClientDataSet1MyText.OldValue;
    Abort;
  end;
end;
結果是, Assign 舊值的那句失效了, 很奇怪, 會不會是 Delphi (我用 D7) 的 Bug 的, 有甚麼解決辦法呢? 謝謝. -- 小卜子
------
--
小卜子
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-16 18:39:58 IP:218.103.xxx.xxx 未訂閱
我找到答案了, 回饋一下。
procedure TForm1.ClientDataSet1mytextChange(Sender: TField);
begin
  ClientDataSet1.DisableControls;
  try
    if ClientDataSet1MyText.NewValue = '123' then
    begin
      ClientDataSet1MyText.AsString := ClientDataSet1MyText.OldValue;
      Abort;
    end;
  finally
    ClientDataSet1.EnableControls;
  end;
end;
若有更好的方法, 歡迎提供。 -- 小卜子
------
--
小卜子
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-17 09:02:54 IP:220.228.xxx.xxx 未訂閱
我會在TField.OnValidate真接用 raise Exception.Create('輸入資料有問題...'); 這樣子輸入的值會還原,而且游標也會停在原本的Field上! 參考看看吧! Ian
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-20 10:52:38 IP:218.103.xxx.xxx 未訂閱
重覆了....刪之。 發表人 - diviner 於 2004/09/20 11:01:01
------
--
小卜子
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-20 10:53:31 IP:218.103.xxx.xxx 未訂閱
引言: 我會在TField.OnValidate真接用 raise Exception.Create('輸入資料有問題...'); 這樣子輸入的值會還原,而且游標也會停在原本的Field上! 參考看看吧! Ian
早試過了, 輸入值沒有被還原, 除非 User 自己按 Escape, 你的會還原嗎, 那倒奇怪了。 -- 小卜子
------
--
小卜子
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-20 10:57:29 IP:220.228.xxx.xxx 未訂閱
我確實都是這樣用的!不知為什麼你會不行? 可以說明一下你的程式碼嗎? Ian 發表人 - l630521 於 2004/09/20 10:59:31
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-20 11:09:13 IP:218.103.xxx.xxx 未訂閱
整個程式很乾淨, 因為只作測試用; 就放一個 DBGrid 加上下面這段 Code:
procedure TDataModule1.ClientDataSet1MytextValidate(Sender: TField);
begin
  if ClientDataSet1MyText.NewValue = '123' then
    Abort;
end;
-- 小卜子
------
--
小卜子
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-20 15:10:25 IP:220.228.xxx.xxx 未訂閱
對不起!我查了一下,我之前可以是因為我的物件是用DBLookupComboBox, 用其他物件真的不會恢復原值,只能用您提供的方法, 可是還是會有一個問題,那就是永遠只能回復最原始的值,而無法原復上一次的值! 有空再來找看看還有沒有其他方法! Ian
系統時間:2024-05-09 10:11:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!