- •2. Інтегроване середовище розробки Delphi: призначення і загальний опис середовища
- •3. Загальна організація програми в Delphi
- •4. Деякі довідкові відомості для роботи у середовищі Delphi
- •Цикл (программирование)
- •[Править]Определения
- •[Править]Виды циклов [править]Безусловные циклы
- •[Править]Цикл с предусловием
- •[Править]Цикл с постусловием
- •[Править]Цикл с выходом из середины
- •[Править]Цикл со счётчиком
- •[Править]Совместный цикл
- •[Править]Досрочный выход и пропуск итерации
- •[Править]Досрочный выход из цикла
- •[Править]Пропуск итерации
- •[Править]Необходимость
- •[Править]Вложенные циклы
- •[Править]Циклы с несколькими охраняемыми ветвями [править]Цикл Дейкстры
- •[Править]Цикл «паук»
- •[Править]Интересные факты
- •3.1 Інкапсуляція
- •3.2 Класи, компоненти і об'єкти
- •3.3 Спадкоємство
- •3.4 Розробка класів
- •3.4.1 Оголошення базового класу
- •3.4.2 Конструктори і деструкції
- •3.4.3 Оголошення похідних класів
- •3.5 Поліморфізм
- •3.5.1 Віртуальні функції
- •3.5.2 Дружні функції
- •3.6.1 Компоненти
- •3.6.1.1 Оголошення компонентних класів
- •3.6.1.2 Оголошення властивостей
- •3.6.1.3 Оголошення обробників подій
- •3.6.1.4 Оголошення автоматизованих властивостей і методів
- •3.6.1.5 Швидкий виклик функцій
- •3.6.1.6 Розширені типи даних Delphi
3.5.2 Дружні функції
Дружні функції, хоча і не належать якомусь класу, проте мають доступ до всіх приватних і захищених членів даних зовнішніх класів. Лістинг 3.12 узагальнює синтаксис оголошення дружніх функцій за допомогою ключового слова friendперед вказівкою повертаємого типу.
class className
(1
public: ~
className(); // Конструктор за умовчанням // Інші конструктори friend returnType friendFunction(<список параметрів>);
};
Лістинг 3.12. Оголошення дружніх функцій.
Якщо звичайні функції-члени мають автоматичний доступ до всіх даних свого класу за рахунок передачі прихованого параметра - покажчика this на екземпляр класу, то дружні функції вимагають явної специфікації цього параметра. Дійсно, оголошена в класі Х дружня функція F не належить цьому класу, а, отже, не може бути викликана операторами х. F і xptr->F (де х- екземпляр класу X, а xptr- його покажчик). Синтаксично коректними будуть звернення F (& х) або F (xpt r).
Таким чином, дружні функції можуть вирішувати завдання, реалізація яких за допомогою функцій-членів класу виявляється незручною, скрутною і навіть неможливою.
3.6 Нові можливості мови C++
C++Builder забезпечує не тільки підтримку останніх нововведенні стандарту ANSI C++, але і розширює мову новими можливостями. Компоненти, властивості, методи, обробники події, а також шаблони, простори імен, явні і непостійні оголошення, RTTI і виключення - вся потужність цих засобів доступна програмістам, використовуючим C++Builder для візуальної розробки додатків.
Важливо зрозуміти, що розширення мови ніколи не є самоціллю, і ви як і раніше зможете компілювати тексти, написані в рамках стандартного C++. Проте, щоб скористатися повною мірою перевагами, які надає C++Builder для технології швидкої розробки додатків (RAD), вам доведеться прийняти введені розширення мови.
Деякі з розширень (наприклад _classid) C++Builder резервує, головним чином, для внутрішнього використання. Інші розширення абсолютно очевидні (_int8, _intl6 і так далі), і тут не розглядаються. Нашу увагу буде сфокусовано на найбільш значущих розширеннях C++, які, в основному, відносяться до компонентних класів і постійно зустрічатимуться як в тексті книги, так і у ваших застосуваннях, що розробляються в середовищі C++Builder.
3.6.1 Компоненти
Компоненти часто досягають вищого ступеня інкапсуляції, ніж стандартні класи C++. Проілюструємо це на простому прикладі розробки діалогу, що містить кнопку. У типовій програмі C++ для Windows натиснення мишею на кнопку приводить до генерації повідомлення WM_IBUTTONDOWN. Це повідомлення повинне бути "зловлене" програмою або в операторові switch або у відповідному рядку таблиці відгуків (RESPONSE_TABLE), а потім передано процедурі реакції на це повідомлення. Так, додаток, написаний в рамках OWL (Object Windows Library), використовує макрос
DEFINE_RESPONSE_TABLE1(TEventTestDlgClient, TDialog)
//({TEventTestDlgClientRSP_TBL_BEGIN}}
EV_BN_CLICKED(IDEVENTBUTTON, EventBNClicked)
//({TEventTestDlgClientRSP_TBL_END}}
END_RESPONSE_TABLE;
щоб асоціювати подію (повідомлення WM_IBUTTONDOWN), що генерується кнопкою IDEVENTBUTTON в діалозі TEventTestDlgClient, з функцією реакції EventBNClicked.
C++Builder закінчив з цими важко освоюваними трюками програмістів. Компонент кнопки вже запрограмований так, щоб реагувати на натиснення кнопки подією OnClick. Все, що треба зробити - це вибрати готовий (або написати власний) метод і за допомогою Інспектора об'єктів включити його обробник даної події.
