
- •3 Інспектор об'єктів
- •4 Реагування на події
- •2. Диспетчер проекту
- •2. Опис компонент у довідковій системі
- •1. Сторінка standart
- •3. Сторінка win32
- •6. Сторінка dата ассеss
- •8 Сторінка decision cube
- •9. Сторінка qreport
- •10. Сторінка dialogs
- •11. Сторінка win3.1
- •12. Сторінка samples
- •13. Сторінка activex
2. Опис компонент у довідковій системі
Довідкова система Delphi дає повне визначення компонент: їхнє призначення, перелік властивостей з короткою характеристикою кожної, перелік методів і подій. Під час проектування програми доводиться доволі часто звертатись до довідкової системи за різною інформацією, тому треба мати певні навики її використання.
За довідкою можна звернутися двома способами. У першому випадку користувач сам шукає потрібну інформацію. Для цього використовують рядок меню головного вікна Delphi. Вибирають команди Неlp => Contents, а після цього у вікні довідкової системи - закладку Предметний вказівник. З'являється вікно, як на рис.3.2. У верхньому полі для введення тексту набирають ім'я типу, властивості, поля, події тощо. Нехай це буде, наприклад, ім'я типу ТМеmо - поля для введення багаторядкового тексту. В процесі набирання літер ТМеmо довідкова система відразу шукає найближче подібне слово в загальному змісті довідки і виділяє його або фразу з таким словом у нижньому полі вікна довідки (див. рис.3.2). Переконавшись, що потрібне слово відшукане, натискають клавішу Еnter або кнопку
Вивести в нижній частині вікна. Після чого з'являється інше вікно (рис.3.3), де можна продовжити шукання потрібної інформації.
Часто трапляється, що для введеного слова (того ж ТМеmо) довідкова система має декілька різних пояснень, що стосуються різновидів застосування слова. У цьому разі спочатку треба мишкою або клавішами зі стрілками вибрати потрібний рядок у нижньому полі вікна довідки на сторінці Предметний вказівник, а вже потім натискати на кнопку Вивести.
Справочная
система:
ОеІрЬі
Неір
Рис. 3.2. Вікно довідкової системи для шукання слів.
Виникає й інша ситуація, коли користувач забув, як правильно написати деяке слово, тоді довідкова система не може відшукати потрібного розділу з поясненнями. У нижньому полі буде відображене слово, яке є і розташоване найближче до введеного за алфавітом. Далі треба продовжити шукання у нижньому полі шляхом його перегляду.
Зауважимо, що регістр букв не має значення під час набирання тексту у верхньому полі, тобто замість ТМеmо можна набрати tmemo.
Другий спосіб звертання за довідковою інформацією є контекстний. Нехай у середовищі Delphi у вікні редактора коду маємо такий рядок тексту програми:
Меmо 1: ТМеmо;
Помістимо курсор на потрібному слові ТМеmо і натиснемо на клавішу F1. У цьому випадку відразу виконується шукання потрібного розділу лоиідкової системи і з'являється вікно, як на рис.3.3.
Подібні вікна мають у Delphі уніфіковану структуру, яка дає змогу однаковим способом працювати з довідковими даними різних елементів.
Ж
РеІрМ
Неір
Рис. 3.3. Вікно загальної довідкової інформації заданого елемента.
Зверху виділено великими буквами слово ТМеmо - те, для якого відображена загальна довідкова інформація. Під ним у рядку є підкреслені кілька слів - Hierarchy Properties Methods Events Seealso Examples. Унаслідок пересування курсора на одне з них курсор змінює свій вигляд на руку-вказівник. Це означає, що у разі натискання на клавішу мишки в цей момент буде виконано вибір та перехід на відповідний розділ довідки, де можна буде прочитати детальнішу інформацію.
Ніегагchy визначає фрагмент ієрархічного дерева, в якому є об'єкт ТМеmо. Ієрархія йде по рисунку зверху вниз, наш об'єкт належить до найнижчого елемента ієрархії. Про кожен елемент ієрархічного дерева можна одержати також довідкову інформацію аналогічно - підвівши курсор мишки та клацнувши клавішею.
Ргорегties визначає власне повний список властивостей об'єкта. Клацнувши на цьому слові мишкою, одержимо в окремому вікні перелік властивостей (рис.3.4). Праворуч у вікні є смуга перегляду, яка дає змогу побачити всі властивості, що не поміщаються у вікні одночасно. Кожна група властивостей розпочинається заголовком, наприклад, Derived from ТСизіотМето. Заголовок визначає ім'я об'єкта, від якого успадковані всі наведені нижче властивості цієї групи. Після заголовка перелічені властивості Alignment, Lines, ScrollBars, WantReturns, WantTabs, WordWrap,
що стосуються цієї групи. Підкреслення кожного слова означає, що про нього можна одержати детальнішу інформацію знову ж тим самим способом - підвівши курсор мишки та клацнувши клавішею.
В Гюреіііе:. МеІЬосіі. апд Еуеп!: Н|£Ш
В Рюреіііеі. МеИішії, апй Еуєпії НЕ
Рис. 3.4. Перелік властивостей компоненти.
Рис. 3.5. Перелік методів компоненти.
Наступні заголовки - Derivedfrom, TCustomEdit тощо, визначають інші групи властивостей.
Меthods визначає список методів, реалізованих в об'єкті ТМеmо. Клацнувши на ньому мишкою, також одержимо список (рис.3.5), структура якого ідентична до структури списку властивостей.
Еvents визначає у такому ж вікні список подій, які виникають для конкретного об'єкта чи компоненти. Наприклад, для ТМеmо можна було б побачити такий список доступних подій: ТМеmо events - Derived from TCustomEdit: OnChange; Derived from TWinControl: OnEnter, Onexit, OnKeyDown, OnKeyPress, OnKeyUp; Derived from TControl: OnClick, OnDblClick, OnDragDrop, OnDragOver, OnEndDrag, OnMouseDown, OnMouseMove, OnMouseUp, OnStartDrag. Назва кожної події є підкресленим словом, про нього можна одержати детальнішу інформацію, клац-нувши на ньому мишкою. У такий спосіб матимемо повну інформацію про всі події компоненти: опис суті подій, їх визначення через процедурні типи, можливості використання.
See also - цей розділ довідкової інформації для компоненти виводить ВІКНО, як на рис.3.6. Це вікно має перелік споріднених чи подібних до заданої компонент. Такий перелік можна застосовувати для глибшого вивчення можливостей використання подібних компонент у програмі. Іноді це дуже корисно, бо дає змогу вибрати ліпший варіант програми. Вибравши мишкою або клавішами зі стрілками потрібний об'єкт цього вікна, натискають на кнопку Вивести або клавішу Еnter і одержують вікно як на рис.3.3, але вже для вибраного нового об'єкта, де, однак, можна знову переглянути властивості, методи, події тощо. Ехаmрlе - цей розділ, якщо він є, має приклади використання компоненти, для якої переглядають довідкову інформацію. Однак перебільшувати значення таких
Рис. 3.6. Додаткова інформація про споріднені компоненти.
прикладів не варто, бо вони далеко не повні, і відображають лише принципову можливість використання компоненти. Можливості кожної компоненти є, як звичайно, набагато ширші, ніж це може виглядати з прикладів. Крім того, використання певної компоненти може потребувати специфічної побудови програми в конкретному випадку з урахуванням дуже багатьох деталей. Власне, можна сказати, що вивчення Delphi полягає у вивченні можливостей використання компонент для програмування різних задач. Приклади побудови програм у Delphi із застосуванням компонент наведені в розділі 5.
Заняття 7 Загальні принципи побудови компонент
Незважаючи на розмаїття компонент, їхня побудова ґрунтується на певних правилах. По-перше, компоненти об'єднані в чітку ієрархічну структуру класів, які успадковують властивості та методи від батьківських компонент та розширюють їхній перелік. По-друге, однакові властивості різних компонент забезпечують однакову чи подібну поведінку в анало-
гічних ситуаціях. По-третє, використання всіх компонент відповідає способу використання екземплярів класів з погляду програмування.
Нижче наведено загальну коротку характеристику спільних особливостей компонент. Зауважимо, що детальне вивчення компонент потребує тривалого часу і наявності відповідної літератури.
Ієрархія. Батьківським класом для всіх компонент є ТСотропепІ. У ньому визначено декілька властивостей та методів, що дають загальну характеристику.
Ім 'я компоненти
ргорегtу Nаmе: ТСоmponentName;
ТСоmponentName: string; Ім'я використовують для програмного звертання до конкретної компоненти. Його визначають під час проектування за замовчуванням за правилами Delphі, а можна замінити на інше ім'я через інспектор об'єктів або програмно, якщо компонента створена динамічно.
Власник компоненти
ргорегty Owner: TComponent; Усі компоненти програми взаємопов'язані - кожна компонента обов'язково має власника і може сама бути власником інших компонент. Власник керує 'життєвим циклом' належних йому компонент: їхнім створенням та знищенням. Кожен власник має список належних компонент. Позиція компоненти в списку власника визначена властивістю
ргореrty ComponentIndex: integer; Сам список належних власнику компонент визначений як
ргорегtу Соmроnеnts[Index: integer]: ТСотроnent; Отже, кожна компонента має вказівник на свого власника 0\wnег, а також може (не обов'язково) мати список належних уже їй компонент Сотропепіз.
Кожну компоненту так чи інакше початково створює конструктор
соnstructor Create ( AOwner: TComponent); параметр АОwnerг якого визначає компоненту-власника Оwnег. Знищують компоненту шляхом виклику деструктора
destructor Destігоу; або за допомогою методу
ргоcedure Fгее; який додатково перевіряє вказівник на компоненту, яку знищують.
Програмно створювати під час виконання треба лише ті компоненти, які потрібні додатково. Всі компоненти, визначені на формі під час проектування, створюються автоматично, їхні конструктори для нас невидимі. Важливо пам'ятати, що в обох випадках створення компонент явний виклик деструктора або методу Fгее не потрібний, бо у разі знищення ком-попеити-власника вона спочатку сама викликає деструктори всіх належних ні компонент. Видима форма програми в кінцевому результаті є власником усього того, що на ній розташоване, тобто всіх компонент - безпосередньо чи через компонент-посередників. Отже, остаточне закриття та знищення форми автоматично знищує спочатку всі компоненти.
Крім того, клас ТСоmроnent має низку методів для керування списком Соmponents підлеглих компонент.
Батьківські та дочірні компоненти. Спадкоємцем класу Тсоmро-nent є клас ТСоntгоІ. Він визначає всі компоненти, які мають візуальне зображення, тобто є безпосередньо видимими на формі. (Частина компонент є невидимою, зберігаючи всі принципи та особливості побудови). У класі ТСоntгоІ початково визначають дуже важливі властивості та методи, що їх успадковують візуальні компоненти.
Крім ієрархічних стосунків підлеглості 'власник-підлеглий', компоненти перебувають у ще одній системі відношень: батьківська компонента - дочірня компонента. Це відношення визначає керування видимістю компонент, тобто їхнім відображенням (малюванням) на формі. Кожна компонента може періодично бути видимою або невидимою - протягом часу, коли вона існує. Загальний принцип такий: кожна батьківська компонента забезпечує зображення своїх дочірніх компонент. Дочірні компоненти можуть бути розташовані лише в межах розмірів батьківської компоненти, якщо ж вони не поміщаються, то ми бачимо лише частину зображення компоненти.
Кожна видима компонента обов'язково має вказівник на свою батьківську компоненту
ргорегty Parent: TWinControl; а також може мати список дочірніх компонент, якщо такі є ргорегty Controls [Index: intenger]: ТСоntгоІ;
Отже, треба чітко розуміти різницю між власником 0wneг деякої компоненти та її 'батьком' Рагеnt: 0wnег створює та знищує компоненту, в тому числі невидиму, а Рагепі керує візуальним зображенням компоненти - місцем розташування та перемальовуванням. У частковому випадку власник Оwnег та 'батько' Раrent можуть збігатися — це може бути одна і та ж компонента.
Тому у випадку динамічного створення компоненти, крім виклику конструктора, треба обов'язково зазначити ще й батьківську компоненту. Наприклад, для кнопки, яку створюють додатково на формі під час виконання, можна записати в програмі:
var BreakCalsButton: TButton;
ВгеакСаІcButton:=TButton.Create(Self); ВгеакСаІсВиtton.Parent:=Self; {присвоїти значення іншим потрібним властивостям ВгеакСаІсВиtton} Для керування списком Соntrols дочірніх компонент є властивість ргореrtу СоntrolCount: intenger ; яка визначає кількість дочірніх компонент, а також низку методів для шукання компонент у такому списку, переходу між компонентами, перемальовування компонент. Точний перелік методів можна прочитати в довідковій системі Delphі.
2 Розташування та розміри компонент.
. Усі видимі компоненти мають визначені розміри ділянки екрана, де вони намальовані, та позицію щодо своєї батьківської компоненти. Крім того, ще деякі допоміжні властивості дають змогу працювати з їхніми розмірами. Наведемо характерні властивості компонент, що стосуються їх розташування. Розміри та позиція визначені в пікселях екрана.
Ліва межа компоненти (щодо батьківської, її лівої межі) ргорегtу Left :intenger;
Верхня межа компоненти (щодо батьківської, верхньої межі її клієнтської частини)
ргорегtу Тор: іntenger;
Ширина компоненти - ргорегtу Width: intenger;
Висота компоненти - ргорегtу Height: intenger;
Розміри прямокутника, який визначає клієнтську ділянку компоненти, тобто ту частину, яку можна використовувати для роботи (крім рамки, заголовка, меню)
ргорегty ClsentRect: TRect;
Дуже важливою властивістю компоненти є спосіб її вирівнювання стосовно меж батьківської компоненти ргорегtу Аlign : TAlign; ТАlign = (alNone, alTop, alBottom, alLeft, alRight, alClient);
аІNone - вирівнювання немає, розташування визначене властивостями Left, Top, Width, Height;
аІСІіеnt - компонента розширюється на всю клієнтську ділянку батьківської;
аІТор, аІВоttom, lLeft, alRightі - компонента вирівнюється до відповідного боку батьківської, набуваючи розмірів по ширині або висоті таких же, як бік батьківської компоненти; інший розмір компоненти не змінюється.
Активність та видимість.
Активність компоненти означає здатність реагувати на події: клацання мишкою, натискання на клавіші тощо. Видимість означає наявність або відсутність зображення компоненти. В процесі виконання програми компонента може переходити в різні стани щодо видимості та активності. Однак у цілому можна сказати, що невидима компонента одночасно є неактивною, а видима може бути як активною, так і неактивною. Видима, але неактивна компонента зображена сірим кольором, тоді як активна - чорним.
Видимість компоненти під час виконання програми визначає властивість
ргорегtу Visible: boolean; Змінювати видимість під час виконання програми можна двома методами:
ргосеdure Show; {зробити компоненту видимою} ргосеdure Hide; { зробити компоненту невидимою} Для керування активністю компоненти є властивість
ргорегtу Еnabled: boolean; Як можна зрозуміти, значення Еnabled =tгие робить компоненту активною, а Еnabled = false - пасивною.
Якщо площу компоненти можна зафарбовувати, то колір визначають властивістю
ргорегtу Соlог: ТСоlог; Якщо компонента має на поверхні деякі написи, які є частиною цієї компоненти, то можна задати їхній шрифт властивістю ргорегtу Font: TFont; Крім того, колір, шрифт, зображення, наявність підказок можна визначати неявно такими властивостями відповідно: ргорегtу РагentColor: boolean; ргорегtу РагеntFont:boolean ; ргореrtу РагеntCtl3D:boolean ; ргорегtу РагеntHint:boolean; Значення tгие властивості РагеntColor означає, що компонента повинна бути зафарбована в такий колір, як і батьківська компонента. Зміна кольору батьківської компоненти автоматично змінить колір дочірньої. Якщо властивість РагеntColor має значенняfalse, то колір повинна визначити властивість Соlor. Аналогічну інтерпретацію мають решта з цих чотирьох властивостей.
Фокус уведення. Фокус уведення означає компоненту, якій усі події та повідомлення передаються найперше. Компоненту з фокусом уведення часто позначають додатковим контурним прямокутником, щоб відрізнити її від решти. Сфокусована компонента або опрацьовує подію сама, або 'відсилає' її іншій компоненті, до якої подія може стосуватися. В загальному випадку схема передавання подій та повідомлень може бути досить складною. Серед усіх видимих компонент лише одна може мати в кожен момент часу фокус уведення.
Наприклад, якщо ми натиснемо на клавішу клавіатури, то код літери передасться компоненті, що має фокус уведення, - якщо компонента налаштована на опрацювання (читання) клавіш. Якщо літеру треба прочитати іншою компонентою, то зазвичай спочатку передають цій компоненті фокус уведення, а вже потім натискають на клавішу клавіатури.
У момент одержання фокуса введення для компоненти виникає подія ргорегtу ОnEnter: TNotifyEvent;
У момент втрати фокуса введення для компоненти виникає подія ргореtіу ОnExit: TNotifyEvent;
Обидві події можна використати для керування налаштуванням компоненти перед її активізацією та для аналізу одержаних даних у разі переходу фокуса до іншої компоненти. Крім вказаних подій, наступні три методи стосуються фокуса введення:
function CanFocus: boolean; - визначає, чи може компонента одержати фокус взагалі, тобто чи є ця компонента та всі її батьківські компоненти видимими (Visible) та активними (Еnabled);
function Focused: boolean; - визначає, чи має компонента фокус уведення на момент виклику методу;
ргосеdure SetFocus; - передає фокус уведення компоненті, яка викликає цей метод, наприклад:
ВгеаkCalcButton. SetFocus;
Заняття 8 Вступ. Характеристика компонентів.
Компоненти Delphi є основою для створення прикладних програм. Усі нони розташовані в бібліотеці VCL ( Visuai Component Library), яка є об'єктно-орієнтованою надбудовою над функціями Windows АРІ. За допо-могою компонент можна використовувати у своїй програмі всі можливості, які подає Windows через свої стандартні функції. Важливо, що, використовуючи компоненти, ми можемо майже нічого 'не бачити' в структурі та особливостях АРL. VCL повністю ховає від програміста цей інтерфейс, не вимагаючи від нас глибоких знань системи. З цього погляду Delphi можна вважати першою системою такого рівня, коли програміст, по суті, будує свою програму в іншій, зручнішій системі понять, ніж це забезпечує Windows. Щоб оцінити рівень Delphi, зазначимо, що для побудови дуже багатьох програм можна мати мінімальні знання системи Windows, однак створювати цілком працездатні програми з сучасним інтерфейсом. Це, звичайно, не означає, що вивчати Windows немає потреби. Великі та складні програми не можна скласти без знання та використання особливостей операційної системи. Однак переваги DELPHI та її вплив на ефективність процесу програмування є незаперечні.
Компоненти доцільно трактувати як деякі підпрограми, які можна приєднати та використовувати явно та неявно. Тобто компоненти - це об'єкти або екземпляри певного класу (у термінології Оbject Pascal). Вони мають методи та властивості, що тісно пов'язані. Виклик методів дуже часто означає зміну певних властивостей компоненти, а значення властивості змінюють неявним викликом певного методу.
Видимі компоненти, як відомо, розташовані на палітрі компонент і доступні для використання шляхом вибирання з палітри. З погляду Delphi компоненти об'єднані в чітке ієрархічне дерево, початковий вузол якого має клас ТСоmponent, що є базовим для покрокового визначення решти класів (компонент). У довідковій системі можна переглянути місце в ієрархічному дереві кожної окремої компоненти. Зазначимо, що є багато компонент, які не створюють видимого зображення, однак відіграють важливу роль у тих чи інших випадках.
З погляду програмування робота з компонентами означає роботу з класами. Компоненти - це стандартні класи, що вже є в Delphі. Крім стандартних, програміст може створювати і власні класи та відповідні компоненти, однак, як свідчить практика, і стандартних цілком достатньо для побудови серйозних програм. Точно кажучи, компоненти є екземплярами визначених класів, для одного класу в програмі можна використати декілька
компонент. Зауважимо, що Delphi сама присвоює імена компонентам, які вибирають через палітру, додаючи до імені класу суфікс - порядковий номер для класу. Проте за бажанням програміст може легко змінити стандартно присвоєне ім'я на будь-яке інше. За замовчуванням усі імена класів починаються буквою Т, наприклад, ТМеmо (текстове поле). Відповідні екземпляри використаних компонент будуть за замовчуванням називатися Мemo1, Меmо2 і т.д. До компонент у програмі звертаються за звичайними правилами мови програмування як до екземплярів класу.
Нехай у початковий момент маємо порожню форму програми в Delphi, а відповідний початковий фрагмент тексту модуля виглядає так:
unit Unit1
interfase
uses
Windows, Messages, SysUtils, Classes, Grafics, Controls, Forms, Dialogs;
tуре
TForm1 = class ( TForm)
private
{Private declarations}
риblіс
{Рublic declarations}
еnd;
var
Form1; TFormІ;
У рядкуuses перелічені стандартні модулі Delphi, які приєднуються до програми за замовчуванням і потрібні для роботи будь-якої програми. Тепер виберемо з палітри компонент і розташуємо де-небудь на формі два екземпляри компоненти класу ТВіtBtn (кнопки з піктограмою): ВіtBtn1 та ВіtBtn2. Delphi сама модифікує початковий фрагмент тексту модуля:
unit Unit1;
interfase
uses
Windows, Messages, SysUtils, Classes, Grafics, Controls, Forms, Dialogs;
tуре
TForm1 = class ( TForm)
BitBtn1: TBitBtn;
BitBtn2": TBitBtn;
private
{Private declarations}
риblіс
{Рublic declarations}
еnd;
var
Form1; TFormІ;
Як бачимо, імена двох нових компонент додані в інтерфейсну частину модуля у визначення класу форми, на якій розташували компоненти. Тепер у середовищі Delphi за допомогою інспектора об'єктів можна змінювати властивості цих компонент, що з погляду програмування є просто заданням початкових значень перед виконанням програми. А вже під час виконання можна змінити будь-яке значення властивості відповідним оператором, наприклад:
ВitBtn1.Enabled:=false; {кнопка тимчасово недоступна} Подібні оператори записують у процедурах опрацювання певних подій, які підходять за змістом задачі.
Отже, для розробки програм потрібно орієнтуватися в переліку та можливостях стандартних компонент, які є в Delphi.
Нижче наведено коротку характеристику стандартних компонент, зведену в окремі таблиці. Кожна таблиця відповідає одній сторінці палітри компонент і має три стовпці: зображення піктограми компоненти в палітрі компонент; ім'я класу компоненти без першої букви Т - як бачимо на підказці в середовищі Delphi, коли курсор мишки є над піктограмою; застосування компоненти.