Все, що ви не знали, але хотіли б дізнатися про Delphi Початок Директиви компіляції (rdelphi) Розсилка
Як зробити власні повідомлення при компіляції
Як дізнатися версію компілятора?
Які є директиви компілятора?
і - директиви контролю введення/виводу і - директиви, що визначають розмір стека
і - директиви інформації часу виконання про типи і - директиви перевірки переповнення цілих операцій
- Директива зв'язування ресурсів
та - директиви перевірки діапазону
- Директива створення консольної програми
1) Директиви компілятора, які дозволяють або забороняють перевірку тверджень.За промовчанням або Область дії локальна
Директиви компілятора $C дозволяють або забороняють перевірку тверджень. Вони впливають на роботу процедури Assert, яка використовується при налагодженні програм. За умовчанням діє директива і процедура Assert генерує виняток EAssertionFailed , якщо твердження, що перевіряється хибно. Оскільки ці перевірки використовуються лише в процесі налагодження програми, то перед її остаточною компіляцією слід вказати директиву. При цьому робота процедур Assert буде блокована і генерація винятків EassertionFailed не проводитиметься. Директиви діють на весь файл вихідного коду незалежно від того, де вони розміщені.
2) Директиви компілятора, що включають та вимикають контроль файлового введення-виводу.За промовчанням або Область дії локальна
Директиви компілятора $I включають або вимикають автоматичний контроль результату виклику процедур введення-виведення Object Pascal . Якщо діє директива , то при поверненні процедурою введення-виведення ненульового значення генерується виняток EInOutError і в його властивість errorcode заноситься код помилки. Таким чином, при діючій директивіоперації введення-виведення розташовуються в блоці try . except, що має обробник виключення EInOutError. Якщо такого блоку немає, обробка проводиться методом TApplication.HandleException . Якщо діє директива, то виняток не генерується. У цьому випадку перевірити, чи була помилка, або її не було, можна, звернувшись до функції IOResult . Ця функція очищає помилку та повертає її код, який потім можна аналізувати. Типове застосування директиви та функції IOResult демонструє наступний приклад:
AssignFile (F,s); Rewrite (F);
i:=IOResult ;ifi <> 0thencaseiof2 : . 3: .end; У цьому прикладі на час відкриття файлу відключається перевірка помилок введення виведення, потім вона знову включається, змінною i надається значення, що повертається функцією IOResult і, якщо це значення не дорівнює нулю (є помилка), то робляться якісь дії залежно від коду помилки. Подібний стиль програмування типовий до введення в Object Pascal механізму обробки винятків. Однак зараз, мабуть, подібний стиль застарів і застосування директив $I втратило колишнє значення.
3) Директиви компілятора, що визначають розмір стекаЗа замовчуванням Область дії глобальна
Локальні змінні у процедурах та функціях розміщуються у стеку програми. При кожному виклику процедури або функції локальні змінні розміщуються в стек. При виході з процедури або функції, ці локальні процедури видаляються зі стека. Директиви компілятора $M задають параметри стека програми: його мінімальний та максимальний розміри. Додаток завжди гарантовано має розмір стека, що дорівнює його мінімальній величині. Якщо під час запуску Windows виявляє, що неможе виділити цей мінімальний обсяг пам'яті, видається повідомлення про цю помилку. Якщо під час роботи з'ясовується, що мінімального розміру стека не вистачає, то розмір збільшується на 4 K, але не більше ніж до встановленого директивою максимального розміру. Якщо збільшення розміру стека неможливе через брак пам'яті або досягнення його максимальної величини, генерується виняток EStackOverflow . Мінімальний розмір стека за промовчанням дорівнює 16384 (16K). Цей розмір може змінюватися параметром minstacksize директиви або параметром number директиви. Максимальний розмір стека за промовчанням дорівнює 1,048,576 (1M). Цей розмір може змінюватися параметром maxstacksize директиви або параметром number директиви. Значення мінімального розміру стека може задаватися цілим числом в діапазоні між 1024 і 2147483647. Значення максимального розміру стека має бути не менше мінімального розміру і не більше 2147483647. Директиви завдання розміру стека можуть включатися тільки в програму і не повинні використовуватися в бібліотеках.
Delphi 1 є процедура компілятора , що здійснює перемикання контролю переповнення стека. Тепер цей процес повністю автоматизований і директива залишена лише зворотної сумісності.
4) Директиви компілятора, що включають і вимикають генерацію інформації часу виконання типів ( runtime type information - RTTI).За промовчанням або Область дії локальна
Директиви компілятора $M включають або вимикають генерацію інформації часу виконання типів ( runtime type information - RTTI). Якщо клас оголошується в стані або є похідним від класу оголошеного в цьому стані, то компілятор генерує RTTI про його поля, методи та властивості, оголошені в розділіpublished. А якщо ні, то розділ published в класі не допускається. Клас TPersistent , що є попередником більшості класів Delphi і всіх класів компонентів, оголошений в модулі Classes в стані . Тож для всіх класів, похідних від нього, дбати про директиву не доводиться.
5) Директиви компілятора, що включають і вимикають перевірку переповнення при цілих операціяхЗа умовчанням або Область дії локальна
Директиви компілятора $Q включають або вимикають перевірку переповнення при цілих операціях. Під переповненням розуміється отримання результату, який може зберігатися у регістрі комп'ютера. При включеній директиві перевіряється переповнення при цілих операціях +, -, *, Abs, Sqr, Succ, Pred, Inc і Dec. Після кожної з цих операцій розміщується код здійснює відповідну перевірку. Якщо виявлено переповнення, то генерується виняток EIntOverflow. Якщо цей виняток не може бути оброблений, виконання програми завершується. Директиви $Q перевіряють лише результат арифметичних операцій. Зазвичай вони використовуються спільно з директивами, що перевіряють діапазон значень при присвоєння. Директива уповільнює виконання програми та збільшує її розмір. Тому вона використовується тільки під час налагодження програми. Однак, треба усвідомлювати, що відключення цієї директиви призведе до появи помилкових результатів розрахунку у випадках, якщо переповнення дійсно відбудеться під час виконання програми. Причому повідомлень про подібні помилки не буде.
6) Директиви компілятора, що включають і вимикають перевірку діапазону цілих чисел і індексівЗа умовчанням або Область дії локальна
Директиви компілятора $Rвключають або вимикають перевірку діапазону цілісних значень та індексів. Якщо включена директива , всі індекси масивів і рядків і всі присвоєння скалярним змінним і змінним з обмеженим діапазоном значень перевіряються на відповідність значення припустимому діапазону. Якщо вимоги діапазону порушені або значення, що присвоюється, занадто велике, генерується виняток ERangeError . Якщо його неможливо перехопити, виконання програми завершується. Перевірка діапазону довгих рядків типу Long strings не проводиться. Директива уповільнює роботу програми та збільшує її розмір. Тому вона зазвичай використовується лише під час налагодження.
6) Директива компілятора, що пов'язує з виконуваним модулем файли ресурсівОбласть дії локальна
Директива компілятора вказує файли ресурсів (.DFM, .RES), які мають бути включені у модуль або бібліотеку. Вказаний файл має бути файлом ресурсів Windows. За промовчанням розширення файлів ресурсів - .RES. У процесі компонування компільованої програми або бібліотеки файли, зазначені в директивах , копіюються у модуль, що виконується. Компонувальник Delphi шукає ці файли спочатку в тому каталозі, в якому розташований модуль, що містить директиву , а потім у каталогах, вказаних при виконанні команди головного меню Project Options на сторінці Directories / Conditionals діалогового вікна в опції Search path або в опції /R командного рядка DCC32 . При генерації коду модуля, що містить форму, Delphi автоматично включає файл . pas директиву , що забезпечує компонування файлів ресурсів форм. Цю директиву не можна видаляти з тексту модуля, оскільки в іншому випадку завантажувальний модуль не буде створений і генерується виняток EResNotFound .
Всівстановлені в налаштуваннях опції компіляції можна вставити безпосередньо в текст програми, натиснувши клавіші Ctrl-O , O
Як зробити власні повідомлення при компіляції ?
destructorTumbSelectionTempTable.Destroy ;begin// Clear the temp tables.ClearAllOuterWorldFold ;ifFSubjectsTempTableCreatedthenDropTempTable ( FTableName );
FOuterWorldsFolded.Free; FQuery.Free;inherited;end;
Працює тільки у Дельфі 6/7
Як дізнатися версію компілятора?
Іноді треба виконати різний код залежно від версії Дельфі, особливо актуально це при розробці компонентів та модулів, які використовуються в різних додатках.
У Дельфі визначено спеціальні константи компіляції для цього:
Ver80- Дельфі 1Ver90- Дельфі 2Ver93- З Buider 1Ver100- Дельфі 3Ver110- З Buider 3Ver120- Дельфі 4Ver125- З Buider 4Ver130- Дельфі 5Ver140- Дельфі 6Ver150- Дельфі 7
procedureTForm1.Button2Click( Sender : TObject );constVersion=