Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.48.212] |
|
Сообщ.
#1
,
|
|
|
Всем привет есть такой код редактирования
cdsF.Edit; cdsFMNo.AsString:=edMNo.Text; cdsFKomu.AsString:=edEmployee.Text; cdsFDataVyda4i.AsString:=edData.Text; cdsF.Post; поле cdsFMNo целого типа. При случайном присваивании ему не числового значения в строке cdsFMNo.AsString:=edMNo.Text; происходит ошибка вида '<значение> is not valid integer for field MNo' Вопрос в том где ее можно перехватить и обработать? В TClientDataset есть события OnPostError и OnEditError оба не реагируют на данное исключение. Можно конечно заключить данный код в try..except но хотелось бы все ошибки данных обрабатывать самим TClientdataset возможно ли это? |
Сообщ.
#2
,
|
|
|
Читать про try-except
|
Сообщ.
#3
,
|
|
|
Цитата Павел Калугин @ Читать про try-except про try..except я все знаю и уже давно сына |
Сообщ.
#4
,
|
|
|
Цитата Delfin4ik @ При случайном присваивании ему не числового значения в строке Случайностей быть не должно. Контролируй ввод, например по маске. |
Сообщ.
#5
,
|
|
|
Цитата Bas @ Тот же TEdit можно сделать NumericOnly (в свойствах смотри, точное название не помню). Случайностей быть не должно. Контролируй ввод, например по маске. |
Сообщ.
#6
,
|
|
|
Цитата Delfin4ik @ Цитата Павел Калугин @ Читать про try-except про try..except я все знаю и уже давно сына о как.. Какой у нас старый Дельфинчик шестидесяти лет отроду завелся... Ладно это лирика Ну раз знаешь про try..except все так "оберини" им post и внутри обрабатывай ошибку Ну или, как СанИваныч и Bas верно пишут, не допускай ввода фигни 1. разрешить в edMNo ввод только чисел (например в событии OnKeyPressed обработку сделать) 2. раз поле числовое нечего ему asstring текст совать. есть же AsInteger, например |
Сообщ.
#7
,
|
|
|
Цитата Павел Калугин @ Павел! Когда-то я нашего уважаемого Борисыча сынком обозвал! Какой у нас старый Дельфинчик шестидесяти лет отроду завелся ЗЫ - не удержался, сорри за флуд... |
Сообщ.
#8
,
|
|
|
Павел Калугин,#SI# - Использование преобразования очень помогает, вместо "неявного" преобразования
|
Сообщ.
#9
,
|
|
|
Bas, я про это и аписал вторым пунктом
|
Сообщ.
#10
,
|
|
|
man strtointdef
|
Сообщ.
#11
,
|
|
|
решение было принято такое: недопускать занесения неправильных значений.
|
Сообщ.
#12
,
|
|
|
То есть "asstring" оставили?
|
Сообщ.
#13
,
|
|
|
Цитата Павел Калугин @ То есть "asstring" оставили? ну да оставил, в редакторе же текст а поле целого типа. для проверки значения решил поюзать валидатор из JEDI VCL |
Сообщ.
#14
,
|
|
|
Цитата Delfin4ik @ Delfin4ik поле.asinteger =strtoint(edit.text) Так ты сразу отловишь косяки ввода. А они будут, как ни рисуй защиту от дурака. |
Сообщ.
#15
,
|
|
|
Цитата Павел Калугин @ Если речь о целых числах, то защиту надо просто включить:как ни рисуй защиту от дурака Цитата #SI# @ TEdit можно сделать NumericOnly (в свойствах смотри, точное название не помню) |
Сообщ.
#16
,
|
|
|
И это помешает ввести число 99999999999999999999999999999999999?
|
Сообщ.
#17
,
|
|
|
Не пробовал. Констрайнты на сервере при создании таблиц пишу на допустимые значения.
|
Сообщ.
#18
,
|
|
|
Цитата Павел Калугин @ Цитата Delfin4ik @ Delfin4ik поле.asinteger =strtoint(edit.text) Так ты сразу отловишь косяки ввода. А они будут, как ни рисуй защиту от дурака. чем это отличается от поле.asString:=edit.text Добавлено Цитата Павел Калугин @ И это помешает ввести число 99999999999999999999999999999999999? такая проверка легко решается даже без валидаторов JVCL простsм указанием Edit.MaxLength Добавлено но как я уже сказал все решается с помощью валидаторов JVCL |
Сообщ.
#19
,
|
|
|
Тем что сразу будет ошибка преобразования типов, которую можно легко обработать
|
Сообщ.
#20
,
|
|
|
она и в моем случае будет
Добавлено для сравнения function StrToInt(const S: string): Integer; var E: Integer; begin Val(S, Result, E); if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]); end; procedure TIntegerField.SetAsString(const Value: string); var E: Integer; L: Longint; begin if Value = '' then Clear else begin Val(Value, L, E); if E <> 0 then DatabaseErrorFmt(SInvalidIntegerValue, [Value, DisplayName]); SetAsInteger(L); end; end; думаю в комметариях нет нужды Добавлено те же яйца только в профиль:D |