КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Редактор полей
End. Begin Begin Implementation Var Public Private Type Windows, Messages, SysUtils, Classes, Graphics, Controls, Uses Forms, Dialogs, StdCtrls, Grids, DBGrids, Db, DBTables; TForml = class(TForm) Memol: TMemo; DataSourcel: TDataSource; Queryl: TQuery; DBGridl: TDBGrid; Buttonl: TButton; Labell: TLabel; Label2: TLabel; procedure FormCreate(Sender: TObject); procedure ButtonlClick(Sender: TObject); (Private declarations } { Public declarations } end; Forml: TForml; {$R *.DFM} procedure TForml.FormCreate(Sender: TObject); DataSourcel.DataSet:=Queryl; DBGridl.DataSource:=DataSourcel; end; procedure TForml.ButtonlClick(Sender: TObj ect); Queryl.Close; Queryl.SQL.Assign(Memol.Lines); Queryl.Open; end;
Метод Assign выполняет присваивание одного объекта другому, при этом объекты должны иметь совместимые типы. Применительно к списку строк (класс TStrings), которому принадлежат свойства SQLкомпонента Queryl и Lines компонента Memol, подобное присваивание означает копирование информации из одного списка в другой с заменой содержимого последнего. Если размеры списков (число элементов) не совпадают, то после замены число элементов заменяемого списка становится равным числу элементов копируемого списка. Компонент Query обеспечивает выполнение SQL-запроса и является набором данных, который формируется на основе этого запроса. Формирование набора данных выполняется при активизации компонента Query вызовом метода Open или установкой свойству Active значения True. В ряде случаев при выполнении SQL-запроса не требуется возвращать набор данных, например, при удалении, вставке или модификации записей. В этом случае предпочтительнее выполнять запрос компонента Query не его открытием, а вызовом метода ExecSQL. При работе в сети вызов метода ExecSQL выполняет требуемую модификацию набора данных, не передавая в вызывающее приложение (компьютер) записи набора данных, что заметно снижает нагрузку на сеть. Компонент Query может быть связан с таблицей БД или напрямую, или содержать копии отобранных записей таблицы, доступные для чтения. Вид взаимодействия определяется свойством RequestLive типа Boolean. По умолчанию свойство имеет значение False, и набор данных Query доступен только для чтения. Если пользователю или программисту требуется возможность редактирования записей, то свойству RequestLive нужно установить значение True. В этом случае набор данных Query напрямую связывается с соответствующей таблицей, аналогично набору данных Table.
Замечание Влияние свойства RequestLive зависит от текста выполняемого SQL-запроса. Если в результате выполнения запроса не может быть получен редактируемый набор данных, то установка свойству RequestLive значения True игнорируется. Чтобы проверить результат установки значения свойству RequestLive, можно воспользоваться свойством CanModify типа Boolean. Если оно имеет значение True, то набор данных является редактируемым, если False — то нередактируемым.
Чтобы получить в результате выполнения SQL-запроса редактируемый набор данных, кроме установки свойству RequestLive значения True, должны быть выполнены следующие условия: · данные отбираются только из одной таблицы или просмотра; · таблица или просмотр допускают модификацию; · в запросе не используется операнд distinct и агрегатные (статистические) функции; · в запросе не применяется соединение таблиц; · в запросе отсутствуют подзапросы и вложенные запросы; · не используется группирование данных; · сортировка применяется только к индексированным полям.
Для локальных БД вместо компонента Table можно также использовать компонент Query. Если установить свойству SQL значение SELECT * FROM NameTableBD, а свойству RequestLive — значение True, то набор данных Query будет аналогичен набору данных Table. (Здесь NameTableBD является именем таблицы БД, которое для компонента Table задается в свойстве TableName.) Однако набор данных Query в отличие от Table не имеет системы индексов, поэтому к Query не применимы методы, использующие индексацию, например, методы FindFirst, FindLast, FindNext и FindPrior. Более подробно компонент Query и язык sql рассматриваются в лекции 8, посвя щенной реляционному доступу к данным.
2. Объекты поля
Объект поля Field имеет тип TFieid и служит полем набора данных. Тип TField является абстрактным классом и непосредственно не используется. Вместо него применяются производные классы (табл. 7.1), соответствующие типу данных, размещаемых в рассматриваемом поле набора данных. Производные классы отличаются от базового класса TField некоторыми особенностями, связанными с манипулированием конкретным типом данных, например, символьным, числовым или логическим. Далее под объектами типа TField мы будем понимать либо сам объект типа TField, либо один из производных от него объектов, например, типа TStringField (строковое значение) или TIntegerField (целочисленное значение). Таблица 7.1 Типы объектов
Объекты типа TField являются невизуальными и служат для доступа к данным соответствующих полей записей. Управляя объектами типа TField, можно управлять поведением полей, при этом все объекты полей являются независимыми друг от друга. Например, разработчик может запретить модификацию значения отдельного поля, несмотря на то, что набор данных в целом является модифицируемым и допускает изменение значений других полей. Кроме того, можно скрыть то или иное поле от пользователя, сделав его невидимым. Существуют следующие два способа задания состава полей набора данных: · по умолчанию (динамические поля); · с помощью редактора полей (статические поля).
По умолчанию при каждом открытии набора данных как на этапе проектирования, так и на этапе выполнения приложения для каждого поля набора автоматически создается свой объект типа TField. В этом случае мы имеем дело с динамическими полями, достоинством которых является корректность отображения структуры набора данных даже при ее изменении. Напомним, что для компонента Table состав полей определяется структурой таблицы, с которой этот компонент связан, а для компонента Query состав полей зависит от SQL-запроса. Однако использование динамических полей имеет и существенные недостатки, связанные с тем, что для полученного набора данных нельзя выполнить такие действия, как ограничение состава полей или определение вычисляемых полей. Поэтому при необходимости этих операций следует использовать второй способ задания состава полей. На этапе разработки приложения с помощью Редактора полей можно создавать для набора данных статические (устойчивые) поля, основные достоинства которых состоят в реализации следующих возможностей: · определение вычисляемых полей, значения которых рассчитываются с помощью выражений, использующих значения других полей; · ограничение состава полей набора данных; · изменение порядка полей набора данных; · скрытие или показ отдельных полей при выполнении приложения; · задание формата отображения или редактирования данных поля на этапе разработки приложения.
Необходимо отметить, что при модификации структуры таблицы, например, удалении поля или изменении его типа, открытие набора данных, имеющего статические поля, может привести к возникновению исключительной ситуации.
По умолчанию для каждого физического поля при открытии набора данных автоматически создается объект типа TField, а все поля в наборе данных являются динамическими и доступными Для создания статических (устойчивых) полей используется специальный Редактор полей. В случае, если хотя бы одно поле набора данных является статическим, динамические поля больше создаваться не будут. Таким образом, в наборе данных будут доступны только статические поля, а все остальные считаться отсутствующими. Определить или отменить состав статических полей можно с помощью Редактора полей на этапе разработки приложения. Замечание Для компонента Query состав полей определяется также в тексте SQL-запроса, с помощью которого можно задать или изменить состав полей набора данных, несмотря на то, что эти поля являются динамическими.
Во время выполнения приложения определить вид полей набора данных можно с помощью свойства DefaultFields типа Boolean. Если его значение равно True, то набор данных имеет поля по умолчанию, т. е. динамические, в противном случае для набора данных заданы статические поля. Для запуска Редактора полей (рис. 7.6) следует дважды щелкнуть на компоненте Table или Query или вызвать правой кнопкой мыши для этих компонентов контекстное меню и выбрать пункт Fields Editor.... Взаголовке Редактора полей выводится составное имя набора данных, например, Forml.Tablel. Для перемещения по полям используются четыре кнопки навигации Редактора или мышь. Большую часть Редактора занимает список статических полей, при этом поля перечисляются в порядке их создания, который может отличаться от порядка полей в таблице БД. Первоначально список статических полей пуст, указывая, что все поля набора данных являются динамическими. С помощью Редактора полей разработчик может выполнить следующие операции: · создать новое статическое поле; · удалить статическое поле; · изменить порядок следования статических полей.
Кроме того, для любого выбранного в редакторе статического поля с помощью Инспектора объектов возможно задание или изменение свойств этого поля (объекта типа TField) и определение обработчиков его событий. Подобные действия разрешается производить благодаря тому, что соответствующие статическим полям объекты типа TField доступны на этапе разработки приложения.
Для создания статического поля следует вызвать контекстное меню Редактора полей и выбрать пункт Add Fields (Добавить поля), в результате чего появляется диалоговое окно добавления новых полей (рис. 7.7). В списке Available fields (Доступные поля) окна содержатся все те поля набора данных, которые еще не являются статическими. После выбора одного или нескольких полей и нажатия кнопки ОК эти поля добавляются в состав статических полей набора данных. Добавленное статическое поле является полем данных и связано с конкретным физическим полем таблицы БД.
Рис. 7.6. Редактор полей Рис. 7.7.Добавление новых статических полей
Для добавления в список всех физических полей таблицы (для набора данных Table) или результата выполнения SQL-запроса (для набора данных Query) нужно выбрать в контекстном меню Редактора полей пункт Add all Fields (Добавить все поля). При каждом открытии (в том числе при разработке приложения) набора данных выполняется проверка возможности создания экземпляров класса TField для статических полей. Если поле вследствие какой-нибудь ошибки является недопустимым, и создание объекта типа TField невозможно, то генерируется исключительная ситуация, а набор данных закрывается. Для удаления статического поля нужно выбрать пункт Delete контекстного меню или выделить в списке поле и нажать клавишу <Delete>. После удаления статического поля оно становится недоступным для операций в программе, однако в случае необходимости его снова можно сделать статическим, добавив в список Редактора полей. При этом следует иметь в виду, что все свойства этого поля устанавливаются заново, а все сделанные ранее изменения теряются. Замечание: Если удалены все статические поля, то тогда все поля набора данных становятся динамическими и доступными при выполнении приложения.
Порядок следования полей определяется их местом в списке Редактора полей. По умолчанию порядок полей соответствует порядку физических полей в таблицах БД. Его можно изменить, перемещая поля в списке с помощью мыши или комбинаций клавиш <Ctrl>+<Page Up> и <Ctrl>+<Page Down>. Замечание Если для набора данных определены статические поля, то изменение значения свойства TabieName этого набора данных может привести к ошибке, что обычно и происходит. Это связано с тем, что в новой таблице, связываемой с набором данных, могут отсутствовать физические поля, для которых были созданы статические поля. В таких случаях программист должен предусматривать соответствующие операции, например, формирование нового состава статических полей.
Существует три типа статических полей: · поле данных, связанное с соответствующим физическим полем таблицы; · вычисляемое поле, значение которого рассчитывается в обработчике события OnCalcFields во время выполнения приложения; · поле выбора, значение которого можно выбирать из списка, формируемого на основе заданных критериев и правил.
Для создания нового статического поля любого типа нужно выбрать в контекстном меню Редактора полей пункт New Field..., в результате чего открывается одноименное диалоговое окно (рис. 7.8). Для задания общих свойств (параметров) нового поля используется группа управляющих элементов Field properties (Свойства поля). В строке Name задается значение свойства FieldName, являющееся именем поля, а в строке Component — значение свойства Name, являющееся названием компонента (объекта типа TField) поля. При программировании обычно используется имя поля. Значение в строке Component формируется Delphi автоматически, и попытка изменить его не приводит к желаемому результату. В панелях Ttype и Size указываются тип данных и размер поля. Тип данных обязательно задается для всех полей, а необходимость задания размера зависит от типа данных. Например, для поля с типом данных Integer задание размера не имеет смысла, а для типа String размер поля ограничивает максимальную длину строки. Рис. 7.8. Окно создания статического поля
Тип нового поля выбирается с помощью группы переключателей Field type из следующих вариантов: · Data — поле данных; · Calculated — вычисляемое поле; · Lookup — поле выбора. В группе Lookup definition (Определение выбора) для поля выбора устанавливаются такие параметры, как набор данных и поля связи, а также поля для формирования списка выбора и результата. После создания нового статического поля его свойства становятся доступными через Инспектор объектов и могут быть изменены. При этом каждому параметру, задаваемому с помощью панели ввода или переключателя окна (рис. 7.8), соответствует определенное свойство объекта типа TField (табл. 7.2). Все свойства объекта доступны через Инспектор объектов, за исключением свойства FieldName, которое доступно только во время выполнения приложения, однако при разработке приложения значение этого свойства видно в окне Редактора полей. Значение параметра Tуре определяет класс объекта Field, который будет соответствовать статическому полю, например, для типа String — это TStringField, а для типа Float — это TFloatField.
Таблица 7.2 Свойства объекта поля
Свойство FieldKind типа TFieldKind определяет тип поля и принимает следующие значения: · fkData — поле данных; · fkCalculated — вычисляемое поле; · fkLookupField — поле выбора; · fkInternalCalc — вычисляемое поле, которое сохраняется в наборе данных; · fkAggregate — поле, содержащее агрегированный результат.
Статическое поле данных создается для соответствующего физического поля таблицы рассмотренным выше способом, в то время как создание вычисляемого поля или поля выбора является более сложной задачей. Для создания статического вычисляемого поля нужно выполнить следующие действия: · в окне создания статического поля задать имя и тип поля, а также выбрать переключатель Calculated; · для набора данных, содержащего поле, подготовить код обработчика события OnCalcFields типа TDataSetNotifyEvent, в котором этому полю присваивается требуемое значение, при этом для расчета значения вычисляемого поля можно использовать значения других полей, а также переменные и константы программы.
После создания вычисляемого поля его свойство FieldKind автоматически получает значение fkCalculated. Кроме того, также автоматически свойству Calculated типа Boolean устанавливается значение True, указывающее на то, что это поле является вычисляемым. Для полей другого типа свойство Calculated имеет значение False. Событие OnCalcFields предназначено для определения значений всех вычисляемых полей набора данных. Оно генерируется каждый раз при считывании записи из таблицы, а также при изменении значений невычисляемых полей, если свойству AutoCalcFields типа Boolean установлено значение True (по умолчанию). На время выполнения обработчика события onCalcFieids набор данных переводится в режим dsCalcFields расчета вычисляемых полей, а затем возвращается в предыдущий режим. Замечание В обработчике события OnCalcFields можно присваивать значения вычисляемым полям, а также полям выбора (в том числе не входящим в состав списка выбора). Попытка изменить значение поля данных (физического поля таблицы) вызывает исключительную ситуацию. Рассмотрим пример, иллюстрирующий использование вычисляемых полей. Пусть таблица включает в свой состав три поля: Name — название товара, Price — цена (в рублях) единицы товара и Number — количество товара. Набор данных должен содержать для каждого товара также данные об общей стоимости товара в рублях и в условных единицах. Общая стоимость определяется на основании цены единицы товара и количества товара, поэтому в набор данных добавляются два вычисляемых поля: Total и TotalUE для рублей и условных единиц, соответственно (рис. 7.9). Рис. 7.9. Использование вычисляемых полей
Для вычисления значений новых полей используется код обработчика события OnCalcFieids, приведенный ниже. Обращение к вычисляемым полям и полям данных выполнено разными способами: по имени компонента (для вычисляемых полей Total и TotalUE) и по имени поля (для полей данных Price и Number). Следует иметь в виду, что поля Price и Number тоже должны быть статическими, в противном случае при попытке обращения к ним произойдет ошибка. В примере статическим является также поле Name. При расчете стоимости в условных единицах предполагается, что обменный курс составляет 25. В принципе значение этого коэффициента должно быть переменным значением с возможностью редактирования его пользователем. // Отформатировать значения поля можно следующим образом // TablelTotalUE.DisplayFormat: = '#####. ##' procedure TForml.TablelCalcFields(DataSet: TDataSet);
Дата добавления: 2014-01-11; Просмотров: 1062; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |