Структура модульного файлу

Створення й збереження нового проекту

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

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

Новий каталог ви можете створити засобами Windows перед початком проекту, або створювати його можна у вікні стандартного діалогу збереження файлів за допомогою відповідної швидкої кнопки.

 

Створення нового проекту

Почати новий проект можна декількома способами. Можна виконати команду File - New - Application. Ще один шлях - команди File - New - Other. При виборі цієї команди відкривається вікно New Items (нові елементи).

Це вікно є вітриною Депозитарію об'єктів (Object Repository) - сховища зразків компонентів, форм, фреймів і проектів. Ви можете й самі створювати якісь свої форми, компоненти, фрейми, проекти й включати їх у Депозитарій.

У нашому випадку ми прагнемо відкрити новий проект. Це можна зробити, клацнувши на піктограмі Application (додаток), яка розташована на сторінці New (новий). Піктограма Application створює додаток з порожньою формою.

Ви можете також скористатися й деякими іншими варіантами додатків, піктограми яких розташовані на сторінці Projects. Щоб одержати пояснення по об'єктах, що містяться в Депозитарії, можна клацнути у вікні правою кнопкою миші й з випливаю чого меню вибрати форму відображення View Details (подробиці). Форма відображення зміниться, і ви зможете побачити короткі пояснення пропонованих вам варіантів.

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

 

Збереження проекту, його повторне відкривання

Першу дію, яку я рекомендував би вам виконати після створення нового проекту - зберегти його. Після того, як ви створили додаток з порожньою формою, відразу збережіть його в потрібному каталозі. І протягом роботи над проектом частіше виконуйте збереження.

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

Зберегти проект можна командою File - Save All. Зручно також використовувати відповідну швидку кнопку. При першому збереженні Delphi запитає у вас ім'я файлу модуля, а потім - ім'я файлу Проекту треба мати на увазі, що Delphi не допускає однакових імен модулів і проектів. Імена файлів повинні бути різними. Завжди при збереженні проектів і модулів задавайте осмислені імена файлів.

Чому не варто погоджуватися при збереженні з іменами, пропонованими Delphi за замовчуванням - Projectl, Unitl і т.п.? По-перше, ім'я файлу проекту буде надалі іменем вашого виконуваного модуля. Напевно, не дуже добре буде віддавати замовникові проект із такою дивною назвою, як Projectl.

По-друге, ім'я файлу модуля буде й іменем самого модуля. У проекті з одним модулем ім'я Unitl, можливо, не так уже й страшно. Але якщо у вас у проекті буде кілька модулів, те чи навряд вам буде зручно увесь час пам'ятати, що таке Unitl, а що таке Unit5. Крім того, уявіть собі, що ви на якийсь час припинили роботу над своїми проектами, а потім знову її відновили. Або супровід ваших проектів здійснюється не вами, а кимось іншим. Ви упевнені, що легко буде розібратися в численних Projectl і Unitl незрозумілого призначення?

При розробці простих прототипів проектів зручно задавати імена файлів проектів і модулів однаковими, розрізняючи їх тільки префіксом «Р» або «U» відповідно. Наприклад, файл проекту – Peditor1, файл модуля – Ueditor1. Це спрощує розуміння того, які файли до якого варіанта проекту відносяться, оскільки на початкових стадіях проектування у вас може з'явитися кілька альтернативних варіантів того самого проекту.

Отже, рекомендації зі створення нового проекту зводяться до наступного.

  • Створіть новий каталог для свого нового проекту.
  • Створіть новий проект командою File - New - Application.
  • Відразу збережіть проект і файл модуля командою File - Save All.

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

Є ще більш зручний спосіб автоматично відкривати при завантаженні Delphi той проект, з яким ви працювали в попередньому сеансі. Для цього треба виконати команду Tools - Environment Options. У діалоговому вікні, що відкрилося, треба перейти на сторінку Preferences і включити індикатор Desktop групи опцій Autosave options. Тоді при кожному запуску Delphi буде завантажуватися ваш останній проект попереднього сеансу й будуть відкриватися всі вікна, які були відкриті в момент попереднього виходу з Delphi. Це дуже зручно, якщо ви маєте намір продовжувати роботу над тим же проектом.

Ви можете зберегти свій проект у Депозитарії. Згодом з появою схожої задачі ви можете запозичити його звідти, щось у ньому змінити й у такий спосіб заощадити собі багато часу.

 

3. Завдання облікової інформації проекту

На заключній стадії проектування, коли основні задачі розробки вже вирішені, необхідно провести ряд робіт з оформлення вашого додатка:

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

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

Для завдання або перегляду цієї інформації треба виконати команду Project - Options і у вікні, що відкрилося, перейти на сторінку Version Info. Зазначена на даній сторінці інформація заноситься у виконуваний файл і стає доступна користувачеві, коли він, працюючи в Windows, клацає правою кнопкою миші на піктограмі вашого додатка й вибирає команду Властивості. Тоді в діалоговім вікні, що відкрилося, на сторінці Версія користувач може побачити інформацію про ваш додаток.

Основна опція сторінки Version Info вікна опцій проекту - Include version information. Якщо вона не встановлена, то всі вікна сторінки доступні тільки для читання. Це дозволяє просто подивитися інформацію про версію вашого минулого додатка, якщо, звичайно, ви подбали про те, щоб увести її в додаток. Якщо ж ви встановите опцію Include version information, то всі вікна сторінки стануть доступні для введення інформації.

Вікна групи Module Version Number дозволяють вам задати номер версії, що складається із чотирьох цифр, розділених крапками. Наприклад, 2.3.1.0. Цей номер користувач бачить у верхній частині вікна. Індикатор Auto-increment build number дозволяє автоматизувати зміну останньої із цих цифр. Якщо ви включили цей індикатор, остання цифра буде збільшуватися на одиницю щораз, коли ви будете виконувати команду Project - Build All. При інших командах компіляції цифра змінюватися не буде.

Група індикаторів Module Attributes указує призначення версії. Ці індикатори можна заповнювати для себе в чисто інформаційних цілях, наприклад: Debug Build - налагодження, Pre-Release - версія не для комерційного використання, DLL - проект DLL, Special Build - версія отримана в стандартному режимі компіляції, Private Build - версія побудована не в стандартному режимі компіляції.

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

Список Key/Value містить у собі стандартні відомості про програмний продукт: Companyname (Виробник), Filedescription (Опис), Fileversion (Версія продукту), Internalname (Внутрішнє ім'я), Legalcopyright (Авторські права), Legaltrademarks ( Товарні знаки), Originalfilename (Вихідне ім'я файлу), Productname (Назва продукту), Productversion (Версія продукту), Comments (Коментар). Переміщаючи курсор у цьому вікні, користувач може читати те, що ви занесли в список Key/Value. Загалом кажучи, для комерційного продукту всі рядки списку, крім Legalcopyright, Legaltrademarks і Comments, повинні заповнюватися, а ці три рядки можуть заповнюватися при необхідності.

 

Модуль та його структура

Модуль – фрагмент програмного коду, який є будівельним блоком для створення систем. Модульне програмування стало продовженням розвитку структурного програмування. Підпрограми, що з'явилися в структурному програмуванні, мали низку переваг:

  • полегшували розуміння коду;
  • спрощували процес налагодження й тестування;
  • забезпечували простоту внесення змін у програму.

Однак підпрограми мають істотний недолік: їх складно повторно використовувати в нових проектах. Для повторного використання підпрограм розроблювач повинен відкривати код «старого проекту» і копіювати з нього потрібні підпрограми в «новий» проект. Такий підхід має ряд недоліків:

  • якщо «старий» і «новий» проект створюються різними людьми, то розроблювач може ненавмисно внести в код «старого» проекту зміни, які приведуть до помилок. Тому давати доступ до коду проекту неприпустимо;
  • можливо, що скопіювати потрібно буде невеликий фрагмент програми, а реальний проект має величезний розмір і знайти потрібний шматок коду буде непросто.

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

Основним принципом модульного програмування є принцип «розділяй і пануй». Модульне програмування – це організація програми як сукупності невеликих незалежних блоків, які називаються модулями, структура й поведінка яких підпорядковуються певним правилам.

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

Кількість модулів повинна визначатися декомпозицією завдання на незалежні підзадачи. Кількість модулів впливає на складність програми. У загальному випадку, кількість модулів не повинна перевищувати 10-ти. Це число пов'язане з «магічним» числом 7, яке базується на положеннях психології й, особливо, на теорії «шматків» інформації. Короткочасна пам'ять людини має обмежені здатності збереження «шматків» інформації. Психологічні експерименти показали, що здатність нашої короткочасної пам'яті перебуває в межах 5-9 «шматків» (у середньому – 7). Вона може одночасно оперувати близько 7 «шматками» інформації. Коли людей перевищує цю межу, віна більше схильна до помилок.

Поняття модуля в Object Pascal

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

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

 

Структура модульного файлу

Модуль – це файл, що має спеціальну структуру.

 

unit ім'я_модуля:

//інтерфейсна частина

Interface

[блок підключення модулів Uses;]

[блок опису класів і типів;]

[блок опису змінних Var;]

[блок опису заголовків підпрограм]

//секретна частина

Implementation

[блок опису змінних;]

[код реалізації підпрограм]

End.

Ім'я модуля повинне обов'язково збігатися з ім'ям файлу, у якому модуль буде збережений. Більшість блоків є необов'язковою (укладена у квадратні дужки).

Інтерфейсна частина

Для роботи з об'єктами Delphi, для виклику процедур і функцій у розділі Uses модуля потрібно підключити стандартний набір модулів. Такий набір можна скопіювати з коду будь-якої форми, що має мінімальний набір компонентів.

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

Секретна частина

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