
- •1. Наборы данных
- •Var I: integer;
- •1.1. Состояния наборов данных
- •If not CheckBoxl.Checked then Abort;
- •If not CheckBoxl.Checked then begin
- •If CheckBox2.Checked then
- •If CheckBox2.Checked then begin
- •1.2. Режимы наборов данных
- •1.3. Доступ к полям
- •Var n: integer;
- •Var X: integer;
- •Var X: integer;
- •1.4. Особенности набора данных Table
- •If OpenDialogl.Execute then begin
- •Var n: integer;
- •If Editl.CanFocus then Editl.SetFocus;
- •1.5. Особенности набора данных Query
- •Interface
- •Implementation
- •2. Объекты поля
- •2.1 Редактор полей
- •2.2. Операции с полями
- •Var X: integer;
- •Var s: string;
- •X: real;
- •Var s: string;
- •X: real;
- •If not Tablel.Fields[2].IsValidChar(Editl.Text[1]) then
- •If (TablelCode.Required) and (TablelCode.IsNull)
- •3. Источник данных
- •Var n: integer;
- •1. Отображение и редактирование значения логического поля
- •2. Отображение и выбор значения поля
- •3. Отображение и выбор значения поля из списка
- •3.1. Простой и комбинированный списки
- •3.2. Списки, сформированные по значениям поля набора данных
- •4. Представление записей в табличном виде
- •4.1 Характеристики сетки
- •Var r :tRect;
- •4.2. Столбцы сетки
- •Var c, n :integer;
- •4.3. Использование модифицированной сетки
- •5. Использование навигационного интерфейса
- •6. Вывод графических изображений
- •Interface
- •Implementat ion
- •If OpenPictureDialogl.Execute then
- •If SavePictureDialogl.Execute then
- •7. Построение диаграмм
- •Var n: integer;
Var s: string;
X: real;
begin
// Доступ к полю по его имени в наборе данных
s:=Tablel.FieldByName('Salary').Value;
x:=Tablel.FieldByName('Salary').Value;
Label1.Caption:=s;
Label2.Caption:=FloatToStr(x);
// Доступ к полю как к отдельному компоненту
х:=TablelSalary.Value;
Label3.Caption:=FloatToStr(x);
// Поле вещественного типа,
// в связи с чем следующий оператор присваивания недопустим
// s:=TablelSalary.Value;
end;
Здесь чтение значения поля Salary текущей записи набора данных Tablel выполняется несколькими способами. При доступе к полю по имени в наборе данных значение вещественного поля Salary можно читать и использовать и как строковое, и как вещественное значение. При доступе к полю как к отдельному компоненту тип переменной, в данном случае х, должен соответствовать типу поля.
Замечание
Доступ к полю по имени объекта типа TField, например, Tableisalary, возможен только для статических полей, которые существуют на этапе разработки приложения. Попытка использовать имя объекта динамического поля приводит к ошибке при компиляции, т. к. объект поля еще не создан.
Поскольку при доступе к полю с помощью свойства Value программист должен обеспечивать преобразование и согласование типов значений, то часто более удобно использовать варианты свойства AsXXX:
AsVariant типа Variant;
AsString типа String;
As Integer типа Longint;
AsFloat типа Double;
AsCurrency типа Currency;
AsBoolean типа Boolean;
AsDateTime типа TdateTime.
При использовании любого из этих свойств выполняется автоматическое преобразование типа значения поля к типу, соответствующему названию свойства. При этом преобразование должно быть допустимо, в противном случае возникает ошибка компиляции по несоответствию типов, например, при попытке прочитать логическое значение как целочисленное.
Приведем теперь пример, где доступ к значению поля происходит с помощью свойств AsXXX:
procedure TForml.Button2Click(Sender: TObject);
Var s: string;
X: real;
begin
// Доступ к полю по его имени в наборе данных
s:=Tablel.FieldByName('Salary').AsString;
x:=Tablel.FieldByName('Salary').AsFloat;
Label1.Caption:=s; Label2.Caption:=FloatToStr(x) ;
// Доступ к полю как к отдельному компоненту
s:=TablelSalary.AsString;
х:=TablelSalary.AsFloat;
Label3.Caption:=s;
Label4.Caption:=FloatToStr(x);
end;
Как и в предыдущем примере, чтение значения поля Salary осуществляется несколькими способами. Доступ к полю выполняется по имени поля и по имени объекта поля, а значение поля интерпретируется как строковое или как вещественное.
Замечание
Для того чтобы записать значение в поле, оно должно допускать модификацию, а набор данных должен находиться в соответствующем режиме, например, редактирования или вставки.
При необходимости программист может запретить модификацию поля, а также скрыть его, используя свойства ReadOnly и Visible типа Boolean. Сама возможность модификации данных в отдельном поле определяется значением свойства CanModify типа Boolean. Напомним, что свойства ReadOnly и CanModify есть также и у набора данных: они определяют возможность модификации набора данных (всех его полей) в целом.
Замечание
Даже если набор данных является модифицируемым и его свойство CanModify имеет значение True, для отдельных полей этого набора редактирование может быть запрещено, и любая попытка изменить значение такого поля вызовет исключительную ситуацию.
Если поле является невидимым (свойство Visible установлено в False), но разрешено для редактирования (свойство ReadOnly стоит в False), то можно изменить значения этого поля программно.
Рассмотрим управление видимостью поля и возможностью его модификации на примере:
Tablel.FieldByName('Number').ReadOnly:=true;
Tablel.FieldByName('Salary').Visible:=false;
Здесь для поля Number запрещаются любые изменения, а поле salary скрывается, однако для него по-прежнему допускаются чтение и изменение значения.
Для полей, имеющих типы TBLOBField (BLOB-объект), TGraphicField (графическое изображение) и TMemoField (текст), доступ к их содержимому выполняется обычными для объектов данного типа способами. Например, для загрузки содержимого из файла можно использовать метод LoadFromFile.
Проверка типа и значения поля
При выполнении программы можно выяснить тип данных конкретного поля. Это удобно делать в случае, когда, например, типы данных полей таблиц БД заранее неизвестны.
Тип данных поля таблицы определяет свойство DataType типа TFieldType, принимающее следующие значения:
ftUnknown — тип неизвестен или неопределен;
ftString — короткая строка длиной не более 255 символов;
ftSmallInt — короткое целое число;
ftInteger — целое число;
ftWord — целое число без знака;
ftBoolean — логическое значение;
ftFloat — вещественное число;
ftCurrency — денежное значение;
ftBCD — число в формате BCD (двоично-десятичный формат);
ftDate — дата;
ftTime — время;
ftDateTime — дата и время;
ftBytes — байтовое значение фиксированной длины;
ftVarBytes — байтовое значение переменной длины;
ftAutoInc — автоинкрементное значение;
ftBlob — BLOB-объект (Binary Large Object — большой двоичный объект);
ftMemo — текст (Memo);
ftGraphic — графический объект;
ftFmtMemo — форматированный текст (Memo);
ftParadoxoie — поле OLE для таблицы Paradox;
ftDBaseOle — поле OLE для таблицы dBASE;
f tTypedBinary — типированное двоичное значение;
ftCursor — курсор для хранимой процедуры Oracle;
ftFixedChar — фиксированное количество символов;
ftWideString — строка;
ftLargeInt — длинное целое число;
ftADT — значение абстрактного типа;
ftArray — массив;
ftReference — REF-поле;
ftDataSet — DataSet-поле.
Программист с помощью специальных свойств может задать ограничения для вводимых в поля значений, а также проверить введенные значения.
Набор символов, допускаемых при вводе значений поля, зависит от типа данных поля:
ftBoolean — все символы;
ftSmallInt — цифры 0 . . . 9, знаки + и -;
ftWord — цифры 0 . . . 9, знаки + и -;
ftAutoInc — цифры 0 . . . 9, знаки + и -;
ftDate — все символы;
ftInteger — цифры 0 . . . 9, знаки + и -;
ftTime — все символы;
ftCurrency — цифры 0 . . . 9, знаки + и -, символы E или е, разделитель разрядов целой и дробной части;
ftDateTiine — все символы;
ftFloat — цифры 0 . . . 9, знаки + и -, символы E или е, разделитель разрядов целой и дробной части;
ftBCD — цифры 0 . . . 9, знаки + и -, символы E или е, разделитель разрядов целой и дробной части;
ftString, ftVarBytes, ftBytes, ftBlob, ftDBaseOle, ftFmtMemo, ftGraphic, ftMemo, ftParadoxOle, ftTypedBinary, ftUnknown И ftCursor — все символы.
Отметим, что разделитель разрядов целой и дробной части числа (десятичный разделитель) зависит от установок Windows, выполненных через панель управления.
Набор допустимых для поля символов содержит свойство validChars типа TFieldChars, который описан как множество символов:
type TFieldChars = set of Char;
Для проверки, разрешен ли символ для ввода в качестве значения поля, удобно использовать метод IsValidChar (InputChar: Char): Boolean. Он возвращает значение True, если заданный параметром InputChar символ является для данного поля допустимым, и False — если символ не допускается.
Вот как осуществляется проверка допустимости символа в программе: