Структура програми


Структура програм Lazarus
Будь-яка програма в Lazarus складається з файлу проекту (файл з розширенням lpr) і одного або декількох модулів (файли з розширенням pas).  Кожний з таких файлів описує програмну одиницю Lazarus.

Структура проекту
Файл проекту являє собою програму, написану на мові Lazarus і призначену для обробки компілятором.  Ця програма автоматично створюється Lazarus і містить лише кілька рядків.  Щоб побачити їх, запустіть Lazarus і виберіть команду ПроектПерегляд початкового коду головного меню. Lazarus покаже вікно коду з вкладкою Projectl, що містить такий текст:
program Project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms
{ add your units here }, Unit1;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
У вікні коду напівжирним шрифтом виділяються так звані зарезервовані слова, синім шрифтом коментарі, а червоним шрифтом директиви компілятора.  Як бачимо, текст програми починається зарезервованим словом program і закінчується словом end з точкою за ним.  Поєднання слова end з наступною за ним крапкою називається термінатором програмної одиниці: як тільки в тексті програми зустрінеться такий термінатор, компілятор припиняє аналіз програми і ігнорує решту тексту.
Зарезервовані слова відіграють важливу роль в Lazarus, надаючи програмі в цілому властивість тексту, написаного на майже природній англійській мові.  Кожне зарезервоване слово (а їх в Lazarus кілька десятків) несе в собі умовне повідомлення для компілятора, який аналізує текст програми так само, як читаємо його і ми: зліва направо і зверху вниз.
Коментарі, навпаки, нічого не значать для компілятора, і він їх ігнорує.  Коментарі важливі для програміста, який з їх допомогою пояснює ті чи інші місця програми.  У Lazarus коментарем вважається будь-яка послідовність символів, укладена в фігурні дужки, в дужки із зірочками (* ... *), а символи // вказують компілятору, що коментар розташовується за ними і триває до кінця поточного рядка.
Директива компілятора - компонент програми, керуючий подальшої компіляцією програми.  Директиви починаються символом $, який слідує відразу за відкритою фігурною дужкою.
Наприклад:
 {$ H-} Визначає, що рядок буде оброблений як ShortString
 {$ H +} Визначає, що рядок буде оброблений як AnsiString
Слово program і наступне за ним ім'ям програми та крапка з комою утворюють заголовок програми.  За заголовком розташовано розділ описів, в якому програміст (або Lazarus) описує використані в програмі ідентифікатори.  Ідентифікаторами позначають елементи програми, такі як типи, змінні, процедури, функції.  Тут же за допомогою пропозиції, яка починається зарезервованим словом uses (використовувати), програміст повідомляє компілятору про ті фрагменти програми (модулі), які необхідно розглядати як невід'ємні складові частини програми і які розташовуються в інших файлах (наприклад, Forms  і Unit1).
Власне тіло програми починається зі слова begin (почати) і закінчується термінатором end з крапкою.  Тіло складається з декількох операторів мови Lazarus.  У кожному операторі реалізується деяка дія - зміна значення змінної, аналіз результату обчислення, звернення до підпрограми і т.д. У тілі нашої програми - три виконуваних оператора:
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
Кожен з них реалізує звернення до одного з методів об'єкта Application.  Об'єктом називається спеціальним чином оформлений фрагмент програми, що містить в собі дані і підпрограми для їх обробки.  Дані називаються полями об'єкта, а підпрограми - його методами.  Об'єкт в цілому призначений для вирішення якої-небудь конкретної задачі і сприймається в програмі як неподільне ціле (іншими словами, не можна з об'єкта "висмикнути" окреме поле або метод).  Об'єкти грають надзвичайно важливу роль в сучасних мовах програмування.  Вони винайдені для того, щоб збільшити продуктивність праці програміста і одночасно підвищити якість розроблюваних ним програм.  Дві головні властивості об'єкта - функціональність і неподільність - роблять його самостійним або навіть самодостатньою частиною програми і дозволяють легко переносити об'єкт з однієї програми в іншу.  Розробники Lazarus винайшли для нас з вами сотні об'єктів, які можна розглядати як цеглинки, з яких програміст будує багатоповерховий будинок програми.  Такий принцип побудови програм називається об'єктно-орієнтованим програмуванням (ООП).
В об'єкті Application зібрані дані і підпрограми, необхідні для нормального функціонування Windows-програми в цілому.  Lazarus автоматично створює об'єкт-програму Application для кожного нового проекту. Рядок
Application.Initialize;
означає звернення до методу initialize об'єкта Application. Прочитавши цей рядок, компілятор створить код, який змусить процесор перейти до виконання деякого фрагмента програми, написаного для нас розробниками Lazarus. Після виконання цього фрагмента (програмісти кажуть: після виходу з підпрограми) управління процесором перейде до наступного рядка програми, в якій викликається метод CreateForm і т. д.
Метод Application.Initialize викликається "на всяк випадок": в реальній програмі він зазвичай нічого не робить. Його призначення — виконати підпрограму, ім'я якої розміщується в системній змінній InitProc.
Метод CreateForm об'єкта Application створює і показує на екрані вікно головної форми, а метод Run реалізує нескінченний цикл отримання і обробки надходжень від Windows повідомлень про дії користувача. Коли користувач клацне на кнопці Close, Windows передасть програмі спеціальне повідомлення, яке, в кінцевому рахунку, змусить програму припинити роботу і звільнити призначені їй системні ресурси (пам'ять, процесор).
Слід сказати, що файл проекту повністю формується самою Lazarus і в більшості випадків не призначений для редагування. Саме з цієї причини файл проекту має особливе розширення і зазвичай не показується у вікні коду. При розробці складних проектів цей файл можна використовувати для виконання деяких специфічних дій перед початком роботи програми.

Структура модуля
Модулі - це програмні одиниці, призначені для розміщення окремих частин програм.  За допомогою програмного коду реалізується вся поведінка програми.
Будь-який модуль має наступну структуру:
·         заголовок;
·         секція інтерфейсних оголошень;
·         секція реалізацій;
·         термінатор.
Заголовок відкривається зарезервованим словом unit, за яким слідує ім'я модуля і крапка з комою.  Секція інтерфейсних оголошень відкривається зарезервованим словом interface, а секція реалізацій - словом implementation (виконання).  Термінатором модуля, як і термінатором програми, є слово end з крапкою.
Наступний фрагмент програми є синтаксично правильним варіантом модуля:
unit Unitl;
interface // Секція інтерфейсних оголошень
{ Тут знаходиться опис процедур і функцій модуля, які можуть використовуватись іншими модулями }
implementation // Секція реалізацій
{ Тут знаходиться опис (текст) процедур и функцій модуля }
initialization // Код, виконання при запуску програми
end.
В секції інтерфейсних повідомлень описуються програмні елементи (типи, класи, процедури та функції), які можуть використовуватися іншими модулями, а в секції реалізацій реалізовується механізм работи цих елементів. Розділ ініціалізації initialization є не обов’язковим. Він необхідний для виконання коду при запуску програми.
Приклад модуля:
unit Unit1;
interface // Відкритий інтерфейс модуля
{Список підключених модулів}
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
{Оголошення класу форми}
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
procedure Button1Click (Sender: TObject);
private // Закритий розділ класу
{ Private declarations }
{Тут можуть розміщуватись оголошені змінні, функції та
процедури, які входять в клас форми, але не доступні для
інших модулів}
public // Відкритий розділ класу
{ Public declarations }
{Сюди можуть поміщатися оголошення змінних, функцій і
 процедур, що включаються в клас форми і доступних для
 інших модулів}
end;
var
Form1: TForm1;
{Сюди можуть поміщатися оголошення типів, констант,
 змінних, функцій і процедур, до яких буде доступ
 з інших модулів, але які не включаються до класу
 форми}
implementation // Реалізація модуля
{$R *.DFM}
{Сюди можуть поміщатися пропозиції uses, оголошення типів,
 констант, змінних, до яких не буде доступу з
 інших модулів.  Тут же повинні бути реалізації всіх
 оголошених в розділі interface функцій і процедур,
 а також можуть бути реалізації будь-яких додаткових,
 оголошених раніше функцій і процедур.}
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := 'Це мій додаток!';
end;
end.
Lazarus є об'єктно-орієнтованою мовою програмування.  В основі об'єктної моделі Паскаля лежать поняття класу і об'єкту.  Клас - це складна структура, що включає, крім опису даних, опис процедур і функцій, які можуть бути виконані над представником класу - об'єктом.
У розділі interface після пропозиції uses, що містить список підключаються бібліотечних модулів, можна побачити оголошення класу форми, підготовлене Lazarus.  Ім'я класу форми - TForm1.  В клас включені ті об'єкти, які розміщені на формі - мітка Label1 і кнопка Button1.  Крім того в клас включено оголошення обробника клацання на кнопці - процедура Button1Click.
Стандартний клас TForm реалізує все необхідне для створення і функціонування порожнього Windows-вікна.  Клас TForm1 породжений від цього класу, про що свідчить рядок
TForm1 = class(TForm)
в якій за зарезервованим словом class в дужках вказується ім'я батьківського класу.  Термін "породжений" означає, що клас TForm1 успадкував всі можливості батьківського класу TForm і додав до них власні у вигляді додаткових компонентів.  Перелік вставлених нами компонентів і становить значну частину опису класу.
У класі передбачено також два розділи: private - закритий розділ класу, і public - відкритий розділ класу.  Те, що ви або Lazarus оголосіть в розділі public, буде доступно для інших класів і модулів.  Те, що оголошено в розділі private, є тільки в межах даного модуля.
Після завершення оголошення класу форми ви можете бачити рядки
var
Form1: TForm1
Це оголошується змінна Form1 класу TForm1, тобто  оголошується форма як об'єкт класу TForm1.

Програмний доступ до властивостей і методів об'єктів
Розглянемо тепер, як отримати з програми доступ до властивостей і методів об'єктів.  Якщо вас цікавить якась властивість об'єкта, то посилання на нього здійснюється в наступному форматі:
 <Ім'я об'єкта>. <Ім'я властивості>
Після імені об'єкта пишеться без пропуску символ крапки, а потім так само без пробілу пишеться ім'я властивості.  Наприклад, посилання на властивість Caption мітки Label1 здійснюється записом Label1.Caption.
Іноді властивість об'єкта є в свою чергу об'єктом.  Тоді в зверненні до цієї властивості вказується через точки весь ланцюжок попередніх об'єктів.  Наприклад, мітки мають властивість Font - шрифт, яке в свою чергу є об'єктом.  У цього об'єкта є безліч властивостей, зокрема, властивість Color - колір шрифту.  Щоб послатися на колір шрифту мітки Label1, треба написати Label1.Font.Color.  Це означає: властивість Color об'єкта Font, що належить об'єкту Label1.  Наприклад, оператор
Label1.Font.Color:=clRed;
зробить напис мітки Label1 червоною.
Аналогічна нотація з точкою використовується і для доступу до методів об'єкта.  Наприклад, для мітки, як і для більшості інших об'єктів, визначено метод Free, який знищує мітку і звільняє займану нею пам'ять.  Якщо ви в якийсь момент вирішили знищити мітку Label1 в своєму додатку, то ви можете написати оператор
Label1.Free;
Тепер подивимося, чим різняться константи, змінні, функції і процедури, включені та не включені в опис класу.
Якщо в додатку створюється тільки один об'єкт даного класу (в нашому прикладі - тільки один об'єкт форми класу TForm1), то відмінність в основному чисто зовнішнє.  Для процедур, оголошених в класі, в їх описі в розділі implementation до імені процедури повинна додаватися посилання на клас.  У нашому прикладі ім'я процедури Button1Click в описі цієї процедури в розділі implementation замінюється на TForm1.Button1Click.  Для процедур, оголошених поза класом, такої заміни не потрібно.
Звернення до змінних і процедур, описаними всередині і поза класом, з процедур, описаних поза класом, різниться.  До змінних і процедур, описаними поза класом, звернення відбувається просто за їхніми іменами, а до змінних і процедур, описаними в класі, через ім'я об'єкта класу.  Наприклад, якщо ви поза класом хочете описати якусь процедуру, яка змінює напис мітки Label1, ви повинні звернутися до її властивості Caption наступним чином: Form1.Label1.Caption.  Тільки через посилання на об'єкт Form1 зовнішні по відношенню до класу процедури можуть отримати доступ до всього, оголошеному в класі.
Всі ці посилання на об'єкт не потрібні в процедурах, оголошених в класі.  Тому в процедурі TForm1.Button1Click посилання на об'єкт Label1 не містить додаткового посилання на об'єкт форми.
В об'єктно-орієнтованих мовах є 3 основних понятті: інкапсуляція, успадкування і поліморфізм.
Інкапсуляцією називається об'єднання в класі даних і підпрограм для їх обробки. Інкапсуляція дозволяє створювати клас, як щось цілісне, що має певну функціональність.
Спадковість - це коли будь-який клас може бути породжений іншим класом.  Породжений клас автоматично успадковує всі поля, методи, властивості і події.
Поліморфізм дозволяє використовувати однакові імена для методів, що входять в різні класи.

Комментариев нет:

Отправить комментарий