На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> TClientDataset обработка ошибки
    Всем привет есть такой код редактирования
    ExpandedWrap disabled
      cdsF.Edit;
      cdsFMNo.AsString:=edMNo.Text;
      cdsFKomu.AsString:=edEmployee.Text;
      cdsFDataVyda4i.AsString:=edData.Text;
      cdsF.Post;

    поле cdsFMNo целого типа.
    При случайном присваивании ему не числового значения в строке
    ExpandedWrap disabled
      cdsFMNo.AsString:=edMNo.Text;

    происходит ошибка вида '<значение> is not valid integer for field MNo'
    Вопрос в том где ее можно перехватить и обработать?
    В TClientDataset есть события OnPostError и OnEditError оба не реагируют на данное исключение.
    Можно конечно заключить данный код в try..except но хотелось бы все ошибки данных обрабатывать самим TClientdataset
    возможно ли это?
      Читать про try-except
        Цитата Павел Калугин @
        Читать про try-except

        про try..except я все знаю и уже давно сына :blush:
          Цитата Delfin4ik @
          При случайном присваивании ему не числового значения в строке

          Случайностей быть не должно. Контролируй ввод, например по маске.
            Цитата Bas @
            Случайностей быть не должно. Контролируй ввод, например по маске.
            Тот же TEdit можно сделать NumericOnly (в свойствах смотри, точное название не помню).
              Цитата Delfin4ik @
              Цитата Павел Калугин @
              Читать про try-except

              про try..except я все знаю и уже давно сына :blush:

              о как.. Какой у нас старый Дельфинчик шестидесяти лет отроду завелся...
              Ладно это лирика
              Ну раз знаешь про try..except все так "оберини" им post и внутри обрабатывай ошибку
              Ну или, как СанИваныч и Bas верно пишут, не допускай ввода фигни
              1. разрешить в edMNo ввод только чисел (например в событии OnKeyPressed обработку сделать)
              2. раз поле числовое нечего ему asstring текст совать. есть же AsInteger, например
              Сообщение отредактировано: Павел Калугин -
                Цитата Павел Калугин @
                Какой у нас старый Дельфинчик шестидесяти лет отроду завелся
                Павел! Когда-то я нашего уважаемого Борисыча сынком обозвал! :D
                ЗЫ - не удержался, сорри за флуд...
                Сообщение отредактировано: #SI# -
                  Павел Калугин,#SI# - Использование преобразования очень помогает, вместо "неявного" преобразования
                    Bas, я про это и аписал вторым пунктом ;)
                      man strtointdef
                        решение было принято такое: недопускать занесения неправильных значений.
                          То есть "asstring" оставили?
                            Цитата Павел Калугин @
                            То есть "asstring" оставили?

                            ну да оставил, в редакторе же текст а поле целого типа.
                            для проверки значения решил поюзать валидатор из JEDI VCL
                              Цитата Delfin4ik @

                              Delfin4ik поле.asinteger =strtoint(edit.text)
                              Так ты сразу отловишь косяки ввода. А они будут, как ни рисуй защиту от дурака.
                                Цитата Павел Калугин @
                                как ни рисуй защиту от дурака
                                Если речь о целых числах, то защиту надо просто включить:
                                Цитата #SI# @
                                TEdit можно сделать NumericOnly (в свойствах смотри, точное название не помню)
                                  И это помешает ввести число 99999999999999999999999999999999999?
                                    Не пробовал. Констрайнты на сервере при создании таблиц пишу на допустимые значения. :tong:
                                      Цитата Павел Калугин @
                                      Цитата Delfin4ik @

                                      Delfin4ik поле.asinteger =strtoint(edit.text)
                                      Так ты сразу отловишь косяки ввода. А они будут, как ни рисуй защиту от дурака.

                                      чем это отличается от

                                      ExpandedWrap disabled
                                        поле.asString:=edit.text


                                      Добавлено
                                      Цитата Павел Калугин @
                                      И это помешает ввести число 99999999999999999999999999999999999?

                                      такая проверка легко решается даже без валидаторов JVCL простsм указанием Edit.MaxLength

                                      Добавлено
                                      но как я уже сказал все решается с помощью валидаторов JVCL
                                        Тем что сразу будет ошибка преобразования типов, которую можно легко обработать
                                          она и в моем случае будет :D

                                          Добавлено
                                          для сравнения
                                          ExpandedWrap disabled
                                            function StrToInt(const S: string): Integer;
                                            var
                                              E: Integer;
                                            begin
                                              Val(S, Result, E);
                                              if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]);
                                            end;

                                          ExpandedWrap disabled
                                            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;

                                          думаю в комметариях нет нужды :lool:

                                          Добавлено
                                          те же яйца только в профиль:D
                                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                          0 пользователей:


                                          Рейтинг@Mail.ru
                                          [ Script execution time: 0,0510 ]   [ 17 queries used ]   [ Generated: 16.04.24, 19:33 GMT ]