Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекції по delphi методичка 1!!!.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
79.42 Mб
Скачать

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, коли курсор мишки є над піктограмою; засто­сування компоненти.