Delphi замітки програміста

Delphi: нотатки програміста. Частина 1

Відомо, що Delphi створює безліч файлів з розширеннями pas, dfm, dpr і т.д. Зазвичай програміста цікавлять файли коду (pas) і опису форм (dfm), а інші залишаються поза його увагою, а даремно - вони несуть важливу інформацію, яку можна (а в ряді випадків - потрібно) змінювати.

Почнемо з файлу проекту (dpr). Фактично він містить власне програму. в той час як пов'язані з проектом численні файли форм і DLL є підпрограми.

Структура файлу проекту, що містить єдину форму, така, як показано в лістингу 1.

Проект (програма) починається зверненням до методу Initialize глобального об'єкта Application і закінчується після завершення його методу Run. Цей метод - центральний: він візуалізує головну форму додатку і здійснює диспетчеризацію повідомлень Windows. Від того, яка робота виконується рядками коду, розташованими перед зверненням до нього, залежать час завантаження програми, і вид екрану до появи головного вікна.

Метод Initialize передбачений, так би мовити, про всяк випадок і за замовчуванням нічого не здійснює. Щоб змусити його працювати, слід помістити покажчик на відповідну процедуру без параметрів в глобальну змінну InitProc. Це можна зробити в секції ініціалізації будь-якого модуля (код цих секцій активізується до початку роботи основної програми) або безпосередньо в тілі головного проекту (лістинг 2):

Зрозуміло, в цьому останньому випадку буде простіше в першому операторі основної програми явно звернутися до процедури Init. Взагалі кажучи, в переважній більшості випадків оператор Application.Initialize можна видалити без будь-яких наслідків для програми.

Скорочення часу завантаження

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

За замовчуванням в перемикачі Auto create forms (викликається за допомогою опції Project | Options середовища Delphi) на закладці Preference вікна Tools | Environment встановлений прапорець, що змушує Delphi поміщати будь-яку нову форму в список Auto-create forms і формувати відповідний оператор звернення до CreateForm в файлі проекту. Якщо очистити цей перемикач перед початком роботи над проектом або перенести непотрібні форми в список Available forms вікна Project | Options. можна істотно (іноді - в десятки разів) скоротити час завантаження програми.

Вид екрану до появи головного вікна

У наводиться нижче лістингу 3 (приклад запозичений з довідкової системи Delphi) в програмі створюється 5 вікон. У формі Form5 є індикатор ProgressBar1. за допомогою якого візуалізується процес завантаження програми, точніше - створення інших вікон.

Захист програми паролем

Пробні версії програм

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

Про перенесення проекту в іншу папку

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

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

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

Різноманітимо висновок повідомлень

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

Окремі поля структури TLogFont для функції CreateFontIndirect мають наступний сенс:

lfHeight - висота шрифту в пунктах (1 пункт = 1/72 дюйма); якщо більше 0 - визначає висоту «знакі-місця» (з урахуванням виступаючих над заголовних символом елементів в буквах Е, Й); якщо менше 0 - визначає висоту «чистого» символу, якщо дорівнює 0 - висоту вибирає Windows;

lfWidth - середня ширина символу; якщо дорівнює 0 - ширину встановлює Windows;

lfEscapment - кут нахилу базової лінії тексту в десятих частках градуса щодо горизонтального напрямку; позитивні значення - поворот по годинникової стрілки; в Windows 95/98 збігається з lfOrientation;

lfOrientation - кут нахилу символів по відношенню до базової лінії; в Windows NT для шрифтів True Type може відрізнятися від lfEscapment; для цього слід встановити режим пристрою відображення рівним gm_Advanced (за замовчуванням встановлюється gm_Compatible);

lfWeight - щільність шрифту (fm_DontCare = 0 - щільність вибирає Windows; fm_Thin = 100 - дуже тонкий шрифт; fm_ExtraLight = 200 - дуже світлий; fm_Light = 300 - світлий; fm_Normal = 400 - нормальний; fm_Medium = 500 - потовщений; fm_SemiBold = 600 - напівжирний; fm_Bold = 700 - жирний; fm_ExtraBold = 800 - посилений; fm_Heavy = 900 - важкий);

lfItalic, lfUnderline, lfStrikeOut - нульове значення означає відповідно похилий, перекреслений і підкреслений шрифт;

lfCharSet - набір символів (ANSI_CharSet = 0; Default_CharSet = 1; Symbol_Char-Set = 2; ShiftJis_CharSet = 128; OEM_CharSet = 255);

lfOutPrecision - точність представлення шрифту; рекомендується Out_TT_Prec (вибирає True Type і векторні шрифти, якщо є кілька різновидів однойменних шрифтів) або Out_TT_Only_Prec (тільки True Type);

lfClipPrecision - визначає точність відсікання написи межами області промальовування (Clip_Character_Precis. Clip_Embedded, Clip_Mask, Clip_TT_Always, Clip_Default_Precis - рекомендується, Clip_LH_Angles. Clip_Stroke_Precis);

lfQuality - визначає якість промальовування (Default_Quality, Draft_Quality, Proof_Quality);

lfPitchAndFamily - в чотирьох молодших розрядах вказується тип шрифту, в чотирьох старших - його сімейство;

lfFaceName - ім'я гарнітури шрифту.

На рис. 2 показаний приклад виведення похилими шрифтами, створеними функцією CreateFontIndirect.

Як реалізований цей приклад, показано в лістингу 6.

Параметр Format функції DrawText може містити один або кілька прапорів (табл. 2).

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

Параметр Options функції ExtTextOut може бути комбінацією наступних значень:

eto_Clipped - текст буде відсікатися межами Rect;

eto_Gliph_Index - блокує обробку мовним драйвером;

eto_Opaque - фон перемальовується заново;

eto_RTLReading - висновок для читання справа наліво.

При виведенні тексту стандартними методами TCanvas завжди заново промальовується фон символів (колір фону повертає функція GetBkColor). Якщо колір фону символів відрізняється від фону канви, висновок супроводжується неприємними побічними ефектами. Якщо в прикладі з лістингу 6 для форми залишити стандартний колір clFaceBtn, вікно виведення буде таким, як на рис. 3.

Звичайно, за допомогою функції SetBkColor можна встановити, щоб колір форми збігався з кольором канви, проте це не завжди можливо. Для прикладу на рис. 4 показаний екран, який традиційно створюють багато програм установки Setup.exe. Фон на такому екрані не залишається постійним, а плавно переходить від інтенсивного синього до чорного. Ясно, що встановити змінний колір функцією SetBkColor неможливо. Більш того, великі написи програм Setup.exe також традиційно виводяться потовщеним похилим шрифтом Times New Roman білими буквами з чорною тінню. Реалізувати подібний ефект досить просто. Так, потрібно взагалі відмовитися від промальовування фону, встановивши за допомогою функції SetBkMode режим Transparent. і вивести напис двічі: перший раз чорним кольором, а другий - білим, змістивши другий напис трохи вліво і вгору щодо першої. Лістинг 7 ілюструє сказане:

На рис. 4 показано вікно працюючої програми.

Включення в бібліотеку форм

У наступних прикладах ілюструється техніка включення в DLL форми і використання її в зухвалій програмі (листинги 8. 9 і 10).

Модуль форми DLLForm. вміщеній в DLL, посилається на стандартний модуль Forms і, таким чином, отримує свій глобальний об'єкт Application. який нічого «не знає» про глобальне об'єкті викликає програми. У режимі модального виклику це не має особливого значення, оскільки модальне вікно блокує роботу зухвалої програми. У режимі немодального виклику слід синхронізувати дії об'єктів, в іншому випадку мінімізація головного вікна, наприклад, не призведе до мінімізації вікна DLL. Синхронізація досягається тим, що дескриптор об'єкта Application DLL замінюється відповідним дескриптором викликає програми.

Додаткову інформацію Ви можете отримати в компанії Interface Ltd.

Схожі статті