2011-08-10 21 views
0

我的應用程序使用QuantumGrid(v6.56)和TSimpleDataSet作爲其數據源。如何捕獲TDataSet.UpdateRecord中的錯誤?

問題:如果用戶在數字字段中輸入非數字值,則會引發異常。該代碼沒有到達OnBeforePost處理程序。

如果拋出異常,應用程序如何捕獲錯誤(並向用戶顯示消息)之前OnBeforePost?


堆棧跟蹤:

exception class : EDatabaseError 
exception message : '...' is not valid Integer value for Field <somefieldname> 

main thread ($504): 
00526c7e +082 EditBooking.exe DB        DatabaseError 
00526d0f +04b EditBooking.exe DB        DatabaseErrorFmt 
0052c428 +07c EditBooking.exe DB        TIntegerField.SetAsString 
0052af30 +00c EditBooking.exe DB        TField.SetText 
0052abf9 +021 EditBooking.exe DB        TField.SetEditText 
007c3a3f +053 EditBooking.exe cxDBData       
007e14a8 +018 EditBooking.exe cxGridDBDataDefinitions   TcxGridDBDataController.UpdateData 
006f8159 +039 EditBooking.exe cxCustomData      TcxCustomDataProvider.DoUpdateData 
007c1c18 +008 EditBooking.exe cxDBData       TcxDBDataLink.UpdateData 
0053325d +021 EditBooking.exe DB        TDataLink.UpdateRecord 
005333f8 +0d8 EditBooking.exe DB        TDataLink.DataEvent 
007c1683 +00f EditBooking.exe cxDBData       TcxDBDataLink.DataEvent 
00533973 +03f EditBooking.exe DB        TDataSource.NotifyLinkTypes 
005339a2 +01e EditBooking.exe DB        TDataSource.NotifyDataLinks 
005339cf +023 EditBooking.exe DB        TDataSource.DataEvent 
005392ad +131 EditBooking.exe DB        TDataSet.DataEvent 
00553d7c +058 EditBooking.exe DBClient       TCustomClientDataSet.DataEvent 
00539396 +042 EditBooking.exe DB        TDataSet.UpdateRecord 
0053a356 +006 EditBooking.exe DB        TDataSet.Post 
0055677c +054 EditBooking.exe DBClient       TCustomClientDataSet.Post 
+2

位於數據集和網格之間的數據源的「OnUpdateData」事件? –

+1

-1 - 這是不明顯的你要求或試圖實現。如果這是爲了向用戶輸入無效信息而產生的信息,那麼您可以對顯示如何執行此操作的答案發表評論,也可以對要求澄清目標的評論發表評論。如果您設置了捕獲異常,請將「post」調用附加到try-except中。否則,這個問題是關於什麼的? –

+0

檢查字段的「變爲 - 在其OnSetText」事件中的值(如在我刪除的答案中)獨立於發佈方法。即使電網偶爾決定自行發佈,它也應該可以工作。無論如何,對於TDBNavigator,您可以輕鬆地爲'BeforeAction'事件添加一個處理程序,並檢查那裏的值(如果'Button'是'nbPost'),並在必要時放棄。 –

回答

1

您需要設置「屬性」,在cxGrid你列的財產,那裏你可以指定一個CurrencyEdit所以用戶只能輸入數字,還設置後「屬性」可以使用OnValidate事件來驗證用戶條目。

+0

是的,我已經嘗試使用SpinEdit,並首先有同樣的問題 - 用戶可以在網格中輸入一個非數字值並點擊導航錯誤的導航器Post按鈕。我重新安裝了6.56版本,它的工作方式不同:如果用戶輸入非數字值,則可以單擊「發佈」按鈕,但不會執行dataset.post,因此不會發生錯誤。 – mjn

1

在你的例子中,事件OnBeforePost的確沒有達到。

您提到了cxGrid,但事實是,您的問題很容易重現。

取一個簡單的TDBEdit鏈接到TFloatField並嘗試輸入值「7.7.7.7.7.7.7.7」。浮點字段接受小數點分隔符,但不驗證只有1個存在。因此,輸入時也會導致以類似的方式提出錯誤,無論是退出該字段還是發佈時,如果您有快捷方式允許您這樣做。

如果你想攔截它「在途中」,那麼TField.OnSetText可能是你最好的選擇。