Програмування в delphi 6

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

Цілком зрозуміло тому прагнення розробників комерційних компіляторів Паскаля включати в мову засоби, що підвищують його модульність. Найчастіше таким засобом є дозвіл використовувати зовнішні процедури і функції, тіло яких замінюється стандартною директивою External. Розробники Object Pascal пішли в цьому напрямку ще далі, включивши в мову механізм так званих модулів.

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

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

12.1. СТРУКТУРА МОДУЛІВ

Модуль має наступну структуру:

<интерфейсная часть> implementation

<исполняемая часть> initialization <нициирующая часть> finalization <завершающая часть>

Тут unit - зарезервоване слово (одиниця); починає заголовок модуля; <имя> - ім'я модуля (правильний ідентифікатор); interface - зарезервоване слово (інтерфейс); починає інтерфейсну частину модуля; implementation - зарезервоване слово (виконання); починає виконувану частину; initialization -зарезервірованное слово (ініціація); починає инициирующую частина модуля; finalization - зарезервоване слово (завершення);

починає завершальну частину модуля; end - зарезервоване слово - ознака кінця модуля.

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

12.2. ЗАГОЛОВОК МОДУЛЯ І ЗВ'ЯЗОК МОДУЛІВ ДРУГ С ДРУГОМ

Тема модуля складається з зарезервованого слова unit і наступного за ним імені модуля. Для правильної роботи середовища Object Pascal і можливості підключення засобів, що полегшують розробку великих програм, це ім'я має збігатися з ім'ям дискового файлу, в який поміщається вихідний текст модуля. Якщо, наприклад, маємо заголовок

то вихідний текст відповідного модуля повинен розміщуватися в дисковому файлі global. pas. Ім'я модуля служить для його зв'язки з іншими модулями і основний програмою. Цей зв'язок встановлюється спеціальною пропозицією

Тут uses - зарезервоване слово (використовує); <сп.модулей> -список модулів, з якими встановлюється зв'язок; елементами списку є імена модулів, відокремлюються один від одного комами, наприклад:

Uses Windows, SysUtils, MyUnit;

зарезервованим СЛОВОМ interface, або Відразу за словом implementation, або, нарешті, і там, і там (т. е. в модулі допускаються дві пропозиції uses).

12.3. інтерфейсна частина

Function AddC (x, y: Complex): Complex;

Function MulC (x, y: Complex): Complex;

Якщо тепер в іншому модулі написати пропозицію Uses Cmplx; то в ньому стануть доступними тип Сomplex і дві процедури - AddС і МulС з модуля Cmplx.

12.4. Частина, що

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

Function AddC (x, y: Complex): Complex;

Function MulC (x, y: Complex): Complex;

Function AddC (x, y: Complex): Complex;

end; Function MulC; // Варіант опису підпрограми без

// повторення списку параметрів

Повторення заголовка в виконуваної частини повинно бути повним і точним. Якби ми використовували заголовок

Function AddC (x, z: Complex): Complex; begin

12.5. Ініціює та ЗАВЕРШАЛЬНА ЧАСТИНИ

Ініціює і завершальна частини найчастіше відсутні

Разом з початківцям їх словами initialization і finalization.

В ініціації частини розміщуються оператори, які виконуються до передачі управління основній програмі і звичайно використовуються для підготовки її роботи. Наприклад, в них можуть ініціюватися змінні, відкриватися потрібні файли і т. Д. У завершальній частині вказуються оператори, що виконуються після завершення роботи основної програми (в них звільняються виділені програмою ресурси, закриваються файли і т. Д.). Якщо кілька модулів містять ініціюють частини, ці частини виконуються послідовно один за одним в порядку перерахування модулів в реченні uses головної програми. Якщо кілька модулів містять завершальні частини, ці частини виконуються послідовно один за одним в порядку, зворотному перерахуванню модулів в реченні uses головної програми.

12.6. Доступ до оголошень У МОДУЛІ ОБ'ЄКТІВ

Нехай, наприклад, ми створюємо модуль, який реалізує арифметику комплексних чисел (така арифметика ні в стандартному Паскалі, ні в Object Pascal не передбачена, але в Delphi 6 введений призначений для користувача варіант, який реалізує дії над комплексними

Числами - див. П. 10.5 і модуль Source \ Rtl \ Common \ VarCmplx.pas Каталогу розміщення Delphi). Арифметика комплексних чисел реалізується чотирма функціями:

Зверніть увагу на посилання uses cmpix на самому початку виконуваної частини - саме вона робить доступними оброблювачу bbRunClick додаткові компоненти Cmplx. Цю посилання можна вставити за допомогою середовища Delphi: виберіть опцію File | Use Unit і у вікні клацніть по імені модуля Сmplx.

12.7. ТИПИ МОДУЛІВ В DELPHI

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

Модулі даних мають пов'язані з ними вікна, однак, ці вікна ніколи не з'являються на екрані. Необхідність у вікнах викликана тим, що компоненти доступу до даних сторінки можна вставити тільки в форму, хоча всі вони не мають видимого втілення в працюючій програмі. Невидиме вікно модуля даних призначено для розміщення цих компонентів і пов'язаних з ними об'єктів-полів. Зрозуміло, для розміщення компонентів і полів можна використовувати і звичайне вікно-форму, проте в цьому випадку піктограми компонентів захаращують видимий простір вікна і ускладнюють його конструювання. У Delphi 5, 6 модулі даних здатні відображати реляційні зв'язки між сутностями бази даних у вигляді діаграм.

Модулі динамічних бібліотек призначені для створення широко використовуваних в Windows динамічно пов'язуються бібліотек DLL (Dynamic-Link Libraries). DLL служать універсальним засобом узгодження підпрограм, написаних на різних мовах програмування. У Windows міститься безліч DLL, написаних на мові Сі або на мові асемблера, що нітрохи не заважає Delphi-програм використовувати їх. Модулі динамічних бібліотек призначені для розробки DLL за допомогою Object Pascal. Такі DLL потім зможуть використовувати програми, створені за допомогою інших мов програмування.

Модулі потоків призначені для реалізації так званих потоків команд [В Delphi існують також потоки даних - см.п. 11.4. ] - фрагментів програми, які виконуються паралельно з іншими фрагментами, розділяючи з ними час процесора і інші системні ресурси. Механізм потоків використовується в 32-розрядних Windows і не підтримується в Delphi 1. На жаль, в поточній реалізації Delphi 32 потоки не можуть зв'язуватися з власними видимими компонентами, так як бібліотека візуальних компонентів VCL (Visual Component Library) не підтримує роботу з потоками. Ось чому модуль потоку не має пов'язаного з ним вікна.