- •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. Режимы наборов данных
- •Var n: integer;
- •1.3. Доступ к полям
- •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 I: integer;
. . .
Tablel.First;
for i:=1 to Table1.RecordCount do begin
// Здесь можно расположить операторы, выполняющие
// обработку очередной записи
Table1.Next;
end;
Перебор всех записей набора данных осуществляется в цикле, для чего переменная i цикла последовательно принимает значения от 1 до RecordCount. Перед началом цикла вызовом метода First выполняется переход к первой записи набора данных. В цикле для перехода к следующей записи вызывается метод Next.
Для локальных таблиц dBase или Paradox составляющие набор данных записи последовательно нумеруются, отсчет начинается с единицы. Номер записи в наборе данных определяет свойство RecNo типа Longint, которое доступно во время выполнения программы.
Номер текущей записи можно узнать, например, так:
Editl.Text:=IntToStr(Table1.RecNo) ;
Замечание
При изменении порядка сортировки или фильтрации нумерация записей также изменяется.
Для таблиц Paradox свойство RecNo можно использовать для перехода к требуемой записи, установив в качестве значения свойства номер записи. Так, в операции
Table1.RecNo:=StrToInt(Edit1.Text) ;
выполняется переход к записи, номер которой содержится в поле редактирования Editl. Указанная запись становится текущей.
Для выполнения операций с наборами данных используются два способа доступа к данным:
навигационный;
реляционный.
Навигационный способ доступа заключается в обработке каждой отдельной записи набора данных. Этот способ обычно используется в локальных БД или в удаленных БД небольшого размера. При навигационном способе доступа каждый набор данных имеет невидимый указатель текущей записи. Указатель определяет запись, с которой могут выполняться такие операции, как редактирование или удаление. Поля текущей записи доступны для просмотра. Например, компоненты DBEdit и DBText отображают содержимое соответствующих полей именно текущей записи. Компонент DBGrid указывает текущую запись с помощью специального маркера.
В разрабатываемом приложении навигационный способ доступа к данным можно реализовать, используя любой из компонентов Table или Query.
Реляционный способ доступа основан на обработке группы записей. Если требуется обработать одну запись, все равно обрабатывается группа, состоящая из одной записи. При реляционном способе доступа используются SQL-запросы, поэтому его называют также SQL-ориентированным. Реляционный способ доступа ориентирован на работу с удаленными БД и является для них предпочтительным. Однако его можно использовать и для локальных БД.
Реляционный способ доступа к данным в приложении можно реализовать с помощью компонента Query.
1.1. Состояния наборов данных
Наборы данных могут находиться в открытом или закрытом состояниях, на что указывает свойство Active типа Boolean. Если свойству Active установлено значение True, то набор данных открыт. Открытый компонент Table содержит набор данных, соответствующий данным таблицы, связанной с ним через свойство TableName. Для открытого компонента Query набор данных соответствует результатам выполнении SQL-запроса, содержащегося в свойстве sql этого компонента. Если свойство Active имеет значение False (по умолчанию), то набор данных закрыт, и его связь с БД разорвана.
Набор данных может быть открыт на этапе разработки приложения. Если при этом к набору данных через источник данных DataSource подключены визуальные компоненты, например, DBGrid или DBEdit, то они отображают соответствующие данные таблицы БД.
Замечание
На этапе проектирования приложения визуальные компоненты отображают данные записей набора данных, но перемещение по набору данных и редактирование записей невозможны. Исключение составляет возможность перемещения текущего указателя с помощью полос прокрутки компонента DBGrid.
Если по каким-либо причинам открытие набора данных невозможно, то при попытке установить свойству Active значение True выдается сообщение об ошибке, а свойство Active сохраняет значение False. Одной из причин невозможности открытия набора данных может являться неправильное значение свойства TableName или SQL.
Замечание
На этапе проектирования свойству Active наборов данных автоматически устанавливается значение False при изменении Значения СВОЙСТВ DataBaseName, TableName или SQL.
Приводимый пример демонстрирует управление состоянием набора данных с помощью свойства Active, которое используется для открытия и закрытия набора данных Query1:
procedure TForm1.ButtonlClick(Sender: TObject);
begin
Queryl.Active:=false;
Queryl.SQL.Clear;
Queryl.SQL.Add('select * from Examplel.db') ;
Queryl.Active:=true;
end;
Управлять состоянием набора данных можно также с помощью методов Open и Close.
Процедура Open открывает набор данных, ее вызов эквивалентен установке свойству Active значения True. При вызове метода Open генерируются события BeforeOpen и AfterOpen и соответственно вызываются процедуры-обработчики этих событий.
Процедура Close закрывает набор данных, ее вызов эквивалентен установке свойству Active значения False. При вызове метода Close генерируются события BeforeClose и AfterClose, а также вызываются процедуры-обработчики этих событий.
В примере показывается управление состоянием набора данных (открытие и закрытие) с помощью методов Open и Close:
procedure TForml.Button2Click(Sender: TObject);
begin
Queryl.Close;
Queryl.SQL.Clear;
Queryl.SQL.Add('select * from Example2.db');
Query1.Open;
end;
События BeforeOpen и AfterOpen имеют тип TDataSetNotifyEvent, который описывается следующим образом:
type TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;
В этом описании параметр DataSet определяет набор данных, для которого произошло событие.
Событие BeforeOpen возникает непосредственно перед открытием набора данных. В обработчике этого события можно выполнить проверку определенных условий, и если они не соблюдаются, то открытие набора данных может быть запрещено.
Замечание
Обработчик события не содержит специального параметра, с помощью которого можно запретить открытие набора данных. Одним из вариантов запрета открытия является принудительное возбуждение исключительной ситуации.
Рассмотрим в качестве примера следующую процедуру:
procedure TForml.TablelBeforeOpen(DataSet: TDataSet);
begin
