Лекція 12. Організація програм на Delphi.
Досить часто при розробці програм виникає необхідність керувати програмою або екраном як окремими об’єктами. Для цього в Delphi існують об’єкт Application класу TApplication, який відноситься до програми, а також об’єкт Screen класу TScreen, який відноситься до екранного середовища.
У Windows існують два основних типи програм: однодокументні SDI (Single Document Interface) і багатодокументні MDI (Multiple Document Interface). В якості документу розглядається центральний об’єкт, з яким працює програма. Наприклад, для текстового редактора документом є текстовий файл, для графічного редактора – файл з зображенням. Прикладом однодокументних програм Windows є MS Internet Explorer або WordPad. Також саме середовище розробки Delphi є однодокументною програмою.
Багатодокументна програма може завантажити і використовувати одночасно декілька документів або об’єктів. Такі програми використовуються, як правило, для створення графічних і текстових редакторів. MDI-програми вимагають глибшого планування при їх створенні і більш комплексного підходу до проектування. В багатодокументній програмі головне вікно містить дочірні вікна, які розміщуються в його межах. І відмінність MDI-програм полягає в особливостях взаємодії головного і дочірніх вікон.
Щоб створити стандартну SDI або MDI-програму за шаблоном, необхідно виконати команду File\ New\ Other і впанелі New Items вибрати сторінку Projects, де вибрати SDI-Application або MDI-Application. В меню MDI-програми, в порівнянні з SDI, додано пункт меню Window, призначений для виконання функцій взаємного розміщення та мінімізації вікон, а також впорядкування іконок. Крім цього існує можливість вручну створювати SDI або MDI-програми без використання шаблону. Для цього необхідно встановлювати через Інспектор об’єктів або під час роботи програми відповідні значення для властивостей форм.
Керування програмою
Наразі розглядаються лише SDI-програми.
Для опису програми в цілому використовується клас TApplication. Об’єкт Application цього класу автоматично створюється системою Delphi при кожному запуску програми. Об’єкт Application являє собою вікно Windows зі стандартною API- процедурою WndProc. Клас TApplication спрощує взаємодію між розробником і середовищем Windows.
Клас TApplication застосовується для:
видачі повідомлення Windows;
підключення довідкової системи;
керування винятковими ситуаціями.
Інформація про об’єкт Application знаходиться у вихідному файлі проекту (). На стадії розробки програми даний об’єкт не доступний, тобто немодна переглянути або змінити значення його властивостей, а обробники подій можна створювати лише вручну.
При створенні нової програми у файлі проекту автоматично формується виклик наступних трьох методів.
Процедура Initialize, яка ініціалізує програму в цілому, при цьому виконуються оператори розділу initialization усіх модулів програми.
Процедура CreateForm . Власником створеної форми є об’єкт .
Процедура Run, яка безпосередньо запускає програму.
У більшості випадків (особливо при створенні невеликих і нескладних програм) немає необхідності працювати з властивостями, методами і подіями об’єкту Application, але деколи потрібно використовувати деякі з них для підвищення ефективності роботи програми.
Розглянемо деякі основні властивості об’єкта Application.
Властивість ExeName типу String вказує шлях та ім’я виконавчого файлу програми, тобто так звана специфікація файлу. Дана властивість доступна лише для читання і тільки в момент виконання програми. Для того, щоб із специфікації файлу виділити шлях та ім’я, використовуються відповідно файлові функції ExtractFilePath і ExtractFileName.
Властивість HelpFile типу String є доступною під час виконання програми. За замовчуванням значенням даної властивості є порожня стрічка. Властивості і методи, які пов’язані з виведенням довідкової інформації, не діють до тих пір, поки не буде задано ім’я файлу довідки. Ім’я вказується, як правило, у файлі проекту або в обробнику події створення головної форми.
Властивість Hint типу String містить в собі рядок підказки для компоненти незалежно від того, відображається підказка на екрані чи ні. Паралельно з даною властивістю доцільно розглянути наступні три.
Властивість HintPause типу Integer встановлює, через який час після встановлення вказівника мишки над областю компоненти буде показуватись текст підказки, який міститься у властивості Hint. За замовчуванням текст з’явиться через 0,5с.
Властивість HintHidePause типу Integer визначає затримку, протягом якої текст підказки буде відображатися біля компоненти. За замовчуванням затримка триває 2,5 секунди.
Властивість HintColor типу Color задає колір фону підказки. За замовчування він жовтий.
Дія властивостей HintPause, HintHidePause та HintColor розповсюджується на усі форми та компоненти програми.
Об’єкт Application має досить важливий метод ProcessMessages. Він застосовується у випадку виконання програми тривалих операцій або циклів обробки даних великого об’єму, коли програма не реагує на дії користувача і не відображає процесу виконання.. Даний метод викликає обробку повідомлень, які поступили і чекають своєї черги.
Виклик методу ProcessMessages рекомендується вставляти у всі цикли, здатні призвести до довготривалої роботи програми. Цей метод також необхідно використовувати паралельно з перевіркою умови на вихід з циклу у випадку, коли необхідно, наприклад, надати можливість користувачу переривати виконання довготривалого циклу натисненням кнопки. Якщо в такій ситуації не використовувати даний метод, то програма не буде реагувати на натиснення клавіш і буде, так би мовити, зависати до тих пір, поки цикл повністю обробиться, що буде не зручно для користувача.
Для того щоб забезпечити закриття програми під час виконання циклу, крім використання методу ProcessMessages, необхідно додати в тіло циклу умову для перевірки властивості Terminated типу Boolean. Якщо дана властивість має значення True, то це означає, що поступила команда на закриття програми і необхідно перервати виконання циклу і завершити роботу програми.
Завершення роботи програми виконується за допомогою методу Terminate. Даний метод забезпечує звільнення пам’яті, зайнятої проектами, з наступним завершенням програми. Однак, замість цього методу частіше використовується метод Close головної форми програми.
Для автоматичного створення в редакторі коду заготовок обробників подій об’єкта Application, в Delphi 5 було введено компоненту Application Events. Події програми стають доступними на етапі проектування при розміщенні даної компоненти на формі. У цьому випадку обробники подій програмуються так само як і обробники подій інших об’єктів, наприклад, кнопок або перемикачів.
Найбільш використовувана подія програми є подія OnIdle, яка виникає при простої програми, наприклад, коли програма чекає від користувача введення даних. Код обробника цієї події повинен займати мало місця в пам’яті і виконуватись швидко, щоб не тормозити роботу програми в цілому. Процедура обробки події OnIdle описується і використовується в модулі головної форми програми.
Середовище екрану
Для кожної нової програми в Delphi автоматично створюється об’єкт екрану Screen типу TScreen. Використовуючи даний об’єкт, можна отримати відомості про поточний стан екрану:
відкриті форми і модулі програми;
активну форму на даний момент;
поточні розміри і розрішення екрану;
курсори і шрифти, доступні для використання програмою.
Властивості об’єкта Screen, так як і об’єкта Application, доступні лише в момент виконання програми і недостуні при її проектуванні.
Розглянемо властивості об’єкта Screen.
Властивість Cursor типу TCursor задає форму вказівника мишки для усієї програми.
Властивість Fonts типу TStrings є доступною лише для читання і використовується для роботи зі списком шрифтів, встановлених у системі.
Властивість FormCount типу Integer дає можливість визначити кількість форм програми. Сюди включаються усі створені форми, незалежно від того, видимі вони в даний момент на екрані чи ні.
Властивість Forms[Index:Integer] типу TForm повертає список форм програми. Дана властивість являє собою масив форм, до яких можна звертатись за індексами Index.
Властивість Height типу Integer повертає висоту екранної області у пікселях.
Властивість Width типу Integer повертає висоту екранної області у пікселях. За допомогою двох останніх властивостей можна визначити встановлене на даний момент розрішення монітора.
Буфер обміну даними
Буфер міжпрограмного обміну даними Clipboard широко використовується у Windows. Щоб отримати доступ до цього об’єкту, який інкапсулює методи і властивості для роботи з буфером, необхідно у розділі uses вказати посилання на модуль Clipboard. Як найважливіші властивості об’єкту Clipboard можна виділити наступні.
Властивість AsText типу String розглядає вмістиме буфера як текстову стрічку довжиною до 255 символів. Для обміну з буфером довшими стрічками необхідно використовувати його методи SetTextBuf та GetTextBuf.
Властивість FormatCount типу Integer повертає загальну кількість форматів, які містяться у буфері даних.
Властивість Formats[Index:Integer] типу Word відкриває доступ до даних за форматом, вказаному індексом Index.
Наведемо основні методи об’єкту Clipboard.
Метод Assign (Source:TPersistent) копіює в буфер зображення.
Метод Clear очищує буфер.
Метод Close зменшує на 1 лічильник блокувань буфера і закриває його, якщо лічильник містить 0.
Метод GetTextBuf(Buffer:PChar; BufSize: Integer):Integer копіює з Clipboard не більше BufSize символів у текстовий буфер Buffer і повертає справжню кількість скопійованих символів.
Метод HasFormat(Format:Word):Boolean повертає True, якщо буфер містить дані у форматі Format.
Метод Open збільшує на 1 лічильник блокувань буфера і відкриває його, якщо він ще не був відкритим.
Метод SetTextBuf(Buffer:PChar) поміщає в Clipboard вмістиме текстового буфера Buffer.
Наприклад, щоб помістити в буфер зображення, яке зберігається в об’єкті BitMap (тип TBitMap), необхідно звернутись до методу Assign буфера:
Clipboard.Assign(BitMap);
а для копіювання зображення з буфера – до методу Assign об’єкта, що приймає дане зображення: BitMap.Assign(Clipboard).
Інформаційне вікно
У більшості програм передбачається можливість відкривати спеціальне вікно, яке містить коротку інформацію про назву програмного продукту, його версію, дату випуску, про авторів та інші дані. Як правило, таке вікно називається ”Про програму” або “About”.
Інформаційне вікно створюється за допомогою стандартного шаблону або самостійно.
Щоб створити інформаційне вікно за допомогою шаблону, необхідно звернутись до бази об’єктів (тобто вибрати в головному меню середовища розробки Delphi пункт Tools/ Repository). Після цього на сторінці Forms вибрати шаблон форми AboutBox. В результаті до програми додається нова форма AboutBox з заголовком About. Інший спосіб – це викликати пункт меню File/ New/ Other і у діалоговому вікні Forms вибрати шаблон AboutBox.
Програміст може за власним бажанням змінювати цю форму, видаляти чи заміняти існуючі об’єкти або додавати нові.
Як правило, події елементів, розміщених на даній формі, не використовуються, і обробники подій не створюються, оскільки дане вікно виконує винятково інформаційну функцію. В тому числі не потрібно обробника події натиснення кнопки Ok, оскільки дана форма є модальною.
Розробник програми може і не використовувати шаблон, а створювати інформаційне вікно самостійно. Однак виклик інформаційного вікна на екран переважно здійснюється у модальному режимі, тобто з застосуванням методу ShowModal. Щоб продовжити роботу з програмою, необхідно закрити вікно.
Заставка
Заставкою називається інформаційне вікно, яке виводиться на екран при запуску програми, і яке закривається автоматично або за командою користувача.
Типовою є заставка, яка виводиться у формі вікна, яке не має заголовка і ніяких елементів керування. Дане вікно виводиться по центру екрану і містить малюнок, а деколи кілька рядків пояснювального тексту. Після завантаження заставка автоматично видаляється з екрану і з пам’яті.
Щоб створити заставку, необхідно при проектуванні програми створити вікно заставки, тобто доповнити програму ще однією формою і вставити в неї потрібний малюнок чи текст.
Після цього необхідно визначити деякі ключові властивості для даної форми. Програмно або через Інспектор об’єктів встановлюються такі властивості форми:
Position:=poScreenCenter; {розміщення форми по центру екрану}
FormStyle:=fsStayOnTop; { розміщення форми поверх усіх вікон}
Caption:=’’; {очищення заголовка форми}
BorderStyle:=bsNone; {видалення рамки}
BorderIcon:=[]; {видалення усіх кнопок і піктограм з заголовка вікна}
Екземпляр форми-заставки створюється у файлі проекту відразу ж після ініціалізації програми. Після цього відбувається відображення заставки на екрані за допомогою методів Show і Update.
Після створення головної форми заставка робиться невидимою і видаляється з пам’яті, оскільки вона більше не буде використовуватись. З цією метою у файлі проекту для форми-заставки викликаються методи Hide та Free. Часто вводять часову затримку для того, щоб заставка відразу не зникала після створення головної форми.
Малюнок, який міститься в заставці, рекомендується завантажувати безпосередньо при її відображенні на екрані, щоб розмір виконавчого файлу надто не збільшувався.