2013-08-22 19 views
4

我想寫一個異常處理程序,顯示用戶友好的消息。我不知道如何獲得導致TDBGridInplaceEdit錯誤的「新輸入的」數據值。如何獲取導致TDBGridInplaceEdit錯誤的值?

例如:
我有一個DBGrid加載數據。當我故意將第1行的PartNo字段更改爲非數字值以導致TDBGridInplaceEdit錯誤...(自:1313.3至:1313..3)...我捕獲錯誤並顯示消息,但我無法弄清楚如何獲得不好的'1313..3'值。

enter image description here
原始PARTNO:1313.3

enter image description here
更改PARTNO:1313..3(兩個小數點)

enter image description here
從應用程序onException的

procedure TMain.ApplicationEvents1Exception(Sender: TObject; E: Exception); 
var 
    str : string; 
begin 
    str := sender.ToString; 
    str := str + #10; 
    str := str + RzDBGrid2.SelectedField.FieldName; 
    str := str + #10; 
    str := str + VarToStr(RzDBGrid2.SelectedField.Value); 
    str := str + #10; 
    str := str + e.Message; 
    showmessage(str); 
    //Application.ShowException(E); 
end; 
顯示的錯誤信息

我想格式化自己的消息使用輸入的錯誤'1313..3'值。你如何得到這個價值?

+0

我在回答之前沒有仔細閱讀(我現在已經刪除了答案)。你會得到一個EConvertError,這是在賦值過程中發生的,因此實際上在RTL本身中失敗了,並且永遠不會達到你通過'NewValue'得到的值。我不知道有什麼辦法可以達到這個價值。最好的方法可能是在字段本身設置一個編輯掩碼,這將防止首先輸入無效值。 –

+0

我想我可以解析e.Message,然後收穫價值:) –

+0

是的,我想。 ;-)我想我會防止無效的輸入,儘管;它不那麼「黑客」。如果你決定走這條路線,你必須測試一個特定的異常類型(EConvertError),然後解析看看什麼樣的轉換(整數,浮點或其他)來知道要分析什麼,並且還爲其他類型的異常(例如,缺少必需的字段,數據截斷錯誤(字符串太長)等)添加處理,並分別處理它們,然後爲您錯過的通用處理程序。 –

回答

5

如果您要保留數據集的字段,可以在字段中定義一個OnSetText方法(雙擊數據集並選擇添加字段)。

enter image description here

的方法看起來是這樣的:

procedure TForm1.ADataSetAFloatFieldSetText(Sender: TField; const Text: string); 
var 
f:Double; 
begin 
    if not TryStrToFloat(Text,f) then 
     begin 
     raise Exception.Create(
           'Error on: ' 
           + #13#10'Dataset: ' + Sender.DataSet.Name 
           + #13#10'Field: '  + Sender.FieldName 
           + #13#10'Old Value: ' + Sender.AsString 
           + #13#10'New Value: ' + Text 
          ); 
     end; 
end; 

如果你想避免你的堅持,你的字段可以動態分配方法的領域,例如打開數據集後。

procedure TForm1.ADataSetAfterOpen(DataSet: TDataSet); 
Var 
i:Integer; 
begin 
    for I := 0 to Dataset.FieldCount - 1 do 
     begin 
     if Dataset.Fields[i].DataType in [ftFloat, ftCurrency, ftBCD] then 
      Dataset.Fields[i].OnSetText := ADataSetAFloatFieldSetText;    
     end; 
end; 
+1

∞+1 - 謝謝你的例子。這絕對是輝煌!我永遠不會知道這存在。你是如何開發這些關於Delphi的知識的?你推薦什麼資源來獲得深入的知識? –

+1

只是看着對屬性和事件感興趣(來源包括),閱讀問答或論壇,練習,但儘管答案可能有用,但它遠沒有輝煌。 – bummi