
- •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;
1.2. Режимы наборов данных
Наборы данных могут находиться в различных режимах. Текущий режим набора данных определяется свойством State типа TDataSetState. Оно доступно для чтения во время выполнения приложения и может быть использовано только для текущего режима. Для перевода набора данных в требуемый режим используются специальные методы. Они могут вызываться явно (указанием имени метода) или косвенно (путем управления соответствующими визуальными компонентами, например, навигатором DBNavigator или сеткой DBGrid).
Набор данных может находиться в одном из перечисляемых ниже режимов.
dsInactive — неактивность; набор данных закрыт и доступ к его данным невозможен. В этот режим набор данных переходит после своего закрытия, когда свойству Active установлено значение False.
dsBrowse — осуществляется навигация по записям набора данных и просмотр данных. В этот режим набор данных переходит следующим образом:
из режима dsInactive — при установке свойству Active значения True;
из режима dsEdit — при вызове метода Post или Cancel;
из режима dsInsert — при вызове метода Post или Cancel.
dsEdit — редактирование текущей записи. В этот режим набор данных переходит из режима dsBrowse при вызове метода Edit.
dsInsert — вставка новой записи. В этот режим набор данных переходит из режима dsBrowse при вызове методов Insert, InsertRecord, Append или AppendRecord.
dsSetKey — поиск записи, удовлетворяющей заданному критерию. В этот режим набор данных переходит из режима dsBrowse при вызове методов SetKey, SetRangeXXX, FindKey, GotoKey, FindNearest или GotoNearest. Возможен только для компонента TTаblе, т. к. для компонента Query отбор записей осуществляется средствами языка SQL.
dsCalcFields — расчет вычисляемых полей. Используется обработчик события OnCalcFields.
dsFilter — фильтрация записей. В этот режим набор данных автоматически переходит из режима dsBrowse каждый раз, когда выполняется обработчик события OnFilterRecord. В режиме блокируются все попытки изменения записей. После завершения работы обработчика события OnFilterRecord набор данных автоматически переводится в режим dsBrowse.
dsNewValue — обращение к значению свойства TField.NewValue.
dsOldValue — обращение к значению свойства TField.OldVaiue.
dsCurValue — обращение к значению свойства TField.CurValue.
dsBlockRead — отсутствие модификации управляющих элементов и генерации событий при вызове метода Next.
dsInternalCalc — указание на необходимость вычислять значения полей, свойство TField.FieldKind которых имеет значение fkInternalCalc.
dsOpening — открытие набора данных.
Взаимосвязи между основными режимами наборов данных показаны на рис. 7.1, где приведены также некоторые методы и свойства, с помощью которых набор данных переходит из одного режима в другой.
Рис. 7.1. Взаимосвязи режимов наборов данных
Иногда при описании операций, выполняемых с записями набора данных, под режимом редактирования подразумевается не только режим dsEdit изменения полей текущей записи, но и режим dsInsert вставки новой записи. Тем самым режим редактирования понимается в широком смысле слова как режим модификации набора данных.
Режимы dsNewValue, dsOldValue, dsCurValue, dsBlockRead и dsInternalCalc используются набором данных для собственных нужд, и программистом обычно не анализируются.
При выполнении программы определить режим набора данных можно с помощью одноименных свойств State типа TDataSetState самого набора данных и связанного с ним источника данных DataSource. При изменении режима набора данных для источника данных DataSource генерируется событие OnStateChange типа TNotifyEvent.
Рассмотрим следующий пример:
procedure TForml.DataSourcelStateChange(Sender: TObject);
begin
case DataSourcel.State of
dslnactive: Labell.Caption:='Ha6op данных закрыт';
dsBrowse: Labe1l.Caption:='Просмотр набора данных';
dsEdit: Labell.Caption:='Редактирование набора данных';
dsInsert: Labell.Caption:='Вставка записи в набор данных'
else Labell.Caption:='Режим набора данных не определен';
end;
end;
В приведенной процедуре определяется режим набора данных, связанного с источником данных DataSource1, и информация об этом режиме выводится в надписи Label1. При этом используется свойство State источника данных. Код, выполняющий анализ режима, помещен в обработчик события OnStateChange компонента DataSource1.