IX.Значення поля

VIII.Робота з полями.

Delphi дозволяє одержати доступ до полів будь-якого набору даних за допомогою класу Tfield і його нащадків. Класc дозволяє не тільки зчитувати або встановлювати значення обраного поля поточного запису набору даних, але і змінювати характеристики поля за допомогою модифікації його властивостей. Крім того, можна модифікувати набір даних у цілому, змінити візуальний порядок розташування полів, видаляючи поля або ж створюючи нові обраховочні або підстановочні поля.

 

Одержати доступ до значень полів у Delphi дуже просто. Компонент TDataSet по замовчуванню пропонує масив властивостей з ім'ям FieldValues[], що повертає значення певного поля як значення типу Variant. Оскільки масив FieldValues[] - це масив властивостей по замовчуванню, вам не потрібно визначати ім'я властивості для доступу до масиву. Наприклад, у наступному фрагменті коду значення поля CustName таблиці Table1 присвоюється змінній S типу String;

S:= Tablel['CustName'];

Також просто можна привласнити значення поля CustNo цілого типу змінній I:

I := Tablel['CustNo'];

Наслідком із сказаного вище є можливість зберігання значень декількох полів у масиві типу Variant. Єдиним ускладненням є те, що індекс масиву типу Variant повинний починатися з нуля, а його вміст являє собою змінні varVariant.

Масив Fields[] - це масив (з індексами, що починаються з нуля) об'єктів класу TField. Так, елемент Fields[0] повертає об'єкт TField, що представляє перше логічне поле запису. Функції FieldsByName() передається рядковий параметр, що відповідає деякому імені поля в таблиці. Таким чином, при виклику цієї функції у вигляді FieldsByName('OrderNo'} вона повинна повернути компонент TField, що являє поле OrderNo у поточному записі набору даних.

Якщо перше поле в поточному наборі даних - рядкове, зберегти його значення в змінній S типу String можна таким чином:

S:=Table1.Field[0]. AsString;

 

Властивості об'єкта TField для доступу до

значень полів.

 

Властивість тип
AsBoolean Boolean
AsFloat Double
AsInteger Longint
AsString String
AsDateTime TdateTime
Value Variant

 

У наступному фрагменті коду цілій змінній I присвоюється значення поля ‘OrderNo' у поточному записі таблиці:

I:=Table1.FieldsByName(‘OrderNo').AsInteger;

 

Х.Імена і номера полів

Для пошуку імені певного поля використовуйте властивість FieldName класу Tfield. Наприклад, у наступному фрагменті коду ім'я першого поля в поточній таблиці записується в змінну S типу String:

var

S:String;

begin

S:=Table1.Fields[0].FieldName;

end;

Таким же чином, знаючи ім'я поля, можна одержати його номер, використовуючи властивість FieldNo. У наступному фрагменті коду номер поля OrderNo поміщається в змінну I типу Integer:

 

var

I: integer;

begin

I:=Table1.FieldsByName('OrderNo'). FieldNo;

end;

Для визначення кількості полів, що утримуються в наборі даних, використовується властивість FieldList об'єкта TDataSet. Властивість FieldList являє собою лінійне уявлення усіх вкладених полів у таблицю.

 

XI.Маніпулювання полемо даних.

Нижче приведена послідовність дій, що необхідно виконати для редагування одного або декількох полів у поточному записі.

1.Викликайте метод Edit() набору даних для переключення в режим редагування.

2.Призначте нові значення необхідним полям.

3.Внесіть зміни в набір даних за допомогою виклику методу Post() або переміщення на новий запис, у результаті чого зміни будуть внесені автоматично.

Наприклад, типова процедура зміни запису виглядає так:

Table1. Edit;

Table1[‘Age']:=23;

Table1. Post;

 

Іноді потрібно працювати з наборами даних, доступними тільки для читання. Прикладом таких даних може бути інформація на компакт-диску або запит з автономним результуючим набором, не доступним для редагування. Перед тим, як починати спроби редагування даних, варто перевірити, чи не містить поточний набір дані, доступні тільки для читання. Для цього достатньо перевірити значення властивості CanModify. Якщо значення цієї властивості дорівнює True, редагування набору даних дозволяється.

 

Як і у випадку редагування, вставляти або добавляти запису в кінець набору даних можна таким чином:

1. Викликайте метод Insert() або Append() набору даних для переключення в режим вставки (Insert) або додавання (Append).

2. Присвойте значення полів нового запису набору даних.

3. Внесіть новий запис в набір даних за допомогою виклику методу Post() або переміщення на новий запис, у результаті чого зміни будуть внесені автоматично.

 

Коли ви знаходитеся в одному із режимів - Edit, Insert або Аррend (редагування, вставки або доповнення),- пам'ятаєте, що ваші зміни буд безумовно внесені при переміщенні від поточного запису до наступнго. Тому будьте уважні при використанні методів Next(), Prior(), First(), Last() і MoveBy() у процедурах редагування записів.

Якщо буде потрібно скасувати внесені в запис, але ще не зафіксовані в наборі даних зміни, це можна зробити за допомогою виклику методу Cancel(). Наприклад:

Table1. Edit;

Table1['Age']:=23;

Table1. Cancel;

Метод Cancel() відміняє внесені, але не зафіксовані зміни і повертає набір даних із режиму Edit, Append або Insert у режим Browse.

Метод Delete() видаляє поточний запис із набору даних. Наприклад, у наступному фрагменті коду видалиться останній запис у таблиці;

Table1. Last;

Table1. Delete;

 

XII.Редактор полів.

У Delphi існує утіліта Fields Editor (Редактор полів), що надає можливість більш гнучкого керування полями набору даних. Цей інструмент можна використовувати для перегляду окремого набору даних у вікні конструктора форм, для чого варто двічі клацнути на компоненті ТТаblе, TQuery або TStoredProc або вибрати команду Fields Editor у контекстному меню для набору даних. У вікні редактора полів можна вибрати поля набору даних, із якими потрібно працювати, або ж створити нові обраховочні або подстановочні поля. Для цього використовуйте контекстне меню редактора.

 

XIII.Додавання полів

Відкрийте вікно редактора полів, двічі клацнувши на об'єкті Tablel. Припустимо, що потрібно обмежити уявлення таблиці декільком полями. У контекстному меню вікна редактора полів виберіть команду Add Fields (Додати поля). Наекрані розкриється діалогове вікно Add Fields. Виділіть в списку Available fields поля OrderNo CustNo і ItemsTotal, а потім клацнітьна кнопці ОК. Ці три виділених поляз'являтьсяувікні редактора полів і в сітці з даними.

Для представлення полів набору даних, виділених у вікні редактора полів, Delphi створює об'єкти, похідні від об'єкта TField.

Ім'я об'єкта поля - це з'єднання імені TTable і імені поля. Оскільки ці об'єкти полів створюються програмно, можна одержати доступ до всіх успадкованих від класу TField властивостей і методів безпосередньо під час виконання програми, а не тільки під час проектування.

XIV.Поля й інспектор об'єктів

Якщо виділити поле у вікні редактора полів, у вікні інспектора об'єктів можна буде одержати доступ до властивостей і подій, асоційованих із даним нащадком об'єкта TField. Це дозволяє модифікувати властивості полів (наприклад, визначати максимальне значення, формат відображення, а також робити їх доступними тільки для читання.

Відкривши у вікні інспектора об'єктів вкладку Events, можна побачити, що з об'єктами поля асоційовані і деякі події. Події OnChange, OnGetText, OnSetText і onValidate докладно описані в інтерактивній довідковій системі. Для одержання довідки по події достатньо клацнути зліва від його імені, а потім натиснути клавішу <F1>. З усіх подій частіше усього використовується OnChange. Воно дозволяє виконувати деякі дії при кожній зміні вмісту поля (наприклад, переходити на інший запис або добавляти новий запис).

 

XV.Обраховочні поля

У вікні редактора полів до набору даних можна додати обраховочні поля. Наприклад, в набір даних необхідно додати поле, що відображає для кожного рядка в таблиці ORDERS обсяг оптового продажу, що складає 32% від загального обсягу. Виберіть у контекстному меню вікна редактора полів команду New Field. На екрані розкриється діалогове вікно. У поле Name цього вікна введіть ім'я нового поля - Total. Тип цього поля - Currency, тому в списку, що розкрывается, Type виберіть саме це значення. У групі Field Type установите перемикач у положення Calculated і клацніть на кнопці ОК. Нове поле з'явиться в сітці, але поки не буде містити ніяких даних.

Щоб заповнити нове поле даними, необхідно призначити необхідний метод події OnCalcFields об'єкта Table1 - у тексті оброблювача цієї події полю Total варто просто привласнити значення, рівне 32% від існуючого значення.

DataSet['Total']:=DataSet['ItemTotal']*32%;

 

XVI.Підстановочні поля

Підстановочні (lookup) поля дозволяють створювати в наборі даних такі поля, значення яких будуть вибиратися з іншого набору даних. Для ілюстрації сказаного додамо таке поле до поточного проекту. Навряд чи по номері клієнта (поле CustNo таблиці ORDE можна буде пригадати його ім'я. Тому доцільно додати до таблиці Table1 підстановочне поле, пов'язане з таблицею CUSTOMER, із якої по номеру клієнта буде вибиратися його ім'я.

Спочатку помістите у форму другий об'єкт ТТаblе. Це буде об'єкт Таblе2. Потім знову відкрийте вікно New Field, для чого виберіть команду New Field у контекстному меню вікна редактора полів. Присвойте новому полю ім'я CustName і тип String. Розмір поля встановіт рівним 15 символам. Не забудьте встановити перемикач у групі Field Type у положення Lookup, у списку Dataset цього діалогового вікна виберіть значення Таblе2 - саме цей набір даних необхідно переглядати. У обох списках Key Fields і Lookup Keys цього діалогового вікна виберіть значення CustNo - це те загальне поле, за значенням якого буде виконуватися пошук і нарешті, у списку Result виберіть значення Contact - саме це поле необхідно відображати в нашому наборі даних.

XVII.Перетягування полів мишею

Інша, менш очевидна властивість вікна редактора полів - можливість перетягування полів із списку полів в утворювану форму. Цю властивість можна продемонструвати так: створіть новий проект, що буде містити в головній формі тільки об'єкт ТТablе. Встановіть властивість Table1.DatabaseName рівним DBDEMOS, а властивість Table1.TableName - рівним BIOLIFE.DB. Відкрийте для цієї таблиці вікно редактора полів і додайте всі поля таблиці в список полів набору даних. Тепер з'явилася можливість перетягнути одне або декілька полів із вікна редактора полів у головну форму.

Відзначимо декілька особливостей цієї процедури, по-перше Delphi розпізнає, тип що поміщається у форму поля і створює відповідний елемент керування для відображення його даних (наприклад, для рядкового поля створюється об'єкт класу TDBEdit, а для графічного поля - обєкт класу TDBimage). По-другеDelphi перевіряє, чиіснує об'єкт класу TDataSource, пов'язаний із цим наборомданих.Якщо це так,саме він ставиться у відповідність новому полю, у противному випадку об'єкт створюєтьсянаново.

 

VIII.Відновлення набору даних

При розробці програм необхідно враховувати, що набір даних, із яким ви працюєте, нахадится в постійному русі. Його записи постійно добавляються, видаляються або модифікуються, особливо при роботі в локальній мережі. Тому, зрідка необхідно перечитувати інформацію про набір даних із диска або з пам'яті для відновлення вмісту набору даних,що відображається у формах.

Обновити набір даних можна за допомогою методу Refresh() компонента TdataSet. Функціонально він нагадує послідовний виклик для набору даних методів Close() і Open(), але виконується декілька швидше. Метод Refresh() завжди намагається зберегти поточний запис(якщо це можливо).

 

XIX.Зміна стану набору даних

Іноді буває необхідно уточнити, у якому режимі знаходиться таблиця(Edit або Append) і чи активна вона взагалі. Одержати цю інформацію можна за допомогою властивості State компонента TdataSet.

Можливі значення властивості TdataSet. State

Значення Опис
dsBrowse Набір даних знаходиться в режимі Browse (звичайний режим перегляду даних)
dsCalcFields Викликано оброблювач події onCalcFields, і значення полів запису в даний момент перераховуються.
dsEdit Набір даних знаходиться в режимі Edit (редагування). Це означає, що був викликаний метод Edit, але одредагований запис ще не був внесений у таблицю.
dsInactive Набір даних закритий
DsInsert Набір даних знаходиться в режимі вставки, звичайно це означає, що був викликаний метод Insert, але запис ще не був внесений у таблицю.
DsSetKey Набір даних знаходиться в режимі задання ключа
DsNewValue Набір даних знаходиться у тимчасовому стані, коли здійснюється доступ до властивості NewValue
DsOldValue -//- OldValue
DsCurValue -//- CurValue
DsFilter Виконується фільтрація даних
DsBlockRead Набір даних буферизується
DsInternalCalc Обчислюється значення обраховочного поля
DsOpening Набір даних знаходиться в стані відкриття, що у дійсний момент ще не завершене.

 

XX.Фільтрація набору даних

Один із найбільш загальних механізмів фільтрації, використовуваних у Delphi, - обмеження представлення набору даних до деяких зазначених записів. Цей процес виконується таким чином:

1. Назначте процедуру події onFilterRecord набору даних. У цю процедуру варто помістити оператори, що виконують відбір записів на основі значень одного або декількох полів.

2. Встановіть властивість Filtered набору даних рівним True.

Створимо оброблювач події onFilterRecord для таблиці. У даному випадку будуть відбиратися тільки ті записи, у яких значення поля Company починається з прописної букви К. Текст цієї процедури виглядає так:

Procedure TForm1. Table1FilterRecord

(DataSet:TdataSet:TdataSet; var Accept:Boolean);

Var

Fl:string;

Begin

Fl:=DataSet['Company'];

Accept:=FieldVal[1]='K';

End;

 

XXI.Пошук записів

Для виконання пошуку записів для таблиць dBASE або Paradox вони повинні бути проіндексовані. Для SQL таблиць пошук буде уповільнений при пошуку по непроіндексованим полям.

-пошук за допомогою методу FindKey():

Метод FindKey() дозволяє здійснювати пошук використовуючи одне або декілька ключових полів при одному виклику функції. В якості параметру методу FindKey() передається масив типу array of const, що містить критерії пошуку. Якщо пошук здійснився метод повертає значення true.

Напиклад, наступний оператор шукає запис де перше поле в індексі містить значення 123, а друге Hello:

If not Table1.FindKey([123,’Hello’]) then MessageBeep(0);

Якщо поле не знайдено, метод повертає значення і компютер видає звуковий сигнал.

-пошук за допомогою методів SetKey()…GotoKey():

Виклик методу SetKey переводить таблицю в режим, при якому її поля підготовлюються до заповнення значень, що являють собою критерії пошуку. Як тільки критерії пошуку встановлені, можна викликати метод GotoKey(), який здійснює пошук зверху до низу. Попередній пошук з приміненнія даних методів матиме наступний вигляд:

Table1.SetKey;

Table1.Fields[0].AsInteger:=123;

Table1.Fields[1].AsInteger:=’Hello’;

If not GotoKey then MessageBeep(0);

-пошук найблищої відповідності:

За допомогою метода FindNearest() або пари методів SetKey()…GotoNearest() можна здійснювати пошук найблищої відповідності.

Для пошуку первого запису, де значення першого індексованого поля найбільш блиське (більше або рівне) 123, використовуйте наступний код:

Table1.FindNearest([123]);

Тут в якості параметрів, теж передається масив типу array of const, що містить критерії пошуку.

Методи SetKey()…GotoNearest() можна використати наступним чином:

Table1.SetKey;

Table1.Fields[0].asInteger:=123;

GotoNearest;

Якщо пошук здійснився i властивість KeyExclusive таблиці = false, покажчик поточного запису буде встановлений на першу із записів що відповідає критерію пошуку. А якщо ж властивість KeyExclusive=true то поточним буде запис, що є наступним після останнього запису що відповідає критерію пошуку.