Russian Belarusian English German Japanese Ukrainian

Проверка типа и значения поля

CuBook55

При выполнении программы можно выяснить тип данных конкретного поля. Это удобно делать в случае, когда, например, типы данных полей таблиц БД заранее неизвестны.
Тип данных поля таблицы определяет свойство DataType типа TFieldType, принимающее следующие значения:
  • ftUnknown (тип неизвестен или не определен)
  • ftString (короткая строка длиной не более 255 символов)
  • ftsmaiiint (16-битное целое)
  • ftInteger (32-битное целое)
  • ftWord (целое без знака)
  • ftBoolean (логическое значение)
  • ftFloat (вещественное число)
  • ftCurrency (денежное значение)
  • ftBCD (число в формате BCD (двоично-кодированный десятичный формат))
  • ftDate (дата)
  • ftTime (время)
  • ftDateTime (дата и время)
  • ftBytes (байтовое значение фиксированной длины)
  • ftVarBytes (байтовое значение переменной длины)
  • ftAutoInc (автоинкрементное значение)
  • ftBlob (BLOB-объект)
  • ftMemo (текст Memo)
  • ftGraphic (графический объект)
  • ftFmtMemo (форматированный текст Memo)
  • ftParadoxOle (поле OLE для таблицы Paradox)
  • ftDBaseOle (поле OLE для таблицы dBase)
  • ftTypedBinary (типизированное двоичное значение)
  • ftCursor (курсор для хранимой процедуры Oracle)
  • ftFixedChar (фиксированное количество символов)
  • ftWideString (строка)
  • ftLargeInt (длинное целое число)
  • ftADT (значение абстрактного типа)
  • ftArray (массив)
  • ftReference (REF-поле)
  • ftDataSet (DataSet-поле)
Программист с помощью специальных свойств может задать ограничения для вводимых в поля значений, а также проверить введенные значения.
Набор символов, допускаемых при вводе значений поля, зависит от типа данных поля:
  • ftBoolean - все символы
  • ftSmallInt - цифры 0..9, знаки + и -
  • ftword - цифры 0..9, знаки + и -
  • ftAutoInc - цифры 0..9, знаки + и -
  • ftDate - все символы
  • ftlnteger - цифры 0..9, знаки + и -
  • ftTime - все символы
  • ftCurrency - цифры 0..9, знаки + и -, символы Е или е, разделитель разрядов целой и дробной части
  • ftDateTime - все символы
  • ftFloat - цифры 0..9, знаки + и -, символы Е или е, разделитель разрядов целой и дробной части
  • ftBCD - цифры 0..9, знаки + и символы Е или е, разделитель разрядов целой и дробной части
  • ftString, ftVarBytes, ftBytes, ftBlob, ftDBaseOle, ftFmtMemo, ftGraphic, ftMemo, ftParadoxOle, ftTypedBinary, ftUnknown и ftcursor - все символы
Разделитель разрядов целой и дробной части числа (десятичный разделитель) зависит от установок Windows, выполненных через Панель управления.
Набор допустимых для поля символов содержит свойство ValidChars типа TFieldChars, который описан как множество символов:
typedef Set <char, 0, 255> TFieldChars;
Чтобы проверить, разрешен ли символ для ввода в качестве значения поля, удобно использовать метод:
virtual bool fastcall IsValidChar (char xnputchar);
Он возвращает значение true, если заданный параметром InputChar символ является для данного поля допустимым, и false если символ не допускается. Вот как осуществляется проверка допустимости символа в программе:
if (!Table1->Fields->Fields[2]->IsValidChar(Edit1->Text[l]))
{
Ansistring s=Edit1->Text[1];
MessageDlg("Символ "+ s +" недопустим", mtError, TMsgDlgButtons() << mbOK, 0);
}
Если первый символ текста, введенного в компонент Edit1, является недопустимым символом для третьего поля (нумерация полей в списке начинается с нуля) набора данных Table1, то выдается сообщение об ошибке.
Проверка на корректность символа не гарантирует отсутствие ошибок при вводе значений полей. Например, для числового поля типа TintegerField не подойдет значение 12++3, хотя каждый символ является допустимым.
Для динамических полей числовых типов, например, объектов типа TIntegerField и TFloatField, свойства MinValue и MaxValue позволяют установить минимальное и максимальное возможные значения, которые могут быть введены в соответствующее поле. Тип этих свойств определяется конкретным объектом типа TField наследуемого от него.
 
Например, ограничение вводимых значений в программе может быть установлено в обработчике создания формы следующим образом:
void __fastcall TForm1::FormCreate(TObjееt *Sender)
{
Table1F_Number->MinValue = 0;
Table1F_Mumber->MaxValue = 2.6E+16;
Table1F_Int->MinValue = 0;
Table1F_Int->MaxValue = 1000;
}
Здесь для поля F_Number (вещественный тип) устанавливается допустимый Диапазон 0..2.6Е+16, а для поля F_Int (целый тип) диапазон 0..1000.
 
Такие же ограничения для динамических полей могут быть заданы с помощью Инспектора объектов и Редактора полей. Для этого нужно в Редакторе 
полей выбрать имя нужного поля и в Инспекторе объектов задать значения свойств MinValue и MaxValue.
 
Если при вводе значения в поле имеет место выход за пределы диапазона, то выдается сообщение об ошибке.
При задании вещественных констант в программе в качестве разделителя указывается точка (например: 2.6Е+16). При задании таких же вещественных констант в качестве значений свойств MinValue и MaxValue с помощью Инспектора объектов в качестве разделителя следует указывать запятую (например: 2,6Е+16).
Ограничения на вводимые значения можно определить также с помощью свойства CustomConstraint типа AnsiString. В этом свойстве допустимый диапазон задается с помощью конструкций, похожих на команды SQL или фильтры для отбора данных. Отличие заключается в том, что команды SQL и фильтры действуют при формировании наборов данных, а конструкция свойства CustomConstraint при задании ограничений на вводимые значения.
 
Задание свойства CustomConstraint выполняется с помощью Инспектора объектов, при этом используется также Редактор ограничений, вызываемый двойным щелчком мыши в строке свойства Constraints набора данных (например, Table1). Для задания нового ограничения (или редактирования имеющегося) нужно на панели инструментов Редактора ограничений нажать кнопку Add New (или выбрать мышью строку с имеющимся ограничением) и в окне Инспектора объектов в строке CustomConstraint задать (или отредактировать) ограничение.
 
Здесь для полей F_Int (целый тип) и F_Number (вещественный тип) устанавливаются диапазоны допустимых значений. В Инспекторе объектов при задании свойства CustomConstraint можно также в строке свойства ErrorMessage задать текст сообщения, которое будет выдаваться в случае нарушения заданных нами ограничений. Если для поля некоторым способом задан диапазон допустимых значений, то при любой попытке установить поле в значение, выходящее за границы этого диапазона, вызывается исключение. При этом пользователю выдается соответствующее сообщение, а значение отвергается. Контроль значений относится не только к вводу со стороны пользователя, он также действует и при изменении значения поля программным способом.
При нарушении ограничений, установленных с помощью свойства CustomConstraint, исключение возникает не сразу после занесения неверного значения в поле, а после перехода к другой записи или обновления измененной записи в таблице, например методом Post.
Разработчик может с помощью Инспектора объектов задавать через свойство DefaultExpression типа AnsiString значение по умолчанию, которое автоматически заносится в поле при добавлении новой записи в набор данных. Это свойство определяет выражение SQL, значение которого помещается в поле, для которого пользователь не обеспечивает значение самостоятельно. Для задания этого свойства следует вызвать Редактор полей набора данных (например, Table1), выбрать в нем нужное поле и в строке DefaultExpression Инспектора объектов задать выражение или значение.
Чтобы проверить, действуют ли для поля ограничения, заданные в свойствах CustomConstraint, DefaultExpression, а также в ImportedConstraint (ограничения, налагаемые сервером), используется свойство HasConstraints типа bool. Это свойство, действующее во время выполнения приложения, согласно справочной информации к C++ Builder 6, должно принимать значение true, если установлено хотя бы одно из перечисленных ограничений. В действительности такое поведение свойства HasConstraints не имеет места.
Программно можно выполнить и более сложную проверку, используя обработчики событий OnSetText (типа TFieldSetTextEvent), OnValidate и OnChange (типа TFieldNotifyEvent). Названые события возникают в указанном здесь порядке при изменении значения поля. Типы этих событий описаны так:
typedef void fastcall (__closure *TFieldSetTextEvent)(TField* Sender, const AnsiString Text);
typedef void fastcall (__closure *TFieldNotifyEvent)(TField* Sender);
Указанные события возникают до изменения значения поля, поэтому программист может при необходимости отказаться от внесения изменения. Отказ от изменения значения поля для этих событий выполняется различными способами. При использовании событий OnValidate и OnChange программист возбуждает исключение, в результате чего запись значения в поле не происходит. Если исключение не генерируется, то новое значение заносится в поле. Так как обработчик не получает нового значения поля, для доступа к нему нужно использовать свойства value или AsXXX. Следует иметь в виду, что эти свойства возвращают новое (предлагаемое для утверждения) значение поля, которое может быть и не принято, в этом случае происходит возврат к старому значению.
 
При редактировании поля пользователем события OnValidate и OnChange не вызываются до тех пор, пока не будет выполнена попытка сохранить изменения, например, нажатием клавиши <Enter>.
 
Ниже приведен пример, как осуществляется проверка вводимых значений.
void __fastcall TForm1::Table1N_NumberValidate(TField *Sender)
{
if(Table1->FieldByName("N_Number")->AsString == '1')
{
Abort();
}
}
Здесь в поле N_Number запрещается ввод значения 1, которое зарезервировано для специальных целей. При попытке ввода неправильных значений после соответствующей проверки генерируется «тихое» исключение (путем вызова метода Abort). В результате попытка ввода отвергается, при этом сообщения не выдаются. При необходимости для выдачи сообщения о возникшем исключении можно использовать, например, функцию MessageDig, выводящую диалоговое окно. 
Чтобы задать обработчик одного из рассматриваемых нами событий для некоторого поля (в примере это статическое поле Table1N_Number), удобно выполнить следующее. В окне Редактора полей выбрать нужное поле, затем на вкладке Events Инспектора объектов двойным щелчком в строке с именем нужного события открыть заготовку процедуры его обработки.
Для события OnSetText действует противоположный порядок принятия изменений и отказа от них. Параметр Text обработчика этого события содержит новое значение, которое предложено для занесения в поле, однако запись этого значения не осуществляется автоматически. Поэтому программист должен «вручную» занести предложенное значение в поле: если этого не сделать, то поле остается без изменений. Таким образом, по умолчанию в обработчике события OnSetText новое значение отвергается.
 
Пример проверки вводимых значений с помощью обработчика события OnSetText:
void __fastcall TForm1::Table1N_NumberSet.Text (TField *Sender, const Ansistring Text)
{
if (!((Text == '1') || (Text == '5'))) // занесение значения параметра Text в поле
{
Table1->FieldByName(MN_Number")->AsString = Text;
}
}
В этом примере с помощью обработчика предотвращение ввода в поле с именем N_Number значений 1 и 5.
 
Ряд полей, например, индексное поле, не могут быть пустыми, в этом случае у поля свойство Required типа bool имеет значение true. Для проверки полей (содержат ли они отличное от пустого значение) используется свойство IsNull типа bool. Это свойство возвращает значение true, если значение поля не задано, и значение false в противном случае. Свойство IsNull можно использовать, например, в обработчиках событий OnSetText, OnValidate И OnChange.
Некоторые из описанных ограничений на значения полей также могут быть заданы при создании таблицы БД (запрет пустого значения и задание диапазона допустимых значений). В этом случае ограничения действуют на физическом уровне и не могут быть отменены.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий