Как я могу поймать ошибки в TDataSet.UpdateRecord?

Мое приложение использует QuantumGrid (v6.56) и TSimpleDataSet в качестве источника данных.

Проблема: возникает исключение, если пользователь вводит нечисловое значение в числовое поле. Код не достигает обработчика 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

person mjn    schedule 10.08.2011    source источник
comment
OnUpdateData событие источника данных, находящегося между набором данных и сеткой?   -  person Sertac Akyuz    schedule 10.08.2011
comment
-1 - Непонятно, чего вы просите или пытаетесь достичь. Если бы речь шла о создании сообщения для пользователя о недопустимой записи, вы могли бы прокомментировать ответ, показывающий, как это сделать, или прокомментировать комментарий, в котором запрашивалось разъяснение цели. Если вы настроены на перехват исключения, заключите вызов post в try-except. Иначе к чему этот вопрос?   -  person Sertac Akyuz    schedule 10.08.2011
comment
Проверка значения поля -to be- в его событии OnSetText (как в моем удаленном ответе) не зависит от метода публикации. Это должно работать, даже если сетка время от времени решит публиковать сообщения сама по себе. Во всяком случае, для TDBNavigator вы можете легко поставить обработчик для события BeforeAction и проверить там значение (если «Кнопка» — это «nbPost») и прервать, если необходимо.   -  person Sertac Akyuz    schedule 11.08.2011
comment
@Sertac отредактировал вопрос, чтобы сделать его более понятным   -  person mjn    schedule 04.02.2012
comment
Глядя на стек вызовов, я все еще думаю, что подход в удаленном ответе должен работать.   -  person Sertac Akyuz    schedule 06.02.2012


Ответы (2)


Вам нужно установить свойство «Свойства» вашего столбца в cxGrid, там вы можете назначить CurrencyEdit, чтобы пользователь мог вводить только числа, также после установки «Свойства» вы можете использовать событие OnValidate для проверки пользовательской записи.

person Cesar    schedule 11.08.2011
comment
Да, я пробовал использовать SpinEdit и сначала столкнулся с той же проблемой — пользователи могут вводить нечисловое значение в сетку и нажимать кнопку «Опубликовать» в навигаторе, что вызывало ошибку. Я переустановил версию 6.56, и она работала по-другому: если пользователь вводит нечисловые значения, нажатие кнопки «Опубликовать» возможно, но не выполняет dataset.post, поэтому ошибки не возникает. - person mjn; 11.08.2011

В вашем примере событие OnBeforePost действительно не достигнуто.

Вы упоминаете cxGrid, но дело в том, что вашу проблему легко воспроизвести.

Возьмите простой TDBEdit, связанный с TFloatField, и попробуйте ввести значение «7.7.7.7.7.7.7.7». Поля с плавающей запятой принимают десятичный разделитель, но не подтверждают, что присутствует только 1. Таким образом, ввод этого также приведет к возникновению ошибки аналогичным образом либо при выходе из поля, либо при публикации, если у вас есть ярлык, который позволяет вам это сделать.

Если вы хотите перехватить его «по пути», то TField.OnSetText, вероятно, ваш лучший выбор.

person Ken Bourassa    schedule 03.02.2012