Студопедия

КАТЕГОРИИ:


Архитектура-(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

Типы объектов

Тип объекта Вид поля
TBLOLBField BLOB-поле
TMemoField Мемо-поле (поле комментария)
TGraphicField Графическое поле
TBooleanField Логическое поле
TBinaryField Двоичное поле
TBytesField Поле байтов фиксированной длины
TVarBytesField Поле байтов для значений переменной длины
TDateTimeField Поле даты и времени
TDateField Поле даты
TTimeField Поле времени
TNumericField Числовое поле
TBCDField Поле BCD-значения
TFloatField Поле вещественного значения
TCurrencyField Поле значения денежной суммы
TIntegerField Поле целочисленного значения (32 разряда)
TAutoincField Поле автоинкрементного значения (32 разряда)
TSmallintField Поле целочисленного короткого значения (16 разрядов)
TLargeintField Поле целочисленного длинного значения (64 разряда)
TWordField Поле целочисленного значения без знака (16 разрядов)
TStringField Поле строкового значения

 

Объекты типа 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, являющееся именем поля, а в строке Compo­nent — значение свойства 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

Свойства объекта поля

Свойство объекта поля Управляющий элемент
FieidName Name
Name Component
Size (для строковых полей) Size
Precision (для числовых полей)  
FieldKind Field type
KeyFields Key Fields
LookupKeyFields Lookup Keys
LookupDataset Dataset
LookupResultField Result Field

 

Свойство 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; Просмотров: 1030; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.273 сек.