2011-08-10 4 views
0

내 응용 프로그램은 데이터 소스로 QuantumGrid (v6.56)와 TSimpleDataSet을 사용합니다.TDataSet.UpdateRecord에서 어떻게 오류를 잡을 수 있습니까?

문제점 : 사용자가 숫자 필드에 숫자가 아닌 값을 입력하면 예외가 발생합니다. 이 코드는 OnBeforePost 핸들러에 도달하지 않습니다.

예외가 발생하는 경우 응용 프로그램에서 오류를 catch하고 표시 할 수있는 방법 전에 OnBeforePost?


스택 추적 : 당신은 사용자는 또한 설정 한 후, 숫자를 입력 할 수 있도록, 거기에 당신이 CurrencyEdit을 할당 할 수 있습니다 "등록 정보"를 cxGrid에 열의 속성을 설정해야합니다

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

"Properties"를 사용하면 OnValidate 이벤트를 사용하여 사용자 항목의 유효성을 검사 할 수 있습니다.

+0

예, SpinEdit을 사용하려고 시도했는데 처음에는 동일한 문제가 발생했습니다. 사용자가 그리드에 숫자가 아닌 값을 입력 할 수 있습니다. 네비게이터 포스트 버튼을 클릭하면 에러가 발생합니다. 6.56 버전을 다시 설치했는데 다른 방식으로 작동했습니다. 사용자가 숫자가 아닌 값을 입력하면 Post 단추를 클릭 할 수는 있지만 dataset.post를 수행하지 않으므로 오류가 발생하지 않습니다. – mjn

1

예에서 이벤트 OnBeforePost는 실제로 도달하지 않았습니다.

당신은 cxGrid에 대해 언급했지만 사실은 재현하기 쉽습니다.

TFloatField에 링크 된 간단한 TDBEdit을 가져 와서 "7.7.7.7.7.7.7.7"값을 입력하십시오. 부동 소수점 필드는 소수 구분 기호를 허용하지만 1 만 존재 함을 확인하지는 않습니다. 그래서 이것을 입력하면 비슷한 방식으로 오류가 발생하게됩니다. 이렇게 할 수있는 바로 가기가있는 경우 필드를 종료하거나 게시하는 동안 오류가 발생합니다.

"중간에"가로 채고 싶다면 TField.OnSetText가 가장 좋은 방법 일 것입니다.