![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Если пользователь не вводит данные при добавлении/редактировании в поле которое Not Null, то появляется такая ошибка.
Мне надо перехватить эту ошибку и вместо неё вывести аналогичную по смыслу но локализованную и вместо имя поля из базы вывести текст из заголовка DBGrid'а который соответствует этому полю, подскажите пожалуйста решение для этого. |
#2
|
|||
|
|||
![]() try-except
|
#3
|
|||
|
|||
![]() понятно что try-except, а можно ли узнать какое поле ошибку вызвало ? В самой ошибке поле пишется.
|
#4
|
|||
|
|||
![]() Лежит в E.Message.
Как понять отдельно - ну тут сложный вопрос. В конце концов можно просто проверить наличие некоторых ключевых слов в этом сообщении. |
#5
|
|||
|
|||
![]() Спасибо, решение конечно не очень для меня удобное, у меня в базе полей ого-го сколько, ну наверное буду так делать раз других вариантов нету.
|
#6
|
|||
|
|||
![]() Посидел немного - придумал решение, с использованием обработчика OnPostError, вот код может кому будет интересно/пригодится, написано универсально, чтоб можно было использовать 1 обработчик на разных ДатаСетах, если для одного дата сета делать то он будет намного проще, преимущество по сравнению со стандартной ошибкой ещё в том что здесь перечисляются все поля которые пользователь не ввёл а не только первое попавшиеся.
Код:
procedure TMainForm.dstSpcPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); var i:integer; s,gridName:string; begin S := ''; gridName:=GetGridName(DataSet.Name); for i := 0 to DataSet.FieldCount - 1 do begin if DataSet.Fields[i].Required and DataSet.Fields[i].IsNull then s := s +'Поле '+(FindComponent(gridName) as TDBGridEh).Columns[GetColumnByName(DataSet.Fields[i].FullName,(FindComponent(gridName) as TDBGridEh))].Title.Caption+' не может быть пустым. '; end; E.Message:=s; end; function TMainForm.GetColumnByName(const sFieldName : String; GridEh : TDBGridEh): Integer; var i:Integer; begin Result := -1; for i := 0 to GridEh.Columns.Count-1 do begin if GridEh.Columns[i].FieldName = sFieldName then begin Result := i; break; end; end; end; function TMainForm.GetGridName(a:string):string; var i:integer; begin result := ''; for I:= 0 to ComponentCount - 1 do if (Components[i] is TDBGridEh) then if (Components[i] as TDBGridEh).DataSource.DataSet.Name = a then begin result := (Components[i] as TDBGridEh).Name; break; end; end; |